赞
踩
简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
步骤
新建一个数据库mybatis_plus
CREATE DATABASE `itbiancheng` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建一个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)
);
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');
添加依赖
在pom.xml
中添加:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
配置yaml
文件和@MapperScan
在application.yaml
配置数据源:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimeZone=GMT%2B8
username: root
password: 123456
在Application.java
中配置@MapperScan
:
@SpringBootApplication
@MapperScan("com.lichaoyang.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
编写是实体类和接口
在User.java
中编写实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private String age;
private String email;
}
编写Mapper类 UserMapper.java
:
Tips:使用@Mapper可以简化@MapperScan
@Mapper // 使用@Mapper可以简化@MapperScan
//@Repository // 表示该层是持久化
// 继承父类BaseMapper<T> T:是传入实体类
public interface UserMapper extends BaseMapper<User> {
}
传统方式pojo
-dao
(连接mybatis
,配置mapper.xml
文件)-service
-controller
使用mybatis-plus
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
// 参数一个 wapper,条件构造器,默认值为null
// 查询全部用户
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
# 配置日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LWkIeuu-1663317694952)(en-resource://database/573:1)]
@Test
public void TestInsert() {
User user = new User();
user.setName("test");
user.setAge("1");
user.setEmail("test@test.com");
int result = userMapper.insert(user); // 自动生成id
System.out.println(result); // 受影响的行数
System.out.println(user); // 打印的id自动回填
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k0oy29y-1663317694954)(en-resource://database/575:1)]
数据库插入的id默认值唯一
分布式唯一id生成:唯一ID生成算法剖析,看看这篇就够了 - 腾讯云开发者社区-腾讯云 (tencent.com)
默认 ID_WORKER 全局唯一id
雪花算法(snowflake)最早是twitter内部使用分布式环境下的唯一ID生成算法。
主键自增
Table(type=Idtype.Auto)
其余的属性
/** * 数据库ID自增 */ AUTO(0), /** * 该类型为未设置主键类型 */ NONE(1), /** * 用户输入ID * 该类型可以通过自己注册自动填充插件进行填充 */ INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /** * 全局唯一ID (idWorker) */ ID_WORKER(3), /** * 全局唯一ID (UUID) */ UUID(4), /** * 字符串全局唯一ID (idWorker 的字符串表示) */ ID_WORKER_STR(5);
MP会自动将更新操作设置为动态SQL
@Test
public void TestUpdate() {
User user = new User();
// 通过条件自动拼接动态SQL
user.setId(7L);
user.setName("test");
int updateById = userMapper.updateById(user);
System.out.println(updateById);
System.out.println(user);
}
创建、修改时间都可以自动更新。
阿里开发手册:所有的数据库表 => gmt_create、gmt_modified都需要配置,而且需要自动化填充
方式1:数据库级别修改(工作不能动库)
在数据库表中新增字段create_time、update_time
再测一下insert方法,记得同步实体类
private LocalTime createTime;
private LocalTime updateTime;
方式2:代码级别修改
实体类字段添加注解
// 插入时候填充时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
// 插入更新填充时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
编辑一个处理器
@Slf4j @Component // 注册为spring组件 切记 public class MyMetaObjectHandler implements MetaObjectHandler { private final static LocalDateTime DATE_TIME = LocalDateTime.now(); @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill..."); this.setFieldValByName("createTime",DATE_TIME , metaObject); this.setFieldValByName("updateTime", DATE_TIME, metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill..."); this.setFieldValByName("updateTime", DATE_TIME, metaObject); } }
测试插入观察时间
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
数据库新增version
字段默认值为1
同步实体类增加注解@version
// 乐观锁
@Version
private Integer version;
配置config
// 管理事务
@EnableTransactionManagement
@Configuration
public class MybatisConfig {
// 乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
测试
成功:
// 测试乐观锁成功
@Test
public void TestOptimisticLocker() {
// 1. 查询用户信息
User user = userMapper.selectById(1L);
// 2. 修改用户信息
user.setName("test");
user.setEmail("78@qq.com");
// 3. 执行更新操作
userMapper.updateById(user);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。