MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据_百 ...

MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据_百 ...

2023年6月27日发(作者:)

MybatisPlus--CRUD接⼝及主键增长策略、⾃动填充、乐观锁更新数据⽬录⼀、insert1、插⼊操作@RunWith()@SpringBootTestpublic class CRUDTests { @Autowired private UserMapper userMapper; @Test public void testInsert(){ User user = new User(); e("Helen"); (18); il("55317332@"); int result = (user); n(result); //影响的⾏数 n(user); //id⾃动回填 }}注意:数据库插⼊id值默认为:全局唯⼀id2、主键策略(1)ID_WORKERMyBatis-Plus默认的主键策略是:ID_WORKER 全局唯⼀ID(2)⾃增策略要想主键⾃增需要配置如下主键策略需要在创建数据表的时候设置主键⾃增实体字段中配置 @TableId(type = )@TableId(type = )private Long id;要想影响所有实体的配置,可以设置全局主键配置#全局设置主键⽣成策略-type=auto 其它主键策略:分析 IdType 源码可知@Getterpublic 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) { = key; }}⼆、update1、根据Id更新操作注意:update时⽣成的sql⾃动是动态sql:UPDATE user SET age=? WHERE id=?

@Test public void testUpdateById(){ User user = new User(); (1L); (28); int result = ById(user); n(result); }2、⾃动填充项⽬中经常会遇到⼀些数据,每次都使⽤相同的⽅式填充,例如记录的创建时间,更新时间等。我们可以使⽤MyBatis Plus的⾃动填充功能,完成这些字段的赋值⼯作:

(1)数据库表中添加⾃动填充字段在User表中添加datetime类型的新的字段 create_time、update_time(2)实体上添加注解@Datapublic class User { ......

@TableField(fill = ) private Date createTime; //@TableField(fill = ) @TableField(fill = _UPDATE) private Date updateTime;}(3)实现元对象处理器接⼝注意:不要忘记添加 @Component 注解@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler { private static final Logger LOGGER = ger(); @Override public void insertFill(MetaObject metaObject) { ("start insert fill ...."); ldValByName("createTime", new Date(), metaObject); ldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { ("start update fill ...."); ldValByName("updateTime", new Date(), metaObject); }}3、乐观锁主要适⽤场景:当要更新⼀条记录的时候,希望这条记录没有被别⼈更新,也就是说实现线程安全的数据更新乐观锁实现⽅式:取出记录时,获取当前version更新时,带上这个version执⾏更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败 (1)数据库中添加version字段ALTER TABLE `user` ADD COLUMN `version` INT

(2)实体类添加version字段并添加 @Version 注解@Version@TableField(fill = )private Integer version;(3)元对象处理器接⼝添加version的insert默认值@Overridepublic void insertFill(MetaObject metaObject) { ...... ldValByName("version", 1, metaObject);}特别说明:⽀持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime整数类型下 newVersion = oldVersion + 1newVersion 会回写到 entity 中仅⽀持 updateById(id) 与 update(entity, wrapper) ⽅法在 update(entity, wrapper) ⽅法下, wrapper 不能复⽤

(4)在 MybatisPlusConfig 中注册 Bean创建配置类@EnableTransactionManagement@Configuration@MapperScan("s_")public class MybatisPlusConfig { /** * 乐观锁插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }}(5)测试乐观锁可以修改成功测试后分析打印的sql语句,将version的数值进⾏了加1操作/** * 测试 乐观锁插件 */@Testpublic void testOptimisticLocker() { //查询 User user = ById(1L); //修改数据 e("Helen Yao"); il("helen@"); //执⾏更新 ById(user);}此时数据库中的version版本也变为了2三、select1、根据id查询记录@Testpublic void testSelectById(){ User user = ById(1L); n(user);}2、通过多个id批量查询完成了动态sql的foreach的功能@Testpublic void testSelectBatchIds(){ List users = BatchIds((1, 2, 3)); h(::println);}3、简单的条件查询通过map封装查询条件@Testpublic void testSelectByMap(){ HashMap map = new HashMap<>(); ("name", "Helen"); ("age", 18); List users = ByMap(map); h(::println);}注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id4、分页MyBatis Plus⾃带分页插件,只要简单的配置即可实现分页功能(1)在配置类中添加插件/** * 分页插件 */@Beanpublic PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor();}(2)测试selectPage分页测试:最终通过page对象获取相关数据@Testpublic void testSelectPage() { Page page = new Page<>(1,5); Page(page, null); ords().forEach(::println); n(rent()); n(es()); n(e()); n(al()); n(t()); n(vious());}控制台sql语句打印:SELECT id,name,age,email,create_time,update_time FROM user LIMIT 0,5

(3)测试selectMapsPage分页:结果集是Map@Testpublic void testSelectMapsPage() { Page page = new Page<>(1, 5); IPage> mapIPage = MapsPage(page, null); //注意:此⾏必须使⽤ mapIPage 获取记录列表,否则会有数据类型转换错误 ords().forEach(::println); n(rent()); n(es()); n(e()); n(al()); n(t()); n(vious());}四、delete1、根据id删除记录Testpublic void testDeleteById(){ int result = ById(8L); n(result);}2、批量删除 @Test public void testDeleteBatchIds() { int result = BatchIds((8, 9, 10)); n(result); }3、简单的条件查询删除@Testpublic void testDeleteByMap() { HashMap map = new HashMap<>(); ("name", "Helen"); ("age", 18); int result = ByMap(map); n(result);}4、逻辑删除物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录 (1)数据库中添加 deleted字段ALTER TABLE `user` ADD COLUMN `deleted` boolean(2)实体类添加deleted 字段并加上 @TableLogic 注解 和 @TableField(fill = ) 注解@TableLogic@TableField(fill = )private Integer deleted;(3)元对象处理器接⼝添加deleted的insert默认值@Overridepublic void insertFill(MetaObject metaObject) { ...... ldValByName("deleted", 0, metaObject);}(4)ties 加⼊配置此为默认值,如果你的默认值和mp默认的⼀样,该配置可⽆-delete-value=-not-delete-value=0(5)在 MybatisPlusConfig 中注册 Bean@Beanpublic ISqlInjector sqlInjector() { return new LogicSqlInjector();}(6)测试逻辑删除测试后发现,数据并没有被删除,deleted字段的值由0变成了1测试后分析打印的sql语句,是⼀条update注意:被删除数据的deleted 字段的值必须是 0,才能被选取出来执⾏逻辑删除的操作/** * 测试 逻辑删除 */@Testpublic void testLogicDelete() { int result = ById(1L); n(result);}

(7)测试逻辑删除后的查询MyBatis Plus中查询操作也会⾃动添加逻辑删除字段的判断/** * 测试 逻辑删除后的查询: * 不包括被逻辑删除的记录 */@Testpublic void testLogicDeleteSelect() { User user = new User(); List users = List(null); h(::println);}测试后分析打印的sql语句,包含 WHERE deleted=0

SELECT id,name,age,email,create_time,update_time,deleted FROM user WHERE deleted=0

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687816189a47624.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信