MybatisPlus语法

您所在的位置:网站首页 querywrapper大于小于 MybatisPlus语法

MybatisPlus语法

#MybatisPlus语法 | 来源: 网络整理| 查看: 265

MyBatisPlus入门案例与简介

MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发,提高效率

开发方式

基于MyBatis使用MyBatisPlus

基于Spring使用MyBatisPlus

基于SpringBoot使用MyBatisPlus(重点)

步骤一:创建数据库和表

1234567891011CREATE TABLE user ( id bigint(20) primary key auto_increment, name varchar(32) not null, password varchar(32) not null, age int(3) not null , tel varchar(32) not null);insert into user values(1,'Tom','tom',3,'18866668888');insert into user values(2,'Jerry','jerry',4,'16688886666');insert into user values(3,'Jock','123456',41,'18812345678');insert into user values(4,'略略略','nigger',15,'4006184000');

步骤二:创建SpringBoot工程

只需要勾选MySQL,不用勾选MyBatis了

步骤三:补全依赖

导入德鲁伊和MyBatisPlus的坐标

1234567891011XML com.baomidou mybatis-plus-boot-starter 3.4.1 com.alibaba druid 1.1.16

步骤四:编写数据库连接四要素

还是将application的后缀名改为yml,以后配置都是用yml来配置

注意要设置一下时区,不然可能会报错(指高版本的mysql)

12345678910111213YMLspring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC username: root password: YOUSONOFABTICH.# mybatis的日志信息mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl步骤五:

步骤五:根据数据表来创建对应的模型类

注意id是Long类型,至于为什么是Long,接着往下看

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758public class User { private Long id; private String name; private String password; private Integer age; private String tel; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", age=" + age + ", tel='" + tel + '\'' + '}'; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; }}

步骤六:创建dao接口

123@Mapperpublic interface UserDao extends BaseMapper{} MyBatisPlus简介

MyBatisPlus的官网为:https://mp.baomidou.com/ ,没错就是个拼音,苞米豆,因为域名被抢注了,但是粉丝也捐赠了一个 https://mybatis.plus 域名

MP旨在成为MyBatis的最好搭档,而不是替换掉MyBatis,从名称上来看也是这个意思,一个MyBatis的plus版本,在原有的MyBatis上做增强,其底层仍然是MyBatis的东西,所以我们当然也可以在MP中写MyBatis的内容

对于MP的深入学习,可以多看看官方文档,锻炼自己自学的能力,毕竟不是所有知识都有像这样的网课,更多的还是自己看文档,挖源码。

MP的特性:

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere ) 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作 小结

SpringBoot集成MyBatisPlus非常的简单,只需要导入MyBatisPlus的坐标,然后令dao类继承BaseMapper,写上泛型,类上方加@Mapper注解

可能存在的疑问:

我甚至都没写在哪个表里查,为什么能自动识别是在我刚刚创建的表里查?

注意我们创建的表,和对应的模型类,是同一个名,默认情况是在同名的表中查找

那我要是表明和模型类的名不一样,那咋整?

在模型类的上方加上

@TableName注解

例如数据表叫tb_user但数据类叫User,那么就在User类上加@TableName("tb_user")注解 标准数据层开发标准的CRUD使用

先来看看MP给我们提供了哪些方法

功能 自定义接口 MP接口 新增 boolean save(T t) int insert(T t) 删除 boolean delete(int id) int deleteById(Serializable id) 修改 boolean update(T t) int updateById(T t) 根据id查询 T getById(int id) T selectById(Serializable id) 查询全部 List getAll() List selectList() 分页查询 PageInfo getAll(int page,int size) IPage selectPage(IPage page) 按条件查询 List getAll(Condition condition) IPage selectPage(WrapperqueryWrapper) 新增1int insert(T t)

参数类型是泛型,也就是我们当初继承BaseMapper的时候,填的泛型,返回值是int类型,0代表添加失败,1代表添加成功

123456789@Testvoid testInsert(){ User user = new User(); user.setName("Seto"); user.setAge(23); user.setTel("4005129421"); user.setPassword("MUSICIAN"); userDao.insert(user);} 删除1int deleteByIds(Serializable id)

参数类型为什么是一个序列化类Serializable

通过查看String的源码,你会发现String实现了Serializable接口,而且Number类也实现了Serializable接口 Number类又是Float,Double,Long等类的父类 那现在能作为主键的数据类型,都已经是Serializable类型的子类了 MP使用Serializable类型当做参数类型,就好比我们用Object类型来接收所有类型一样

返回值类型是int

数据删除成功返回1 未删除数据返回0。

那下面我们就来删除刚刚添加的数据,注意末尾加个L

1234@Testvoid testDelete(){ userDao.deleteById(1572364408896622593L);} 修改1int updateById(T t);

T:泛型,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值

int:返回值

修改成功后返回1

未修改数据返回0

1234567@Testvoid testUpdate(){ User user = new User(); user.setId(1L); user.setName("Alen"); userDao.updateById(user);}

修改功能只修改指定的字段,未指定的字段保持原样

根据ID查询1T selectById (Serializable id)

Serializable:参数类型,主键ID的值

T:根据ID查询只会返回一条数据

12345@Testvoid testSelectById(){ User user = userDao.selectById(1); System.out.println(user);}

控制台输出如下

User(id=1, name=Alen, password=tom, age=3, tel=18866668888)

查询全部1List selectList(Wrapper queryWrapper)

Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null

1234567@Testvoid testSelectAll() { List users = userDao.selectList(null); for (User u : users) { System.out.println(u); }}

控制台输出如下

User(id=1, name=Alen, password=tom, age=3, tel=18866668888)User(id=2, name=Jerry, password=jerry, age=4, tel=16688886666)User(id=3, name=Jock, password=123456, age=41, tel=18812345678)User(id=4, name=传智播客, password=itcast, age=15, tel=4006184000)

方法都测试完了,那你们有没有想过,这些方法都是谁提供的呢?

想都不用想,肯定是我们当初继承的BaseMapper,里面的方法还有很多,后面我们再慢慢学习 Lombok 代码写到这,我们发现之前的dao接口,都不用我们自己写了,只需要继承BaseMapper,用他提供的方法就好了 但是现在我还想偷点懒,毕竟懒是第一生产力,之前我们手写模型类的时候,创建好对应的属性,然后用IDEA的Alt+Insert快捷键,快速生成get和set方法,toSring,各种构造器(有需要的话)等 U1S1项目做这么久,写模型类都给我写烦了,有没有更简单的方式呢? 答案当然是有的,可以使用Lombok,一个Java类库,提供了一组注解,来简化我们的POJO模型类开发

具体步骤如下

步骤一:添加Lombok依赖

12345 org.projectlombok lombok

版本不用设置,SpringBoot中已经管理了lombok的版本,

步骤二:在模型类上添加注解

Lombok常见的注解有:

@Setter:为模型类的属性提供setter方法

@Getter:为模型类的属性提供getter方法

@ToString:为模型类的属性提供toString方法

@EqualsAndHashCode:为模型类的属性提供equals和hashcode方法

@Data:是个组合注解,包含上面的注解的功能

@NoArgsConstructor:提供一个无参构造函数

@AllArgsConstructor:

提供一个包含所有参数的构造函数

12345678910@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private Long id; private String name; private String password; private Integer age; private String tel;}

说明:Lombok只是简化模型类的编写,我们之前的方法也能用例如你有特殊的构造器需求,只想要name和password这两个参数,那么可以手写一个

1234public User(String name, String password) { this.name = name; this.password = password;} 分页功能

基础的增删改查功能就完成了,现在我们来进行分页功能的学习

1IPage selectPage(IPage page, Wrapper queryWrapper) IPage用来构建分页查询条件 Wrapper:用来构建条件查询的条件,暂时没有条件可以传一个null 返回值IPage是什么意思,后面我们会说明

具体的使用步骤如下

步骤一:调用方法传入参数获取返回值

12345678910@Testvoid testSelectPage() { IPage page = new Page(1, 3); userDao.selectPage(page, null); 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());}

步骤二:设置分页拦截器

12345678public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor myInterceptor = new MybatisPlusInterceptor(); myInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return myInterceptor; }}

步骤三:运行测试程序

运行程序,结果如下,符合我们的预期

当前页码1本页条数3总页数2总条数5[User(id=1, name=Alen, password=tom, age=3, tel=18866668888), User(id=2, name=Jerry, password=jerry, age=4, tel=16688886666), User(id=3, name=Jock, password=123456, age=41, tel=18812345678)]

DQL编程控制

增删改查四个操作中,查询是非常重要的也是非常复杂的操作,这部分我们主要学习的内容有:

条件查询方式 查询投影 查询条件设定 字段映射与表名映射 条件查询条件查询的类 MP将复杂的SQL查询语句都做了封装,使用编程的方式来完成查询条件的组合 之前我们在写CRUD时,都看到了一个Wrapper类,我们当初都是赋一个null值,但其实这个类就是用来查询的 构建条件查询 QueryWrapper小于用lt,大于用gt回想之前我们在html页面中,如果需要用到小于号或者大于号,需要用对应的html实体来替换小于号的实体是;,大于号的实体是; 12345678@Testvoid testQueryWrapper(){ QueryWrapper qw = new QueryWrapper(); //条件为 age字段小于18 qw.lt("age",18); List userList = userDao.selectList(qw); System.out.println(userList);}

运行测试方法,结果如下

[User(id=1, name=Alen, password=tom, age=3, tel=18866668888), User(id=2, name=Jerry, password=jerry, age=4, tel=16688886666), User(id=4, name=kyle, password=cyan, age=15, tel=4006184000)]

这种方法有个弊端,那就是字段名是字符串类型,没有提示信息和自动补全,如果写错了,那就查不出来

QueryWrapper的基础上,使用lambda 1234567@Testvoid testQueryWrapper(){ QueryWrapper qw = new QueryWrapper(); qw.lambda().lt(User::getAge,18); List userList = userDao.selectList(qw); System.out.println(userList);}

ser::getAget,为lambda表达式中的,类名::方法名

LambdaQueryWrapper方式二解决了方式一的弊端,但是要多些一个lambda(),那方式三就来解决方式二的弊端,使用LambdaQueryWrapper,就可以不写lambda()

1234567@Testvoid testQueryWrapper(){ LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(User::getAge,18); List userList = userDao.selectList(lqw); System.out.println(userList);} 多条件查询

上面三种都是单条件的查询,那我们现在想进行多条件的查询,该如何编写代码呢?

需求:查询表中年龄在10~30岁的用户信息

12345678910@Testvoid testQueryWrapper(){ LambdaQueryWrapper lqw = new LambdaQueryWrapper(); //大于10 lqw.gt(User::getAge,10); //小于30 lqw.lt(User::getAge,30); List userList = userDao.selectList(lqw); System.out.println(userList);}

构建多条件的时候,我们还可以使用链式编程

1234567@Testvoid testQueryWrapper() { LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.gt(User::getAge, 10).lt(User::getAge, 30); List userList = userDao.selectList(lqw); System.out.println(userList);}

可能存在的疑问

MP怎么就知道你这俩条件是AND的关系呢,那我要是想用OR的关系,该咋整

解答

默认就是AND的关系,如果需要OR关系,用or()链接就可以了

1lqw.gt(User::getAge, 10).or().lt(User::getAge, 30);

需求:查询年龄小于10,或者年龄大于30的用户信息

1234567@Testvoid testQueryWrapper() { LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.lt(User::getAge, 10).or().gt(User::getAge, 30); List userList = userDao.selectList(lqw); System.out.println(userList);} 查询投影查询指定字段

目前我们在查询数据的时候,什么都没有做默认就是查询表中所有字段的内容,我们所说的查询投影即不查询所有字段,只查询出指定内容的数据。

具体如何来实现?

12345678@Testvoid testQueryWrapper() { LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.select(User::getName,User::getName); for (User user : userDao.selectList(lqw)) { System.out.println(user); }}

select(…)方法用来设置查询的字段列,可以设置多个

1lqw.select(User::getName,User::getName);

控制台输出如下

User(id=null, name=Alen, password=null, age=null, tel=null)User(id=null, name=Jerry, password=null, age=null, tel=null)User(id=null, name=Jock, password=null, age=null, tel=null)User(id=null, name=kyle, password=null, age=null, tel=null)User(id=null, name=Seto, password=null, age=null, tel=null)

如果使用的不是lambda,就需要手动指定字段

12345678@Testvoid testQueryWrapper() { QueryWrapper qw = new QueryWrapper(); qw.select("name", "age"); for (User user : userDao.selectList(qw)) { System.out.println(user); }} 聚合查询

需求:聚合函数查询,完成count、max、min、avg、sum的使用

count:总记录数 max:最大值 min:最小值 avg:平均值 sum:求和 12345678@Testvoid testQueryWrapper() { QueryWrapper qw = new QueryWrapper(); qw.select("count(*) as count"); for (Map selectMap : userDao.selectMaps(qw)) { System.out.println(selectMap); }} 分组查询123456789@Testvoid testQueryWrapper() { QueryWrapper qw = new QueryWrapper(); qw.select("max(age) as maxAge"); qw.groupBy("tel"); for (Map selectMap : userDao.selectMaps(qw)) { System.out.println(selectMap); }}

控制台输出如下

{maxAge=3}{maxAge=4}{maxAge=41}{maxAge=15}{maxAge=23}

注意:

聚合与分组查询,无法使用lambda表达式来完成 MP只是对MyBatis的增强,如果MP实现不了,我们可以直接在DAO接口中使用MyBatis的方式实现 查询条件

前面我们只使用了lt()和gt(),除了这两个方法外,MP还封装了很多条件对应的方法

范围匹配(> 、 = 、between) 模糊匹配(like) 空判定(null) 包含性匹配(in) 分组(group) 排序(order) …… 等值查询

需求:根据用户名和密码查询用户信息

1234567@Testvoid testQueryWrapper() { LambdaQueryWrapper qw = new LambdaQueryWrapper(); qw.eq(User::getName,"Seto").eq(User::getPassword,"MUSICIAN"); User user = userDao.selectOne(qw); System.out.println(user);}

控制台输出如下

User(id=1572385590169579521, name=Seto, password=MUSICIAN, age=23, tel=4005129421)

eq(): 相当于= ,对应的sql语句为

1SELECT * FROM tb_user WHERE name = 'seto' AND password = 'MUSICIAN';

selectList:查询结果为多个或者单个

selectOne:查询结果为单个

范围查询

需求:对年龄进行范围查询,使用lt()、le()、gt()、ge()、between()进行范围查询

123456789@Testvoid testQueryWrapper() { LambdaQueryWrapper qw = new LambdaQueryWrapper(); qw.between(User::getAge,10,30); List users = userDao.selectList(qw); for (User u : users) { System.out.println(u); }}

控制台输出如下

User(id=4, name=kyle, password=cyan, age=15, tel=4006184000)User(id=1572385590169579521, name=Seto, password=MUSICIAN, age=23, tel=4005129421)

gt():大于(>) ge():大于等于(>=) lt():小于(


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3