简介
MyBatis-Plus(简称MP )是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。
从这张图中我们可以看出MP旨在成为MyBatis的最好搭档,而不是替换MyBatis,所以可以理解为MP是MyBatis的一套增强工具,它是在MyBatis的基础上进行开发的,我们虽然使用MP但是底层依然是MyBatis的东西,也就是说我们也可以在MP中写MyBatis的内容。
标准数据层开发
1.标准CRUD使用
对于标准的CRUD功能MP提供了这些方法可以使用。
创建一个user实体类
@Data @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private String password; private Integer age; private String tel; }
创建一个userdao接口
@Mapper public interface UserDao extends BaseMapper<User> { }
在测试类中测试
SpringBootTest class MybatisplusApplicationTests { @Autowired private UserDao userDao; //新增 @Test void testsave() { User user=new User(); user.setName("zhang"); user.setPassword("111"); user.setAge(11); user.setTel("1112"); userDao.insert(user); } //删除 @Test void testdelete(){ userDao.deleteById(1645347976381272065L); } //修改 @Test public void testupdate(){ User user=new User(); user.setId(1L); user.setName("lisi"); userDao.updateById(user); } //查询 @Test public void testGetAll(){ List<User> userList= userDao.selectList(null); System.out.println(userList); }
分页功能
分页查询使用的方法是:
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
IPage:用来构建分页查询条件
Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage
IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page。
调用方法传入参数获取返回值
@SpringBootTest class Mybatisplus01QuickstartApplicationTests { @Autowired private UserDao userDao; //分页查询 @Test void testSelectPage(){ //1 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数 IPage<User> page=new Page<>(1,3); //2 执行分页查询 userDao.selectPage(page,null); //3 获取分页结果 System.out.println("当前页码值:"+page.getCurrent()); System.out.println("每页显示数:"+page.getSize()); System.out.println("一共多少页:"+page.getPages()); System.out.println("一共多少条数据:"+page.getTotal()); System.out.println("数据:"+page.getRecords()); } }
设置分页拦截器
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //1 创建MybatisPlusInterceptor拦截器对象 MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor(); //2 添加分页拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } }
如果想查看MP执行的SQL语句,可以修改application.yml配置文件
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL日志到控制台
DQL编程控制
1.条件查询方式
需求:查询数据库表中,年龄在10岁到30岁之间的用户信息
@SpringBootTest class Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(User::getAge, 30); lqw.gt(User::getAge, 10); List<User> userList = userDao.selectList(lqw); System.out.println(userList); } }
gt:大于(>),最终的SQL语句为
SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)
需求:查询数据库表中,年龄小于10或年龄大于30的数据
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
or()就相当于我们sql语句中的or关键字,不加默认是and,最终的sql语句为:
SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)
null的判断
private UserDao userDao; @Test void testGetAll(){ //模拟页面传递过来的查询数据 UserQuery uq = new UserQuery(); uq.setAge(10); uq.setAge2(30); LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(null!=uq.getAge2(),User::getAge, uq.getAge2()); lqw.gt(null!=uq.getAge(),User::getAge, uq.getAge()); List<User> userList = userDao.selectList(lqw); System.out.println(userList); } }
2.查询投影
@SpringBootTest class Mybatisplus02DqlApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll(){ LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.select(User::getId,User::getName,User::getAge); List<User> userList = userDao.selectList(lqw); System.out.println(userList); } }
3.查询条件设定
聚合函数查询:
count:总记录数
max:最大值
min:最小值
avg:平均值
sum:求和
范围匹配(> 、 = 、between)
模糊匹配(like)
空判定(null)
包含性匹配(in)
分组(group)
排序(order)
gt():大于(>)
ge():大于等于(>=)
lt():小于(<)
lte():小于等于(<=)
between():between ? and ?
like():前后加百分号,如 %J%
likeLeft():前面加百分号,如 %J
likeRight():后面加百分号,如 J%
4.字段映射与表名映射
ID生成策略对比
介绍了这些主键ID的生成策略,我们以后该用哪个呢?
NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设
置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很
多判定,实现起来比较复杂
AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用
ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符
串,长度过长占用空间而且还不能排序,查询性能也慢
ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是
生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键
综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明
智的选择。
多记录操作
根据传入的id集合将数据库表中的数据删除掉(删除(根据ID 批量删除),参数是一个集合,可以存放多个id值。)。
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testDelete(){ //删除指定多条数据 List<Long> list = new ArrayList<>(); list.add(1402551342481838081L); list.add(1402553134049501186L); list.add(1402553619611430913L); userDao.deleteBatchIds(list); } }
逻辑删除
逻辑删除的本质其实是修改操作。如果加了逻辑删除字段,查询数据时也会自动带上逻辑删除字段。
执行的SQL语句为:UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0
美好的一天到此结束,下次继续努力!