最近项目中使用到了 MyBatis-Plus。接下来快速搭建一个项目,快速入门 MyBatis-Plus。
官方文档非常详细:https://baomidou.com/pages/226c21/
一、MyBatis-Plus简介来自官方介绍。
MyBatis-Plus (opens new window)(简称 MP)
是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(30) NOT NULL DEFAULT '' COMMENT '用户名',
`age` int NOT NULL DEFAULT 0 COMMENT '年龄',
`height` DOUBLE(10,2) NOT NULL DEFAULT 0.00 COMMENT '身高',
`email` varchar(50) NOT NULL DEFAULT '' COMMENT '邮箱',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
--
DELETE FROM `t_user`;
INSERT INTO `t_user` (id, user_name, age, height, email) VALUES
(1, 'Jone', 18, 1.65, 'test1@baomidou.com'),
(2, 'Jack', 20, 1.60,'test2@baomidou.com'),
(3, 'Tom', 28, 1.75, 'test3@baomidou.com'),
(4, 'Sandy', 21, 1.72, 'test4@baomidou.com'),
(5, 'Billie', 24, 1.80, 'test5@baomidou.com');
1.2 引入依赖
创建 maven项目,引入依赖:
com.baomidou
mybatis-plus-boot-starter
3.5.1
mysql
mysql-connector-java
8.0.22
runtime
org.springframework.boot
spring-boot-starter-jdbc
2.5.8-SNAPSHOT
com.alibaba
druid-spring-boot-starter
1.2.3
org.projectlombok
lombok
1.18.22
1.3 yaml配置文件
server:
port: 18081
servlet:
context-path: /
spring:
application:
name: mybatis-plus-springboot
## 数据源配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
username: root
password: 123456
logging:
level:
root: info
com.charge.learn.mybatis.plus: debug #打印SQL
到此,环境就搭建好了,可以使用 MyBatis-Plus。
1.5 创建DO@Data
@ToString
@TableName("t_user")
public class UserDO {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("user_name")
private String userName;
private Integer age;
private Double height;
private String email;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
官方文档-注解:https://baomidou.com/pages/223848/
下面针对表创建 mapper,service等,进行使用。
2、Mapper CRUD 接口说明:
- 通用 CRUD 封装
BaseMapper(opens new window)接口
,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器 - 泛型 T 为任意实体对象,一般即POJO对象
- 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
- 对象 Wrapper 为 条件构造器
所以,我们 POJO对应的Mapper接口只需要继承 BaseMapper接口,即可进行一些通用 CRUD的操作。对象 Wrapper 为 条件构造器后面在学习。 官方文档-Mapper CRUD 接口:https://baomidou.com/pages/49cc81/#mapper-crud-接口
public interface UserMapper extends BaseMapper {
}
就可以进行单元测试了。
2.1 新增 @Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
System.out.println(("----- insert method test ------"));
UserDO userDO = new UserDO();
userDO.setUserName("赵云");
userDO.setAge(20);
userDO.setHeight(1.88);
userDO.setEmail("zhaoyun@123.com");
int count = userMapper.insert(userDO);
System.out.println("count = " + count);
System.out.println("userDO = " + userDO);
}
注意:如果指定了 fill为后面三个时,必须显示设置值。否则为报错:Column 'create_time' cannot be null. 后面我们在使用字段自动填充。这里也可以不指定或者显示设置值。
@Test
public void testDeleteById() {
System.out.println(("----- deleteById method test ------"));
int count = userMapper.deleteById(1L);
System.out.println("count = " + count);
}
@Test
public void testUpdateById() {
System.out.println(("----- updateById method test ------"));
UserDO userDO = new UserDO();
userDO.setId(6L);
userDO.setUserName("赵子龙");
//userDO.setAge(21);
userDO.setHeight(1.908);
//userDO.setEmail("zhaoyun@123.com");
/**
* 因为 update_time,fill = INSERT_UPDATE,所以它必须设值,否则会报不能为null的错误
* @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
*/
userDO.setUpdateTime(new Date()); /
int count = userMapper.updateById(userDO);
System.out.println("count = " + count);
System.out.println("userDO = " + userDO);
}
@Test
public void testSelectById() {
System.out.println(("----- selectById method test ------"));
UserDO userDO = userMapper.selectById(6L);
System.out.println("userDO = " + userDO);
}
@Test
public void testSelectList() {
System.out.println(("----- selectList method test ------"));
List userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
说明:
- 通用 Service CRUD 封装
IService(opens new window)接口
,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆, - 泛型 T 为任意实体对象
- 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
- 对象 Wrapper 为 条件构造器
官方文档-Service CRUD 接口:https://baomidou.com/pages/49cc81/#service-crud-接口 所以,我们 POJO对应的 server接口只需要继承 IService接口,即可进行一些通用 CRUD的操作。对象 Wrapper 为 条件构造器后面在学习。
public interface UserService extends IService {
}
注意:
- service的实现类继承 service接口,就需要实现 IService接口里面的方法,但是,MyBatis-Plus也提供了一个
ServiceImpl类
。更方便的简化我们的开发。
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
}
ServiceImpl类有两个泛型:
- 泛型 M 为 BaseMapper子类,即我们的Mapper对象
- 泛型 T 为任意实体对象,即POJO
就可以进行单元测试了。
3.1 新增 3.1.1 save方法 @Autowired
private UserService userService;
@Test
public void testSave() {
System.out.println(("----- save method test ------"));
UserDO userDO = new UserDO();
userDO.setUserName("赵云save");
userDO.setAge(20);
userDO.setHeight(1.88);
userDO.setEmail("zhaoyun@123.com");
userDO.setCreateTime(new Date());
userDO.setUpdateTime(new Date());
boolean save = userService.save(userDO);
System.out.println("save = " + save);
System.out.println("userDO = " + userDO);
}
@Test
public void testSaveBatch() {
System.out.println(("----- saveBatch method test ------"));
List userDOList = new ArrayList();
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?