前言
一个多月前刚接触到Mybatis的时候,我完全被这个持久层框架所折服,因为JDBC的那一套硬编码问题非常严重,每次处理数据层时实在是太麻烦了!Mybatis的介入解决了很多硬编码问题,而且所支持的注解SQL开发也极大提高了效率。
但是,他的升级版plus好像更牛X诶,都不用写SQL就能完成开发~
一.回顾Mybatis
我们先来回顾一下SpringBoot+Mybatis操作数据层的流程:
我们需要在数据层接口中写上SQL然后通过Mapper代理的方式调用CRUD的方法
好复杂啊!还要写SQL!有没有不用写SQL就能crud的呀!
那还真有呢(MyBatis——>MyBatisPlus)
二.MyBatisPlus开发流程
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率!
直入主题!
参考着上面的实现步骤来快速实现下SpringBoot+MyBatisPlus
2.1创建数据库及表
CREATE TABLE Users (
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 Users values(1,'懒羊羊','11',3,'123456');
insert into Users values(2,'喜羊羊','22',4,'456789');
insert into Users values(3,'美羊羊','33',5,'123789');
insert into Users values(4,'沸羊羊','44',6,'456123');
select * from Users;
2.2pom.xml补全依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
从MP的依赖关系可以看出,通过依赖传递已经将MyBatis与MyBatis整合Spring的jar包导入,我们不需要额外在添加MyBatis的相关jar包
2.3添加MP配置信息
这个yml就相当于一次性配置完了连接数据库的文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/pyq?serverTimezone=UTC
username: root
password: 284650
注:serverTimezone是用来设置时区,UTC是标准时区,和咱们的时间差8小时,所以可以将其修改为Asia/Shanghai
2.4创建实体类
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}
2.5创建Dao层接口
我们不用写SQL的奥秘就蕴藏在这里!@Mapper注解已经说明了一切,虽然接口里啥都没写但是就能成为Mapper代理对象!
@Mapper
public interface UserDao extends BaseMapper<Users>{...}
在Dao接口上添加@Mapper 注解 |
需要在每一Dao接口中添加注解 |
---|---|
在引导类上添加@MapperScan 注解 |
只需要写一次,则指定包下的所有Dao接口都能被扫描到,@Mapper 就可以不写 |
Ctrl+B看一下继承的BaseMapper< Users >,发现里面都是已经给我们写好的SQL,方法形参里的entity就是注入的实体对象,泛型T和传入的实体对象自动匹配
2.6boot引导类
@SpringBootApplication
public class MyBatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisPlusApplication.class, args);
}
}
2.7引入测试类
@SpringBootTest
class MyBatisPlusApplicationTests{
@Autowired
private UserDao userDao;
@Test
public void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
查看运行结果:
总的来说
跟之前整合MyBatis相比,你会发现我们不需要在DAO接口中编写方法和SQL语句了,只需要继承BaseMapper
接口即可,整体来说简化很多。
三.MaBatisPlus的CRUD
3.1 新增
在进行新增之前,我们可以分析下新增的方法:
int insert (T t)
T,新增用来保存新增数据,int,新增成功后返回1,没有新增成功返回的是0
在测试类中进行新增操作:
@Test
void testSave(){
Users user = new Users();
user.setName("慢羊羊");
user.setPassword("66");
user.setAge(88);
user.setTel("123456321");
userDao.insert(user);
}
执行测试后,数据库表中就会添加一条数据。
咱们的慢羊羊已经添加到其中了
按照id自增,应该是慢羊羊的id应该是5才对,为啥这里是1568916109197152257呢?谁能给懒羊羊解答一下嘛
3.2 删除
在进行删除之前,我们可以分析下删除的方法:
int deleteById (Serializable id)
**这里为啥形参是Serializable类型的id,不是一个Integer类而是一个序列化类?
String和Number是Serializable的子类,Number又是Float,Double,Integer等类的父类,能作为主键的数据类型都已经是Serializable的子类,MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。**
@SpringBootTest
class MyBatisPlusApplicationTests{
@Autowired
private UserDao userDao;
@Test
void testDelete() {
userDao.deleteById(1401856123725713409L);
}
}
3.3修改
在进行修改之前,我们可以分析下修改的方法:
int updateById(T t);
同样地:
T,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值。int,修改成功后返回1,未修改数据返回0
在测试类中进行新增操作:
@SpringBootTest
class MyBatisPlusApplicationTests{
@Autowired
private UserDao userDao;
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setName("懒羊羊");
user.setPassword("11");
userDao.updateById(123456);
}
}
值得注意的是,在进行修改操作的时候,只修改实体对象中有值的字段!
3.4根据ID查询
在进行根据ID查询之前,我们可以分析下根据ID查询的方法:
T selectById (Serializable id)
Serializable:参数类型,主键ID的值,T:根据ID查询只会返回一条数据
在测试类中进行新增操作:
@SpringBootTest
class MyBatisPlusApplicationTests{
@Autowired
private UserDao userDao;
@Test
void testGetById() {
User user = userDao.selectById(3L);
System.out.println(user);
}
}
最后,也是查到了美羊羊