MyBatisPlus
MyBatisPlus
快速入门
官网文档地址:https://baomidou.gitee.io/mybatis-plus-doc/#/install
使用第三方组件步骤:
1、导入相应的依赖
2、研究依赖如何配置
3、代码如何编写
4、提高扩展技术能力
步骤
1、创建数据库 User 表
id
name
age
1
Jone
18
test1@baomidou.com
2
Jack
20
test2@baomidou.com
3
Tom
28
test3@baomidou.com
4
Sandy
21
test4@baomidou.com
5
Billie
24
test5@baomidou.com
其对应的数据库 Schema 脚本如下:
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
其对应的数据库 Data 脚本如下:
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
初始化工程
创建一个springboot的工程
可以使用 Spring Initializer 快速初始化一个 Spring Boot 工程
添加依赖
引入spring boot starter 父工程依赖:
org.springframework.bootgroupId>
spring-boot-starter-parentartifactId>
2.3.0.RELEASEversion>
parent>
引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、lombok、mysql 依赖:
org.springframework.bootgroupId>
spring-boot-starterartifactId>
dependency>
org.springframework.bootgroupId>
spring-boot-starter-testartifactId>
testscope>
dependency>
org.projectlombokgroupId>
lombokartifactId>
trueoptional>
dependency>
com.baomidougroupId>
mybatis-plus-boot-starterartifactId>
3.0.5version>
dependency>
mysqlgroupId>
mysql-connector-javaartifactId>
dependency>
dependencies>
配置
在application.yml配置文件中添加mysql的基本配置和项目启动的基本配置
spring:
#配置thymeleaf模板
thymeleaf:
cache: false#开启缓存
prefix: classpath:/templates/
suffix: .html
encoding: utf-8
#配置mysql数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://39.105.27.58/ssmarkert?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT
username: root
password: lovehxp521..
#项目启动端口
server:
port: 8080
#打印日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在Springboot启动类中添加@MapperScan注解,扫描Mapper文件:
@SpringBootApplication
@MapperScan("com.hxp.ssmkert.mapper")
public class SsmkertApplication {
public static void main(String[] args) {
SpringApplication.run(SsmkertApplication.class, args);
}
}
编码
编写实体类User.java(此处使用了Lombok简化代码)
@Data
public class User{
private Long id;
private String name;
private Integer age;
private String email;
}
编写Mapper接口 UserMapper.java,所有的CRUD都已经帮我们写完了
public interface UserMapper extends BaseMapper {
}
开始使用
添加测试类,进行整合测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void userMapperTest1(){
List users = userMapper.selectList(null);//条件为null
users.forEach(System.out::println);
}
}
userMapper 中的 selectList()方法的参数为MP内置的条件封装器Wrapper,所以不填写就是无条件
控制台输出:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
思考问题?
1、SQL谁帮我们写的?Mybatis-Plus都写好了
2、方法哪里来的?Mybatis-Plus都写好了
配置日志
我们的mysql运行情况我们是不知道的,我们需要配置一下日志打印输出,帮助我们开发测试。
在appliaction.yml文件中
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
主键的主键策略
1.使用注解添加主键策略
自增主键
//使用注解添加主键策略
@TableId(type = IdType.AUTO)//主键自增策略
private Long id;
注意:使用自增主键必须数据表设置自增
2.通过配置文件配置全局的主键生成策略
主键策略列表:
策略
说明
AUTO
数据库ID自增
NONE
该类型为未设置主键类型
INPUT
用户输入ID,该类型可以通过自己注册自动填充插件进行填充
ID_WORKER
全局唯一ID (idWorker)
UUID
全局唯一ID (UUID)
ID_WORKER_STR
字符串全局唯一ID (idWorker 的字符串表示)
AUTO(0),//数据库ID自增
NONE(1),//该类型为未设置主键类型,新版本更新 默认为NONE
INPUT(2),//用户输入ID * 该类型可以通过自己注册自动填充插件进行填充
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
ID_WORKER(3),//全局唯一ID (idWorker)
UUID(4),//全局唯一ID (UUID)
ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)
mybatis-plus 的CRUD
update
//修改测试
@Test
public void UpdateTest() {
User user = new User();
user.setId(6L);
user.setName("一颗小土豆");
user.setAge(24);
user.setEmail("2426712259@qq.com");
int update = userMapper.updateById(user);//根据主键id修改
System.out.println(update);
}
/*打印输出的日志
==> Preparing: UPDATE user SET name=?, age=?, email=? WHERE id=?
==> Parameters: 一颗小土豆(String), 24(Integer), 2426712259@qq.com(String), 6(Long)
<== Updates: 1
*/
//这里我们只修改name不修改其他的参数
@Test
public void UpdateTest2() {
User user = new User();
user.setId(6L);
user.setName("一颗小辣椒");
// user.setAge(24);
// user.setEmail("2426712259@qq.com");
int update = userMapper.updateById(user);
System.out.println(update);
}
/*
==> Preparing: UPDATE user SET name=? WHERE id=?
==> Parameters: 一颗小辣椒(String), 6(Long)
<== Updates: 1
*/
发现:
通过两个修改案例,我们发现mybatis-plus为我们实现的方法是动态SQL
自动填充
创建时间,修改时间,这些操作都是自动化完成的,我们不希望手动更新。
阿里巴巴开发手册:所有的数据库表都必须配置这两个字段:gmt_create、gmt_modified ,而且需要自动化。
方法一:数据库级别
1、修改数据库
gmt_create/create_time : datetime 添加默认值:CURRENT_TIMESTAMP
gmt_modified/update_time : datetime 添加默认值:CURRENT_TIMESTAMP 勾选根据当前时间戳跟新
2、再次测试,同步实体类代码
private Date updateTime;
private Date createTime;
我们插入一条新的数据,create_time和update_time 都已经帮我们生成了
我们执行修改操作并不手动更新时间,查看update_time是否发生变化
@Test
public void UpdateTest() {
//这里并没有修改时间
User user = new User();
user.setId(7L);
user.setName("一颗小辣椒");
int update = userMapper.updateById(user);
System.out.println(update);
}
执行结果,时间发生了变化。
方法二:代码级别
代码的自动填充
1.删除数据库的默认值
2.使用mybatis-plus注解
@TableField( fill = FieldFill.INSERT)
private Date createTime;
@TableField( fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
3.创建自定义监听
mybatis-plus 3.3.0版本之前:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
mybatis-plus 3.3.0版本之后:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`)
/* 上面选其一使用,下面的已过时(注意 strictInsertFill 有多个方法,详细查看源码) */
//this.setFieldValByName("operator", "Jerry", metaObject);
//this.setInsertFieldValByName("operator", "Jerry", metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`)
/* 上面选其一使用,下面的已过时(注意 strictUpdateFill 有多个方法,详细查看源码) */
//this.setFieldValByName("operator", "Tom", metaObject);
//this.setUpdateFieldValByName("operator", "Tom", metaObject);
}
}
4.插入测试
//测试插入<