1.简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.MyBatis简单案例
添加依赖
spring-boot-starter、spring-boot-starter-test
添加:mybatis-plus-boot-starter、MySQL、lombok、在项目中使用Lombok可以减少很多重复代码的书写。比如get/set/toString等方法的编写
这里要使用lombok得安装lombok插件。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<!--简化get/set方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.application.paoperties配置
这是MySQL8以上及SpringBoot2.1以上版本的配置
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123
MySQL5及Spring Boot2.1的配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus
spring.datasource.username=root
spring.datasource.password=123
4.主程序和实体类
-
主程序类中加入注解MapperScan(mapper路径),若不加入该注解会报错
/*扫描mapper接口*/ @MapperScan("mapper")
-
实体类属性为数据表中的属性,加入注解@Data,会自动创建get/set/toString方法
5.mapper接口
package mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
mapper接口继承BaseMapper
Mybatis-Plus完成了BaseMapper接口提供的方法的SQL语句的生成操作。
6.测试
可在test包下编写测试主程序:
package com.atguigu.mpdemo1010;
import entity.User;
import mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class Mpdemo1010ApplicationTests {
@Autowired
private UserMapper userMapper;
//查询
@Test
void find() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
}
运行find()方法,控制台输出User表中的数据。
7.配置日志
配置了日志之后可以看到数据库具体做的操作。配置到application.properties中。
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
可看到mp创建了SqlSession,执行语句:SELECT id,name,age,email FROM user ;
8.主键策略
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
分布式系统唯一ID生成方案汇总 – nick hao – 博客园 (cnblogs.com)
9.add和updateById
@Test
public void addUser() {
User user = new User();
user.setAge(18);
user.setName("bob");
user.setEmail("look@.com");
int insert = userMapper.insert(user);
System.out.println(insert);
}
@Test
public void updateUser() {
User user = new User();
user.setId(3L);
user.setAge(100);
int num = userMapper.updateById(user);
System.out.println(num);
}
10.mp的自动填充
不需要set到对象里面,使用mp方式实现数据添加。
步骤:
1.往user表添加两个字段create_time和update_time
2.实体类中也加入添加的字段
3.实体类添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
4.创建实现类,实现接口MetaObjectHandler
package handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/*表示这个类交给SpringBoot管理*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用mp进行insert操作,这个方法就会执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("creatTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//使用mp进行update操作,这个方法就会执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
注意MyMetaObjectHandler类需要添加注解@Component(@Component实例化到spring容器中)
11.乐观锁
解决丢失更新问题
例:两个用户同时修改某一信息,后提交数据进行 了覆盖。
-
解决方案:
-
悲观锁:只允许一个用户操作
-
乐观锁:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
- 官方配置:官方配置地址
-
12.复杂的条件查询
采用QueryWrapper
步骤:
-
创建QueryWrapper对象
-
调用方法实现各种条件查询
@Test public void testSelectQuery() { //创建QueryWrapper对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通过QueryWrapper设置条件 //ge,gt,le,lt (大于等于、大于、小于等于、小于) wrapper.ge("age",30);//查询age>=30的记录 //List<User> users = userMapper.selectList(wrapper); //System.out.println(users); //eq,ne (等于、不等于) wrapper.eq("name","bob"); // List<User> users = userMapper.selectList(wrapper); //System.out.println(users); //between wrapper.between("age",20,30);//年龄在20到30 //like模糊查询 wrapper.like("name","沈"); //last wrapper.last("limit 1");//只查一条数据 List<User> users = userMapper.selectList(wrapper); System.out.println(users); }