MyBatisPlus MyBatis-Plus
默认
依赖 <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.47</version > </dependency > <dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-boot-starter</artifactId > <version > 3.4.2</version > </dependency >
快速开始 配置连接 mapper接口
@Repository public interface UserMapper extends BaseMapper <User> { }
使用 List<User> users = userMapper.selectList(null );
配置日志 mybatis-plus.configuration.log-impl =org.apache.ibatis.logging.stdout.StdOutImpl
注解 @TableField(select = false) @TableField(value = "email") @TableField(exist = false)
CRUD拓展
insert int insert = userMapper.insert(user);
数据库插入的id的默认值:全局的唯一id
主键生成策略
默认 ID_WORKER全局唯一id
1、方式一:默认雪花算法
snowflake是Twitter开源的分布式lD生成算i法,结果是一s个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的is(5个bit是数据中心,5个bit的机器引D),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一 !
2、方式二:注解配置规则
主键自增
public enum IdType { AUTO(0 ), NONE(1 ), INPUT(2 ), ID_WORKER_STR(3 ), ASSIGN_UUID(4 ) }
实体类字段加注解:**@TableId(type = IdType.策略)** — 数据库对应的字段也必须要自增
@TableId(type = IdType.AUTO) private Long id; @TableId(type = IdType.INPUT)
update
可动态判断当前的参数是否为null,!null->update
int i = userMapper.updateById(user);
自动填充
创建时间、修改时间 (gmt_create , gmt_modified)
方式一:数据库级别
1、新增 create_time 、 update_time
2、实体类同步
private Date createTime;private Date updateTime;
3、数据库级别会对修改的数据的修改时间进行自动化更新
方式二:代码级别
1、删除数据库的字段的默认值操作
2、实体类需要自动填充的字段上添加注解:**@TableField(fill = FieldFill.何时填充)**
@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;
3、实现类
@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()); this .strictInsertFill(metaObject, "updateTime" , LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill (MetaObject metaObject) { log.info("start update fill ...." ); this .strictUpdateFill(metaObject, "updateTime" , LocalDateTime.class, LocalDateTime.now()); } }
乐观锁
乐观锁 :故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试
悲观锁 :故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
测试MybatisPlus乐观锁插件
1、数据库表增加字段 version
2、实体类对应的字段加注解 : @Version //乐观锁注解
@Version private Integer version;
3、配置插件
@MapperScan("com.chen.demo.mapper") @EnableTransactionManagement @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor () { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor (); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor ()); return interceptor; } }
4、Test
User user = userMapper.selectById(1L );user.setAge(188888 ); User user2 = userMapper.selectById(1L );user2.setAge(28888888 ); userMapper.updateById(user2); userMapper.updateById(user);
select List<User> users = userMapper.selectList(null ); User user = userMapper.selectById(1L );List<User> users = userMapper.selectBatchIds(Arrays.asList(1 , 2 , 3 , 4 , 5 )); HashMap<String, Object> map = new HashMap <>(); map.put("name" ,"辰" ); List<User> users = userMapper.selectByMap(map);
分页查询 1、拦截器配置类
@MapperScan("com.chen.demo.mapper") @EnableTransactionManagement @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor () { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor (); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor ()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor (DbType.MYSQL)); return interceptor; } }
2、使用
Page<User> page = new Page <>(2 ,2 ); userMapper.selectPage(page,null ); page.getPages(); page.getTotal(); page.getCurrent(); page.getRecords();
删除 userMapper.deleteById(1L ); userMapper.deleteBatchIds(Arrays.asList(1 ,2 ,3 )); HashMap<String, Object> map = new HashMap <>(); map.put("email" ,"99999999999999@qq/com" ); userMapper.deleteByMap(map);
逻辑删除
物理删除:从数据库中直接移除
逻辑删除:再数据库中没有被移除,而是通过一个变量来让他失效!deleted = 0 => deleted = 1
1、数据库表增加删除字段:deleted
2、实体类字段增加注解:**@TableLogic**
@TableLogic private Integer deleted;
3、配置插件
mybatis-plus: global-config: db-config: logic-delete-field: flag logic-delete-value: 1 logic-not-delete-value: 0
4、使用
userMapper.deleteById(1 );
本质上执行更新操作,把标记为删除的字段更改而已
查询的时候,会增加判断是否删除条件
条件构造器【*】
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper .isNotNull("name" ) .isNotNull("email" ) .ge("age" ,12 ); userMapper.selectList(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper.eq("name" ,"辰" ); userMapper.selectOne(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper.between("age" ,1 ,7 ); Integer integer = userMapper.selectCount(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper .notLike("name" ,"c" ) .likeLeft("name" ,"辰" ); List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println);
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper.orderByDesc("id" ); List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println);
QueryWrapper<User> wrapper = new QueryWrapper <>(); wrapper.inSql("id" ,"select id from user where id < 3" ); List<Object> objects = userMapper.selectObjs(wrapper); objects.forEach(System.out::println);
通过方法引用的方式来使用实体字段名的操作,不需要手动写字段名防止写错
LambdaQueryWrapper<User> lambda3 = Wrappers.<User>lambdaQuery(); lambda3.like(User::getName, "雨" ).lt(User::getAge, 40 ); List<User> users = userMapper.selectList(lambda3);
代码生成器
<dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-generator</artifactId > <version > 3.5.0</version > </dependency >
public class CCode { public static void main (String[] args) { AutoGenerator mpg = new AutoGenerator (); GlobalConfig gc = new GlobalConfig (); String projectPath = System.getProperty("user.dir" ); gc.setOutputDir(projectPath+"/src/main/java" ); gc.setAuthor("ccc" ); gc.setOpen(false ); gc.setFileOverride(false ); gc.setServiceName("%sService" ); gc.setIdType(IdType.ID_WORKER); gc.setDateType(DateType.ONLY_DATE); gc.setSwagger2(true ); mpg.setGlobalConfig(gc); DataSourceConfig dsc = new DataSourceConfig (); dsc.setUrl("jdbc:mysql://localhost:3306/kuang_community? useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8" ); dsc.setDriverName("com.mysql.cj.jdbc.Driver" ); dsc.setUsername("root" ); dsc.setPassword("123456" ); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); PackageConfig pc = new PackageConfig (); pc.setModuleName("blog" ); pc.setParent("com.kuang" ); pc.setEntity("entity" ); pc.setMapper("mapper" ); pc.setService("service" ); pc.setController("controller" ); mpg.setPackageInfo(pc); StrategyConfig strategy = new StrategyConfig (); strategy.setInclude("blog_tags" ,"course" ,"links" ,"sys_settings" ,"user_record" ," user_say" ); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true ); strategy.setLogicDeleteFieldName("deleted" ); TableFill gmtCreate = new TableFill ("gmt_create" , FieldFill.INSERT); TableFill gmtModified = new TableFill ("gmt_modified" , FieldFill.INSERT_UPDATE); ArrayList<TableFill> tableFills = new ArrayList <>(); tableFills.add(gmtCreate); tableFills.add(gmtModified); strategy.setTableFillList(tableFills); strategy.setVersionFieldName("version" ); strategy.setRestControllerStyle(true ); strategy.setControllerMappingHyphenStyle(true ); mpg.setStrategy(strategy); mpg.execute(); } }