本文介绍了使用Mybatisplus进行数据库表的增删改查、主键生成、自动填充、乐观锁、性能测试知识,仅作入门学习,供项目使用。更多参考官方文档:https://mp.baomidou.com/guide/
环境准备
创建SpringBoot项目
1 导入依赖
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> <exclusions> <exclusion> <groupId>org.junit.vintagegroupId> <artifactId>junit-vintage-engineartifactId> exclusion> exclusions> dependency> <dependency> <groupId>com.baomidougroupId> <artifactId>mybatis-plus-boot-starterartifactId> <version>3.0.5version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build>
2 新建数据库表
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');
3 编写application.properties配置文件
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?&characterEncoding=utf8&serverTimezone=GMT%2B8serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=root#mybatis日志mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
4 安装lombok插件(可选)
5 创建包entity编写User实体类
@Datapublic class User { private Long id; private String name; private Integer age; private String email;}
6 创建包mapper编写Mapper 接口
@Repositorypublic interface UserMapper extends BaseMapper<User> {}
7 创建config包编写myConfig配置类,将6中的mapper包引入
@MapperScan("com.zhu.mpdemo.mapper")@Configurationpublic class mpConfig {}
准备完毕!开始入门!
1 增加insert
@Testpublic void addUser() { User user = new User(); user.setName("跳跳"); user.setAge(28); user.setEmail("200@qq.com"); int insert = userMapper.insert(user); System.out.println(insert);}
2 删除delete
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除。
按照Id删除deleteById
//按Id删除@Testpublic void deleteUser() { int i = userMapper.deleteById(7L); System.out.println(i);}
按照Id批量删除deleteBatchIds
//按Id批量删除@Testpublic void deleteBatchUser() { int i = userMapper.deleteBatchIds(Arrays.asList(6L, 8L, 4L)); System.out.println(i);}
按照Map批量删除deleteByMap
//按Map条件删除@Testpublic void deleteByMap() { HashMapmap = new HashMap<>(); map.put("name","Tom"); map.put("age",28); int i = userMapper.deleteByMap(map); System.out.println(i);}
逻辑删除
将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
数据库表添加字段version,设置默认值为0,0表示保留,1表示删除
也可以在application.properties自定义代表逻辑删除的值,MybatisPlus3.0.5版本默认0表示保留,1表示删除。
mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0
myconfig配置文件添加逻辑删除插件
//逻辑删除插件@Beanpublic ISqlInjector sqlInjector() { return new LogicSqlInjector();}
实体类添加@TableLogic注解
@TableLogicprivate Integer deleted;
//逻辑删除@Testpublic void logicDelete() { int i = userMapper.deleteById(9L); System.out.println(i);}
实际执行的是UPDATE
再次查询,逻辑删除的记录还在表中,但已查不到
3 更新updateById
@Testpublic void updateUser() { User user = new User(); user.setId(7L); user.setAge(28); user.setEmail("111@qq.com"); int i = userMapper.updateById(user); System.out.println(i);}
4 查询select
查询所有selectList
@Testpublic void selectList() { List users = userMapper.selectList(null); for (User user : users) { System.out.println(user); }}
按照Id查询selectById
@Testpublic void selectById() { User user = userMapper.selectById(1L); System.out.println(user);}
按照Id批量查询selectBatchIds
//批量查询@Testpublic void testSelectBatchIds() { List users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); for (User user : users) { System.out.println(user); }}
分页查询selectPage
myconfig中添加分页插件
//分页插件@Beanpublic PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor();}
//分页查询@Testpublic void testSelectPage() { //页数,记录数 Page page = new Page<>(1, 5); userMapper.selectPage(page, null); //查询到的记录 System.out.println("查询到的记录"); List records = page.getRecords(); for (User record : records) { System.out.println(record); } //当前页 System.out.println("当前页:"+page.getCurrent()); //总页数 System.out.println("总页数:"+page.getPages()); //每页显示的记录数 System.out.println("每页显示的记录数:"+page.getSize()); //总记录数 System.out.println("总记录数:"+page.getTotal()); //当前页是否有下一页 System.out.println("当前页是否有下一页:"+page.hasNext()); //当前页是否有上一页 System.out.println("当前页是否有上一页:"+page.hasPrevious());}
复杂条件查询
对于联表查询,还是需要Mybatis中XML来操作。
常用的是QueryWrapper类,其中的方法如下:
ge
@Testpublic void testQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); //查询所有age>=24 queryWrapper.ge("age", 24); List users = userMapper.selectList(queryWrapper); for (User user : users) { System.out.println(user); }
between
@Testpublic void testQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); //查询20到25之间 queryWrapper.between("age",20,25); List users = userMapper.selectList(queryWrapper); for (User user : users) { System.out.println(user); }
模糊查询
@Testpublic void testQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("name","大"); List users = userMapper.selectList(queryWrapper); for (User user : users) { System.out.println(user); }
查询指定列
@Testpublic void testQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name", "age"); List users = userMapper.selectList(queryWrapper); for (User user : users) { System.out.println(user); }
5 Mybatis-Plus3.0.5主键生成策略
public enum IdType { AUTO(0), //数据库ID自增 NONE(1), //表示该类型未设置主键类型 INPUT(2), //用户输入ID ID_WORKER(3), //数值类型全局唯一ID,内容为空自动填充(默认配置) UUID(4), //全局唯一ID,内容为空自动填充 ID_WORKER_STR(5); //字符串全局唯一ID}
可以在数据库设置主键自增或者在Id添加注解
@TableId(type = IdType.AUTO)private Long id;
6 自动填充
一些数据每次都使用相同的方式填充,例如记录的创建时间,更新时间等,可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。
数据库表中添加自动填充字段在User表中添加datetime类型的新的字段 create_time、update_time
@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;
创建handler包编写MyMetaObjectHandler类
@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); }}
@Testpublic void updateUser() { User user = new User(); user.setId(9L); user.setAge(28); user.setEmail("111@qq.com"); int i = userMapper.updateById(user); System.out.println(i);}
7 乐观锁
当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新乐观锁实现方式。
取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败。
表中添加version列
@Versionprivate Integer version;
myconfig中添加乐观锁插件
//乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor();}
@Testpublic void addUser1() { //测试乐观锁,先查再改 User user = userMapper.selectById(8L); user.setAge(3); userMapper.updateById(user);}
8 性能测试
myconfig配置文件中配置
@Bean@Profile({"dev", "test"})// 设置 dev test 环境开启public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(500);//ms,超过此处设置的ms则sql不执行 performanceInterceptor.setFormat(true); return performanceInterceptor;}
其中,参数含义
maxTime:SQL 执行最大时长,超过自动停止运行,有助于发现问题。format:SQL是否格式化,默认false。
SQL格式化使结构更加清晰规范。
在application.properties中配置环境
#环境设置:dev、test、prodspring.profiles.active=dev
随便执行一条语句测试,在maxTime范围内,可以执行,否则不执行。
性能测试可以识别出需要优化的sql语句。