目录
一、简介
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。
核心思想:利用对象操作数据库,单表查询几乎不写Sql
二、操作案例
1.导入jar包
说明:MybatisPlus对Mybatis的增强,所有jar包只需要导入MP的即可.原有的Mybatis需要删除.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<!--跳过测试类打包-->
<skipTests>true</skipTests>
</properties>
<!--原则: 按需导入 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<!--springboot启动项(器)在包的内部SpringBoot
已经完成了项目的"整合"(配置) 用户拿来就用
web导入SpringMVC
-->
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--添加lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--springBoot数据库连接 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--导入MP包之后,删除原有的Mybatis的包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.2</version>
</plugin>
</plugins>
</build>
2.配置对象关系映射
3.编辑Mapper接口并继承公共API接口
4.编辑YML配置文件
5.工具API测试
@SpringBootTest
public class TestSpringBoot {
@Autowired
private UserMapper userMapper; //代理对象
@Test
public void testGetAll(){
System.out.println(userMapper.getClass());
List<User> userList = userMapper.getAll();
System.out.println(userList);
}
/**
* 新增用户
* Mybatis: 1.mapper接口 2.xml映射 Sql
* MP: 调用接口方法
*/
@Test
public void testInsert(){
User user = new User();
user.setName("吴亦凡").setAge(30).setSex("男");
//单表操作几乎不写Sql
userMapper.insert(user);
}
}
6.打印日志
server:
port: 8090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#SpringBoot整合MP
mybatis-plus:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/*.xml
configuration:
map-underscore-to-camel-case: true
# Mapper接口执行 打印Sql日志
logging:
level:
com.jt.mapper: debug
三、MP实现原理
1.用户执行User对象入库操作 userMapper.insert(user);
2.由于接口方法中需要传递泛型对象,则根据用户配置查找对应的泛型对象
3.根据用户的接口获取Mapper接口的父级接口BaseMapper,根据BaseMapper中的泛型对象 获取信息User.class类型
4.根据User.class 动态获取@TableName(“demo_user”) 获取对象对应的表名.之后通过@TableField(“name”)绑定与之对应的字段. 至此对象与表完成了映射.
5.根据上述的映射关系,动态的拼接Sql语句.
例子: userMapper.insert(user对象) 如何转化Sql?
**insert into 表名(字段名…) values (属性值…)
insert into demo_user(id,name,age,sex) values (“吴xx”,xx,xx,xx)
6.MP将动态生成的Sql交给Mybatis执行最终实现数据入库操作!!!
四、MP用法
1.根据id查询数据
2.条件构造器-对象封装
3.条件构造器-特殊字符查询
4.条件构造器-like关键字
5.条件构造器-orderBy
6.条件构造器-in关键字
/**
* 案例6: 查询Id=1,3,5,6,7的数据
* 关键字: 单表查询 in or 效率相差不大
* 多表查询时 建议使用 or 性能更快
* 可变参数类型:
* 1.可变参数类型 数据结构实质是一个数组.
* 2.定义可变参数类型时,必须位于方法参数的最后一位!
* void addUser(Integer age,Integer... ids);
* void addUser(Integer age,Integer[] ids);
*/
@Test
public void testIn(){
//1.方法1 条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("age","1,3,5,6,7");
queryWrapper.in("id",1,2,3,4,5,6);
List<User> userList1 = userMapper.selectList(queryWrapper);
//2.MP 特殊方法调用 以后尽可能使用对象类型(对象有方法)
Integer[] ids = new Integer[]{1,2,3,4,5,6};
List idList = Arrays.asList(ids);
List<User> userList2 = userMapper.selectBatchIds(idList);
System.out.println(userList1);
System.out.println(userList2);
}
7.条件构造器-动态sql
/**
* 案例7: 根据 name/sex 动态查询数据库
* 解析: 如果name/sex有值则动态拼接where条件.
* 否则不写where条件.
* 动态Sql实现: condition 参数
* 布尔类型值 true: 拼接where条件
* false: 不拼接where条件
* 字符串判断API:
* StringUtils.hasLength(name);
*/
@Test
public void testSelectNS(){
String name = null;
String sex = "";
QueryWrapper<User> queryWrapper = new QueryWrapper();
//判断是否有值
boolean nameFlag = StringUtils.hasLength(name);
boolean sexFlag = StringUtils.hasLength(sex);
queryWrapper.eq(nameFlag,"name",name)
.eq(sexFlag,"sex",sex);
List userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
8.MP的更新操作
@Test
public void testUpdate(){
User user = new User();
user.setName("祝君好运").setAge(100);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name","吴亦凡");
int row = userMapper.update(user,updateWrapper);
System.out.println(row);
}
// name="云英" sex="男" age="16"
@Test
public void testUpdateById(){
User user = new User();
user.setId(246).setName("云英").setSex("男").setAge(16);
//where id=xxx, 其他不为null的属性当作set条件.
userMapper.updateById(user);
}