Mybatis-Plus
Mybatis-Plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为了简化开发,提高效率而生
特性
重点说明:MP适用于单表操作,如果遇到多表操作,则手写SQL会效率更高
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
MP入门案例
注意事项
1.编辑pojo 添加注解 @tableName @tableId
2.实现接口继承BaseMapper
3.编辑YML文件配置信息 将mybatis改为mybatis-plus
导入jar包
说明:由于MP内部兼容了Mybatis则引入MP之后将原来的mybatis的依赖包删除。
删除mybatis的依赖包
<!--spring整合mybatis 暂时 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
导入MP的依赖包
<!--spring整合mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis0plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
对象与表映射
继承公共的Mapper接口
修改YML配置文件
说明:springBoot应该由原来的Mybatis数据库连接转换成MP的数据库连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRy9ylT6-1622599384584)(C:\Users\MTA\AppData\Roaming\Typora\typora-user-images\image-20210528113405293.png)]
编辑MP入门案例
对比Sql写法/MP写法的区别…
@SpringBootTest
public class TestMybatis {
// sprign容器 <userMapper,代理对象>
// 面向接口编程 扩展性好
@Autowired
private UserMapper userMapper;//JDK动态代理
//报错说明:com.jt.mapper.UserMapper.findAll 不匹配!!!!
//关于测试类代码说明: 要求: public 返回值void 方法名称不能叫test
@Test
public void test01(){
System.out.println(userMapper.getClass());
List<User> userList = userMapper.findAll(); //接口的方法 数据库只能识别Sql语句
System.out.println(userList);
}
//查询 用户的全部记录 面向对象的方式操作数据库.
//只能用于单表查询
@Test
public void testFind(){
//暂时不需要任何where条件 查询的是全部记录.
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
}
Mybatis CURD操作练习
编辑测试代码
@Test
public void insert(){
User user = new User();
user.setName("星期五").setAge(18).setSex("男");
userMapper.insertUser(user);
System.out.println("新增用户成功");
}
//根据name="星期五",将name="星期六"
@Test
public void update(){
String oldName = "星期五";
String newName = "星期六";
userMapper.updateByName(oldName,newName);
System.out.println("更新用户成功");
}
//删除用户信息 根据name属性删除数据
@Test
public void delete(){
String name = "星期六";
userMapper.deleteByName(name);
System.out.println("删除用户成功");
}
编辑Mapper接口
@Insert("insert into demo_user(id,name,age,sex) " +
"value (null,#{name},#{age},#{sex})")
void insertUser(User user);
@Update("update demo_user set name = #{newName} where name=#{oldName}")
void updateByName(String oldName, String newName);
//Mybatis中如果传递的参数只有一个,则名称任意 一般不用.
@Delete("delete from demo_user where name=#{name}")
void deleteByName(String name);
MP工作原理
1)通过注解 实现对象与表一一映射
2)通过属性注解 实现对象的属性与表中的字段一一映射
3)将公共的方法进行抽取,抽取到BaseMapper接口中
4)将用户操作的方法对象,转换为数据库能够识别的SQL语句
demo1:userMapper.insert(user对象)
SQL1:insert into 表名(字段名…) value(属性值…)
拼接过程:
insert into 表名(字段名…) value(属性值…)
1)通过userMapper 查找父级接口BaseMapper
2)根据BaseMapper 查找泛型对象 User对象
3)根据user对象 查找指定的注解 @TableName 获取表名
4)根据user对象 动态获取表中的字段 @TableField
5)在获取字段的同时 获取属性的值,最后进行SQL拼接
6)MP将拼接的SQL交给Mybaits框架处理执行
insert into demo|_user(id,name…) value(value1,value2…)
MP练习
根据ID查询
/**
* 1.根据Id=23数据
*/
@Test
public void select01(){
User user = userMapper.selectById(23);
System.out.println(user);
}
对象查询
配置日志
/**
* 查询 name="潘凤" sex="男"
* 结果: 1项 userMapper.selectOne()
* 多项 userMapper.selectList()
* Sql: where name="xxx" and sex="xxx"
* queryWrapper: 条件构造器 拼接where条件
* 如果遇到多条件查询,则默认的连接符and
* 方式1: 可以通过对象的方式进行控制
*/
@Test
public void select02(){
User user = new User();
user.setName("潘凤").setSex("男");
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
特殊字符练习
/**
* 要求: age>18岁 or sex=男的用户
* 转义字符: > gt, < lt , = eq
* >= ge , <= le
*/
@Test
public void select03(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//编辑的是数据库字段信息
queryWrapper.gt("age", 18)
.or()
.eq("sex","男");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
linke关键字
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
In关键字
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
不为Null查询
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
动态SQL语句查询
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
挑选字段查询
/**
* 要求: 查询name中包含"精" 并且按照age 降序排列
* Sql: like "%精%" 包含精
* like "精%" 以精开头
* like "%精" 以精结尾
*/
@Test
public void select04(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("name","精")
.orderByDesc("age");
//根据对象中不为null的属性 拼接where条件
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
MP更新操作
更新操作
@SpringBootTest
public class TestMP2 {
@Autowired
private UserMapper userMapper;
/**
* 将ID=229的用户名称 改为六一儿童节
*/
@Test
public void updateUser(){
User user = new User();
user.setId(229).setName("六一儿童节");
//set name="xxx" where id = 229
userMapper.updateById(user);
}
/**
* 更新操作2
* 将name="六一儿童节" 改为"端午节"
* 参数说明:
* 1.实体对象 封装修改后的数据 set结构
* 2.UpdateWrapper 修改的条件构造器
* Sql: update demo_user set name="端午节" where name="61"
*/
@Test
public void updateUser2(){
User user = new User();
user.setName("端午节");
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.eq("name", "六一儿童节");
userMapper.update(user,updateWrapper);
}
}