赞
踩
目录
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class CRUDTests {
-
- @Autowired
- private UserMapper userMapper;
-
- @Test
- public void testInsert(){
-
- User user = new User();
- user.setName("Helen");
- user.setAge(18);
- user.setEmail("55317332@qq.com");
-
- int result = userMapper.insert(user);
- System.out.println(result); //影响的行数
- System.out.println(user); //id自动回填
- }
- }
注意:数据库插入id值默认为:全局唯一id
(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
参考资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html
- @TableId(type = IdType.AUTO)
- private Long id;
要想影响所有实体的配置,可以设置全局主键配置
- #全局设置主键生成策略
- mybatis-plus.global-config.db-config.id-type=auto
其它主键策略:分析 IdType 源码可知
- @Getter
- public enum IdType {
- /**
- * 数据库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);
-
- private int key;
-
- IdType(int key) {
- this.key = key;
- }
- }
- @Test
- public void testUpdateById(){
-
- User user = new User();
- user.setId(1L);
- user.setAge(28);
-
- int result = userMapper.updateById(user);
- System.out.println(result);
-
- }
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
(2)实体上添加注解
- @Data
- public class User {
- ......
-
- @TableField(fill = FieldFill.INSERT)
- private Date createTime;
-
- //@TableField(fill = FieldFill.UPDATE)
- @TableField(fill = FieldFill.INSERT_UPDATE)
- private Date updateTime;
- }
(3)实现元对象处理器接口
注意:不要忘记添加 @Component 注解
- @Component
- public class MyMetaObjectHandler implements MetaObjectHandler {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
-
- @Override
- public void insertFill(MetaObject metaObject) {
- LOGGER.info("start insert fill ....");
- this.setFieldValByName("createTime", new Date(), metaObject);
- this.setFieldValByName("updateTime", new Date(), metaObject);
- }
-
- @Override
- public void updateFill(MetaObject metaObject) {
- LOGGER.info("start update fill ....");
- this.setFieldValByName("updateTime", new Date(), metaObject);
- }
- }
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
(1)数据库中添加version字段
ALTER TABLE `user` ADD COLUMN `version` INT
- @Version
- @TableField(fill = FieldFill.INSERT)
- private Integer version;
(3)元对象处理器接口添加version的insert默认值
- @Override
- public void insertFill(MetaObject metaObject) {
- ......
- this.setFieldValByName("version", 1, metaObject);
- }
特别说明:
newVersion = oldVersion + 1
newVersion
会回写到 entity
中updateById(id)
与 update(entity, wrapper)
方法update(entity, wrapper)
方法下, wrapper
不能复用!!!- @EnableTransactionManagement
- @Configuration
- @MapperScan("com.atguigu.mybatis_plus.mapper")
- public class MybatisPlusConfig {
-
- /**
- * 乐观锁插件
- */
- @Bean
- public OptimisticLockerInterceptor optimisticLockerInterceptor() {
- return new OptimisticLockerInterceptor();
- }
- }
(5)测试乐观锁可以修改成功
测试后分析打印的sql语句,将version的数值进行了加1操作
- /**
- * 测试 乐观锁插件
- */
- @Test
- public void testOptimisticLocker() {
-
- //查询
- User user = userMapper.selectById(1L);
- //修改数据
- user.setName("Helen Yao");
- user.setEmail("helen@qq.com");
- //执行更新
- userMapper.updateById(user);
- }
此时数据库中的version版本也变为了2
- @Test
- public void testSelectById(){
-
- User user = userMapper.selectById(1L);
- System.out.println(user);
- }
完成了动态sql的foreach的功能
- @Test
- public void testSelectBatchIds(){
-
- List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
- users.forEach(System.out::println);
- }
通过map封装查询条件
- @Test
- public void testSelectByMap(){
-
- HashMap<String, Object> map = new HashMap<>();
- map.put("name", "Helen");
- map.put("age", 18);
- List<User> users = userMapper.selectByMap(map);
-
- users.forEach(System.out::println);
- }
注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
(1)在配置类中添加插件
- /**
- * 分页插件
- */
- @Bean
- public PaginationInterceptor paginationInterceptor() {
- return new PaginationInterceptor();
- }
- @Test
- public void testSelectPage() {
-
- Page<User> page = new Page<>(1,5);
- userMapper.selectPage(page, null);
-
- page.getRecords().forEach(System.out::println);
- 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());
- }
控制台sql语句打印:SELECT id,name,age,email,create_time,update_time FROM user LIMIT 0,5
(3)测试selectMapsPage分页:结果集是Map
- @Test
- public void testSelectMapsPage() {
-
- Page<User> page = new Page<>(1, 5);
-
- IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null);
-
- //注意:此行必须使用 mapIPage 获取记录列表,否则会有数据类型转换错误
- mapIPage.getRecords().forEach(System.out::println);
- 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());
- }
- Test
- public void testDeleteById(){
-
- int result = userMapper.deleteById(8L);
- System.out.println(result);
- }
- @Test
- public void testDeleteBatchIds() {
-
- int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));
- System.out.println(result);
- }
- @Test
- public void testDeleteByMap() {
-
- HashMap<String, Object> map = new HashMap<>();
- map.put("name", "Helen");
- map.put("age", 18);
-
- int result = userMapper.deleteByMap(map);
- System.out.println(result);
- }
(1)数据库中添加 deleted字段
ALTER TABLE `user` ADD COLUMN `deleted` boolean
(2)实体类添加deleted 字段
并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解
- @TableLogic
- @TableField(fill = FieldFill.INSERT)
- private Integer deleted;
(3)元对象处理器接口添加deleted的insert默认值
- @Override
- public void insertFill(MetaObject metaObject) {
- ......
- this.setFieldValByName("deleted", 0, metaObject);
- }
(4)application.properties 加入配置
此为默认值,如果你的默认值和mp默认的一样,该配置可无
- mybatis-plus.global-config.db-config.logic-delete-value=1
- mybatis-plus.global-config.db-config.logic-not-delete-value=0
(5)在 MybatisPlusConfig 中注册 Bean
- @Bean
- public ISqlInjector sqlInjector() {
- return new LogicSqlInjector();
- }
(6)测试逻辑删除
- /**
- * 测试 逻辑删除
- */
- @Test
- public void testLogicDelete() {
-
- int result = userMapper.deleteById(1L);
- System.out.println(result);
- }
(7)测试逻辑删除后的查询
MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
- /**
- * 测试 逻辑删除后的查询:
- * 不包括被逻辑删除的记录
- */
- @Test
- public void testLogicDeleteSelect() {
- User user = new User();
- List<User> users = userMapper.selectList(null);
- users.forEach(System.out::println);
- }
测试后分析打印的sql语句,包含 WHERE deleted=0
SELECT id,name,age,email,create_time,update_time,deleted FROM user WHERE deleted=0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。