Mybatis-Plus
前期准备
Mybatis-Plus简述
Mybatis-Plus是基于Mybatis的数据库操作组件,其实现的功能完全是Mybatis的功能拓展,不改变Mybatis的使用方式,可以兼容Mybatis的操作方式。
创建一个数据库、一个表进行基础操作:
CREATE DATABASE mybatis_plus
CREATE TABLE `user`(
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(id)
)
INSERT INTO USER(id, NAME, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com')
创建一个Spring项目,项目通过Spring Initlizer创建,不导入任何依赖包,在POM.xml文件中进行依赖导入。
依赖导入
分别导入mybatis-plus、数据库驱动、lombok依赖
<!-- Mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<!-- mysql驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok简化开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
配置数据库信息
在自动生成的resource文件夹下的application.properties配置文件中配置数据库信息:
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=123456
创建对应于数据库表的实体类:entity/User
//@Data注解用于简易生成get和set方法
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
创建Mybatis用于操作User表的的映射接口:mapper/Usermapper
//使接口继承BaseMapper<>并指明实体类,可以直接使用其中定义的方法,注意这样必须在主类中添加MapperScan注解
//也可以添加到配置类中
@Repository
public interface UserMapper extends BaseMapper<User> {
}
在主类上添加MapperScan注解
@SpringBootApplication
@MapperScan("com.qinghe.demomptest.mapper")
public class DemomptestApplication {
public static void main(String[] args) {
SpringApplication.run(DemomptestApplication.class, args);
}
}
测试调用获取全部数据的方法:
@SpringBootTest
class DemomptestApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void findAll() {
//注意selectList()中传入的是条件,nulll代表没有条件
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
}
获取结果:
[User(id=1, name=Jone, age=18, email=test1@baomidou.com), User(id=2, name=Jack, age=20, email=test2@baomidou.com), User(id=3, name=Tom, age=28, email=test3@baomidou.com), User(id=4, name=Sandy, age=21, email=test4@baomidou.com), User(id=5, name=Billie, age=24, email=test5@baomidou.com)]
添加sql输出日志
在application.properties中添加如下配置信息:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这之后在执行sql后会在控制台输出sql的执行结果以及生成的sql语句,方便于排错与高效开发。+
Mybatis-Plus实现基础操作与其基本原理
添加操作的实现
@Test
public void testAdd() {
User user = new User();
user.setName("Maria");
user.setAge(30);
user.setEmail("Maria@qq.com");
int insert = userMapper.insert(user);
System.out.println(insert);
}
插入结果为:
1661768561988714498 Maria 30 Maria@qq.com
我们没有设置id的值,但是Mybatis-Plus帮我们进行了设置,这就是Mybatis-Plus的主键生成策略,我们可以使用注解来选用不同的主键生成策略:
在主键的属性上面添加注解:
//生成一个19位的唯一随机数作为主键值(雪花策略)
@TableId(type = IdType.ASSIGN_ID)
//生层一个随机数的值作为主键值
@TableId(type = IdType.ASSIGN_UUID)
//设置主键值自增
@TableId(type = IdType.AUTO)
//需要手动设置主键值
@TableId(type = IdType.INPUT)
//不使用任何策略
@TableId(type = IdType.NONE)
雪花策略:
使用1位符号、41位时间戳、10位工作进程(5数据+5机器id)、12位随机序列号
保证绝对不会出现重复以及高效率,一般都使用ASSIGN_ID策略,也就是默认的这个策略。
修改操作的实现
通过调用userMapper.updateById()来进行属性值的修改,使用.updateById的方式进行修改,可以通过传入user对象的方式来进行修改方法底层会自动根据user对象的id与其属性值进行修改
@Test
public void testUpdate() {
User user = new User();
user.setId(1661768561988714498L);
user.setName("Maria666");
//使用.updateById的方式进行修改,可以通过传入user对象的方式来进行修改
//方法底层会自动根据user对象的id与其属性值进行修改
int count = userMapper.updateById(user);
System.out.println(count);
}
Mybatis-Plus实现自动填充
在测试数据库表中添加两个属性create_time和update_time,其数据类型为datetime,在实体类中也添加对应属性(注意在实体类中使用驼峰试命名、在数据库中使用下划线进行命名)这两个属性分别是在插入时设置内容以及在插入和数据修改时设置内容。
要实现插入和修改时自动填充内容的功能,我们在要进行设置的属性中添加注解@TableField(fill = FieldFill.xxx)
例如下面这样:
//设置其在什么时候设置内容(insert代表插入即第一次时设置内容)
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//INSERT_UPDATE代表在插入以及修改的时候设置内容
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
这个注解要配合handler中的方法使用,创建一个handler类并实现MetaObjectHandler接口(mybatis-plus中的接口):
//使用Spring的自动配置
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//insertFill方法会在插入时执行。
@Override
public void insertFill(MetaObject metaObject) {
//这个方法中,第一个参数是要设置的属性名、第二个参数是设置的内容,第三个是固定要传入的对象,也是这个方法的形参
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
乐观锁
乐观锁适用于希望自己在更新一条记录时,这条记录不会被其他人更新的情况(线程安全)。
乐观锁通过加入版本的方式控制线程,若事务在开启时与结束时检查版本一致,则允许修改并更新版本号,若不一致则不允许修改(说明有其他事务也在对其进行修改)
在数据库表中添加一个属性version,类型为int,同时在实体类中也添加该属性并在其上添加@Versioin注解。
//乐观锁的版本属性
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
之后创建一个配置类(config.MpConfig),在配置类中添加乐观锁插件的代码:
@Configuration
@MapperScan("com.qinghe.demomptest.mapper")
public class MpConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
测试,先查询再修改:
@Test
public void testOptimsiticLocker() {
//根据id查询
User user = userMapper.selectById(1662022315828776962L);
//修改,注意不需要手动设置Version的变化,Mybatis-Plus在底层已经帮忙实现了这个功能
user.setName("LiSA");
userMapper.updateById(user);
}
此时version会自动+1
复杂查询功能在Mybatis-Plus的实现
多id批量查询
使用userMapper.selectBatchIds(Collection)进行查询:
@Test
public void testSelect1() {
//这样的List传进去会自动把id为1,2,3,4的数据查询出来
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4));
System.out.println(users);
}
复杂条件查询,向形参中传入map键值对进行查询(userMapper.selectByMap()):
@Test
public void testSelect2() {
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("name", "Jack");
columnMap.put("age", 20);
List<User> users = userMapper.selectByMap(columnMap);
System.out.println(users);
}
但以上两种方式都不常用,常用的是条件构造器方式进行查询。
分页查询
在配置类中引入分页查询的依赖
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
方法测试:
@Test
public void testSelectPage() {
//分页的使用,创建一个Page对象,其中要传入两个数,第一个数是当前页,第二个数是每一页的页面大小
Page<User> page = new Page(1, 3);
//调用selectPage方法进行分页查询,再通过调用userPage来获取页面的相关信息
Page<User> userPage = userMapper.selectPage(page, null);
//获取总页数
long pages = userPage.getPages();
//获取当前页码
long current = userPage.getCurrent();
//获取当前页的数据集合
List<User> records = userPage.getRecords();
//获取总记录数
long total = userPage.getTotal();
//当前页是否有下一页
boolean next = userPage.hasNext();
//当前页是否有上一页
boolean previous = userPage.hasPrevious();
}
删除操作
使用.deleteById实现删除操作
@Test
public void testDeleteById() {
int result = userMapper.deleteById(1L);
System.out.println(result);
}
使用.deleteBatchIds()实现批量删除
int result = userMapper.deleteBatchIds(Arrays.asList(1, 2,3));
简单条件删除,使用.deleteByMap(Map),相当于给删除添加Where语句,与修改那里一样,就是变成delete
-
逻辑删除
物理删除是指将记录从数据库中真正删除,逻辑删除是指给字段上一个标志位,标志位为0代表正常,标志位为1代表其在逻辑上被删除了
在数据表中添加deleted字段,类型为int
Mybatis-Plus中默认1为逻辑上删除了,0为逻辑上没有删除,可以通过配置进行修改:
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
在实体类中添加注解:
//逻辑是否删除的注解
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
添加了注解之后、所有的删除语句就会变成Update并将deleted标签更改为1的语句,从而实现逻辑删除。
而配置了逻辑删除情况的Mybatis-Plus在进行查询时会自动添加wehre deleted = 0也就是说逻辑删除的语句不会被查询到,但其在数据库物理中确实存在。
条件构造器
当需要进行一些复杂的数据库操作时,要用到条件构造器(wrapper)。
gt、ge、le、lt、isNul、isNotNull
gt(greater than‘大于)、ge(greater equal 大于等于)、le(less equal 小于等于)、lt(less than 小于)
@Test
public void testWapper() {
//创建一个Wrapper条件构造器,注意QueryWrapper是条件构造器的扩展
QueryWrapper<User> queryWrapper = new QueryWrapper();
//设置条件构造器的条件,.ge是大于等于(greaterequal)
queryWrapper.ge("age", 21);
//调用selectList并传入条件构造器来获取列表
List<User> users = userMapper.selectList(queryWrapper);
System.out.println(users);
}
eq、ne
eq(等于)、ne(not equal 不等于)
queryWrapper.eq("name", "LiSA");
between、notBetween
queryWrapper.between("age", 24, 40);
模糊查询 like、notLike、likeLeft、likeRight
like代表只要有这个字符就查出来(%张%)
notLike代表没有这个字符
likeLeft代表以模糊的字符为结尾(%张)、likeRight代表以模糊的字符为开头(张%)文章来源:https://www.toymoban.com/news/detail-465738.html
queryWrapper.likeLeft("name", "A");
OrderBy、orderByDesc、orderByAsc
orderByAsc 升序排列、orderByDesc 降序排列文章来源地址https://www.toymoban.com/news/detail-465738.html
queryWrapper.orderByAsc("id");
到了这里,关于【Mybatis-Plus】Mybatis-Plus快速入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!