MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus在MyBatis之上套了一层外衣,单表CRUD的操作几乎都可以由MyBatis-Plus代替执行。而且提供了各种查询方式,分页行为。作为使用者无需编写xml,直接调用MyBatis-Plus提供的API就可以了。
1.初始化工程
a. 创建一个空的Spring Boot工程
b. 添加依赖
1)引入Spring Boot Starter父工程
2)引入spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、Lombok、mysql依赖
c. 配置文件
1)在application.yml配置文件中添加mysql数据库相关配置
2)在springboot启动类中添加@Mapper注解,扫描Mapper文件夹
d. 编写实体类,编写mapper接口类并实现BaseMapper
e. 开始使用,添加测试类,进行功能测试
2.ActiveRecord:(AR)
ActiveRecord是什么?
- 每一个数据库表对应创建一个类,类的每一个对象实例对应数据库中表的一行记录;通常表的每个字段在类中都有相应的Field
- ActiveRecord负责把自己持久化,在ActiveRecord中封装了对数据库的访问,通过对象自己实现CRUD,实现优雅的数据库操作
- ActiveRecord也封装了部分业务逻辑,可以作为业务对象使用
- ActiveRecord中实体类要继承Model
3.表和列
主键,TableName,Tableld
IdType枚举类,主键定义如下:
- none没有主键
- auto自动增长
- input手动输入
- id_worker:实体类用Long id,表的列用bigint,int类型大小
- id_worker_str 实体类使用 String id,表的列使用varchar 50
- uuid 实体类使用 String id,列使用 varchar 50
4.指定表名
定义实体类,默认的表名和实体类同名;如果不一致,在实体类定义上面使用@TableName说明表名称。
例如:@TableName(value=“数据库表名”)
5.指定字段名称
使用@TableField指定字段名称
例如:@TableField(value=“数据库表中字段名称”)
6.使用mybatis-plus 需要注意这几个注解
@TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的。
@TableField(exist = true):表示该属性为数据库表字段。
Mybatis-Plus 插件有这个功能,可以看一下
@TableName:数据库表相关
@TableId:表主键标识
@TableField:表字段标识
@TableLogic:表字段逻辑处理注解(逻辑删除)
7.查询和分页
1)查询构造器:Wrapper
QueryWrapper(LambdaQueryWrapper)和UpdateWrapper(LambdaUpdateWrapper)的父类用于生成sql的where条件,entity属性也用于生成sql的where条件。MP3.x开始支持lambda表达式,LambdaQueryWrapper,LambdaUpdateWrapper支持lambda表达式的构造查询条件。
条件:
- allEq :基于map的相等
- eq :等于=
- ne :不等于 <>
- gt :大于 >
- ge:大于等于 >=
- lt :小于 <
- le :小于等于 <=
- between :BETWEEN 值1 AND 值2
- notBetween:NOT BETWEEN 值1 AND 值2
- like :LIKE “%值%”
- notLike :NOT LIKE “%值%”
- likeLeft :LIKE “%值”
- likeRight :LIKE “值%”
- isNull:字段 IS NULL
- isNotNull :字段 IS NOT NULL
- in :字段 IN(value1,value2,…)
- notIn :NOT IN(value1,value2,…)
- inSal :字段 IN(sql语句) 例如:inSql(“age”,“1,2,3”) —> age in(1,2,3)
- notInSql :字段 NOT IN(sql语句)
- groupBy :GROUP BY 字段
- orderByAsc :升序ORDER BY 字段,…ASC
- orderByDesc :升序ORDER BY 字段,…DESC
- orderBy :自定义字段排序 orderBy(true,true,“id”,“name”)–> order by id ASC,name ASC
- having :条件分组
- or :OR语句,拼接 + OR 字段 = 值
- and :AND语句,拼接 + AND 字段 = 值
- apply :拼接sql
- last :在sql语句后拼接自定义条件
- exists :拼接EXISTS(sql语句)例如:exists(“select id from table where age = 1”) -->exists(select id from table where age = 1)
- notExists :拼接 NOT EXISTS(sql语句)
- nested :正常嵌套 不带 AND 或者 OR
1)、QueryWrapper:查询条件封装类
方法:select 设置查询字段select后面的内容
2)、UpdateWrapper:更新条件封装类
方法:set 设置要更新的字段,MP拼接sql语句
setSql 参数是sql语句,MP不在处理语句
8.分页
前提:配置分页插件,实现物理分页。默认是内存分页
分页查询
(1).配置分页插件
@Configuration //注明该类为配置类,相当于ssm中<bean>配置文件
public class Config {
//分页插件
@Bean
public PaginationInterceptor PaginationInterceptor(){
return new PaginationInterceptor();
}
}
(2).分页
/**
* QueryWrapper的作用:QueryWrapper:该类中设置数据用于当作查询时使用的条件 WHERE (amount > ?)
*
* 分页:
* 1.统计记录数:SELECT COUNT(1) FROM goods WHERE (amount > ?)
* 2.实现分页,在sql语句的末尾加入 limit 0, 2
* SELECT id,amount,price,name FROM goods WHERE (amount > ?) LIMIT ?,?
* Parameters: 50(Integer), 0(Long), 2(Long)
*/
@RequestMapping(value = "/paging")
public String test(Model model){
QueryWrapper<Goods> qw = new QueryWrapper<>();
qw.gt("amount", 50);
//Preparing: SELECT id,amount,price,name FROM goods WHERE (amount > ?) LIMIT ?,?
//Parameters: 50(Integer), 0(Long), 2(Long)
IPage<Goods> page = new Page<>();
//设置分页的数据
page.setCurrent(1); //设置当前页
page.setSize(2); //每页记录数
IPage<Goods> goodsIPage = goodsDao.selectPage(page, qw);
List<Goods> records = goodsIPage.getRecords();
for (Goods good : records) {
System.out.println(good);
}
model.addAttribute("records",records);
return "goods";
}
9.MP生成器
准备条件