目录
- 1 MybatisPlus
- 1.1 MP介绍
- 1.2 MP的特点
- 1.3 MybatisPlus入门案例
- 1.3.1 导入jar包
- 1.3.2 编辑POJO对象
- 1.3.3 编辑Mapper接口
- 1.3.4 编译YML配置文件
- 1.3.5 编辑测试案例
- 1.4 MP核心原理
- 1.4.1 需求
- 1.4.2 原理说明
- 1.4.3 对象转化Sql原理
- 1.5 MP常规操作
- 1.5.1 添加日志打印
- 1.5.2 测试入库操作
- 1.5.2 测试更新操作
- 1.6 MP常规操作
- 1.6.1 根据对象查询
- 1.6.2 条件构造器查询
- 1.6.3 关键字like查询
- 1.6.4 关键字OrderBy
- 1.6.5 In关键字
- 1.6.6 带判断条件的查询
- 1.6.7 查询第一列数据
- 1.6.8 查询指定字段的数据
- 1.6.9 更新数据
- 2 解决自动注入警告问题
1 MybatisPlus
1.1 MP介绍
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.2 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.3 MybatisPlus入门案例
1.3.1 导入jar包
<!--spring整合mybatis-plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>
1.3.2 编辑POJO对象
MP要求以面向对象的方式操作数据库.其中对象与表 属性与字段必须映射。所以利用注解进行绑定
1.3.3 编辑Mapper接口
1.3.4 编译YML配置文件
MP增强了Mybatis, MP内部包含了Mybatis 所以将Mybatis的包删除,否则内部jar包异常
- 完成pom文件如下
- SpringBoot版本过高会不支持Mybatis-Plus
- 再次我更改了SpringBoot版本为3.1.8(此时Mybatis-Plus必须使用3.5.5及以上)
- 或者降低SpringBoot版本号(2.x版本)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.jt</groupId><artifactId>springboot_demo_2</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_demo_2</name><description>springboot_demo_2</description><properties><java.version>17</java.version></properties><dependencies><!--spring-boot-starter 启动项当程序解析到该jar包时,就会按照jar包内的配置实例化对象包括数据源的配置. 加载数据源......--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--引入数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--只对当前项目有效--><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!--true该jar包文件父子项目之间不传递.--><!--<optional>true</optional>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--spring整合mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--在项目打包时将lombok包除外.--><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
YML配置文件中将mybatis名称为mybatis-plus即可
1.3.5 编辑测试案例
利用userMapper 实现以对象的方式操作数据库
//测试mybatis-plus
@Test
public void testSelect(){List<DemoUser> userList = userMapper.selectList(null);System.out.println(userList);
}
1.4 MP核心原理
1.4.1 需求
之前操作数据库采用sql(面向过程的语言)方法进行编辑. 但是如果所有的单表操作都由程序员完成.则开发效率低. 能否开发一种机制可以实现以面向对象的方式操作数据库.
1.4.2 原理说明
- 对象与数据表进行关联 @TableName
- MP采用BaseMapper的方式 将公共的接口方法进行了抽取. 采用泛型T的方式进行约束
- MP将用户操作的对象在底层自动的转化为Sql语句!!!
1.4.3 对象转化Sql原理
- 对象方法: userMapper.insert(User对象);
- Sql语句: insert into demo_user(id,name…) value(100,xxx…)
- 步骤:
- 根据userMapper找到对应的class类型
- 根据userMapper的类型通过反射机制获取父级接口类型BaseMapper
- 找到BaseMapper类型之后,获取泛型类型 User.class
- 获取User.class之后,获取class的注解名@TableName注解.获取注解名称. 至此表名获取成功
- 根据User.class获取其中的属性名称.之后获取属性上的@TableField 获取字段名称.
- 之后利用对象的get方法获取属性的值最终实现了Sql语句的拼接过程.
- MP将整理好的Sql交给Mybatis(jdbc)去处理. 最终实现了以对象的方式操作数据库.
1.5 MP常规操作
1.5.1 添加日志打印
server:port: 8090#SpringBoot 开箱即用
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: root#检查密码是否正确password: root#SpringBoot整合MybatisPlus配置
mybatis-plus:#定义别名包type-aliases-package: com.jt.pojomapper-locations: classpath:/mappers/*.xml#开启驼峰映射configuration:map-underscore-to-camel-case: true#添加MP日志 打印执行的sql
logging:level:com.jt.mapper: debug
1.5.2 测试入库操作
import com.jt.mapper.DemoUserMapper;
import com.jt.pojo.DemoUser;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class TestMP {@Autowiredprivate DemoUserMapper userMapper;@Testpublic void insert(){DemoUser user = new DemoUser();user.setName("MP测试").setSex("男").setAge(19);userMapper.insert(user);}
}
- 测试结果
1.5.2 测试更新操作
//测试更新操作 修改id=231的数据 name="中午吃什么" age=18
//原则: 根据对象中不为null的属性当做set条件. set name="xxx"
// 如果ById的操作,则Id必须赋值 并且ID当做唯一where条件
@Test
public void updateById(){DemoUser user = new DemoUser();user.setName("中午吃什么").setAge(18).setId(231);userMapper.updateById(user);
}
1.6 MP常规操作
1.6.1 根据对象查询
/*** 1.查询id=21的用户 根据ID查询数据 1条记录* 2.查询name="白骨精" sex=女 的用户 List* 知识点:* 1.queryWrapper 条件构造器 拼接where条件的.* 原则: 根据对象中不为null的属性拼接where条件
*/
@Test
public void testSelect(){//1.根据ID查询DemoUser user = userMapper.selectById(21);System.out.println(user);//2.根据属性查询DemoUser user2 = new DemoUser();user2.setName("白骨精").setSex("女");QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>(user2);List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.2 条件构造器查询
说明: 如果查询条件中有特殊关系符,则使用特殊转义字符查询 代码如下.
/*** 需求: 查询age>18岁 并且性别为女的用户* Sql: select * from demo_user where age > 18 and sex="女"* 特殊字符: > gt < lt = eq* >= ge <= le* 默认链接符: and*
* */
@Test
public void testSelect2(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 18) .eq("sex", "女");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.3 关键字like查询
/*** 练习like关键字* 查询name中包含"精"字的数据* Sql: like "%精%"* 以精开头 like "精%" likeRight* 以精结尾 like "%精" likeleft
*/
@Test
public void testSelect3(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "精");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.4 关键字OrderBy
/*** 查询sex=男的数据,以id倒序排列* Sql: select * from demo_user where sex='男' order by id desc
*/
@Test
public void testSelect4(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("sex", "男").orderByDesc("id");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.5 In关键字
/*** 5.查询id= 1,3,5,6,7的用户* Sql: select * from demo_user where id in (xxx,xx,xx)
*/
@Test
public void testSelect5(){//数组使用包装类型Integer[] ids = {1,3,5,6,7};//需要将数组转化为集合List idList = Arrays.asList(ids);QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();//queryWrapper.in("id", idList); //根据list查询 list集合功能丰富queryWrapper.in("id", ids); //数组必须包装类型List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.6 带判断条件的查询
/*** 需求: 如果根据name属性和age属性查询数据. 有时某个数据可能为null,* 要求动态查询!!!* where name=xxx age>xxxx* 伪Sql: select * from demo_user* where name!=null name=xxx and age!=null age>xxx* condition: 内部编辑一个判断的条件* 如果返回值结果为true 则拼接该字段.* 如果为false 则不拼接该字段* StringUtils.hasLength(name) 判断字符串是否有效
*/
@Test
public void testSelect6(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();String name = "";int age = 18;queryWrapper.eq(StringUtils.hasLength(name),"name",name).gt(age>0, "age",age);List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}
1.6.7 查询第一列数据
/*** 需求: 只想查询第一列数据 selectObjs* 说明: queryWrapper=null 不需要where条件* selectObjs:* 1.一般根据条件查询Id的值,查询之后为后续的sql提供数据支持* 2. 有时用户只需要查询ID的值,并不需要其他数据项时 使用objs.
*/
@Test
public void testSelect7(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("sex","男");List objs = userMapper.selectObjs(queryWrapper);System.out.println(objs);
}
1.6.8 查询指定字段的数据
/*** 需求: 想查询name/sex字段* queryWrapper.select("name","sex"); 挑选执行字段
*/
@Test
public void testSelect8(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper();queryWrapper.select("name","sex");List objs = userMapper.selectList(queryWrapper);System.out.println(objs);
}
1.6.9 更新数据
/*** 更新数据* 将name="中午吃什么" 改为name="晚上吃什么"* 性别: 改为 其他* Sql:* update demo_user set name="xxx",sex="其他"* where name="xxxx"* 参数说明:* 1.entity 实体对象 需要修改的数据进行封装* 2.updateWrapper 条件构造器
*/
@Test
public void testSelect10(){DemoUser user = new DemoUser();user.setName("晚上吃什么").setSex("其他");UpdateWrapper updateWrapper = new UpdateWrapper();updateWrapper.eq("name", "中午吃什么");userMapper.update(user,updateWrapper);
}