mybatisplus
概述
- 简化开发,省略crud代码
- 类似jpa,tk-mapper,
- 在mybatis增强
特性
- 无侵入,损耗小,强大CRUD操作,Lambda,主键生成,全局拦截插件,性能分析插件,分页插件,内置代码生成器,自定义全局通用操作,ActiveRecord
快速入门
建表,依赖,配置,连数据库,代码,
<dependency>
<groupId>com.baomidou</groupId>
<artifictId>mybatis-plus-boot-starter</artifictId>
<version>3.0.5</version>
</dependency>
传统的方式:pojo-dao-service-controller
信方式:pojo,mapper接口,使用
// 主启动类可能需要扫描@MapperScan("xx.xx.mapper")
@Repository
public interface UserMapper extends BaseMapper<User>{
// 已经编写完成,不需要配置文件
}
Autowired UserMapper userMapper;
void test(){
List<User> list = userMapper.selectList(null);// 全部用户
}
配置日志
现在sql不可见,日志可以看到
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.StdOutImpl
CRUD
用户ID会自动插入:全局的唯一id
主键生成策略
uuid,redis生成,雪花算法等等都是用来生成唯一id的
重点:雪花算法,生成long型,分布式唯一id生成
主键自增
1,实体类子段@TableId(type=IdType.AUTO) 主键
IdType.AUTO,NONE,INPUT,ID_WORKER,UUID,ID_WORKER_STR
2,数据库子段自增
userMapper.insert(User);
update
userMapper.updateById(user);
自动填充
-
数据库级别,
- create_time,
- update_time,自动更新,current_timestmp
- 不推荐使用
-
代码级别
-
@TbaleField(fill=FieldFill.INSERT) 自动填充内容
-
@TbaleField(fill=FieldFill.INSERT_UPDATE) 自动更新
-
编写处理器
-
// 通过反射的原理,识别操作,对对象进行修改 @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("insert 创建时间"); this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("update update时间"); this.setFieldValByName("updateTime",new Date(),metaObject); } }
-
-
乐观锁,悲观锁
乐观锁,操作不加锁,操作是否执行由代码配合数据版本号实现,
-
数据库添加version子段,并设置默认值
-
实体类添加字段 @Version注解
-
注册组件
-
@Configuration public class MybatisPlusConfig { // 乐观锁插件 public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } }
-
Select
map.put("name","xxx")
userMapper.selectByMap(map);
分页查询
- limit
- pageHelper
- mybatisplus
// 配置,还使用limit使用的
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//paginationInterceptor.setDialectClazz();
return paginationInterceptor;
}
Page<User> page = new Page<User>(2,5)
userMapper.selectPage(page,null); // 每页5个第二页
page.getRecords()
page.total()
删除
-
与查询类似
-
逻辑删除:数据库中没有被移出
-
数据库增加字段deleted
-
pojo增加字段,@TableLogic
-
配置
-
@Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); }
-
mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
-
-
此时删除操作其实底层是更新操作,数据库记录没有删除,若此时正常条件下查询该记录,是查不到的
-
性能分析插件
有些sql太慢,超时停止,分析sql
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(1);
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
条件构造器
复杂的SQL
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.isNotNull("name").isNotNull("email").ge("age","12");
userMapper.selectList(wrapper);
wrapper.inSql("id","select id from user where id<3")
userMapper.selectObjs(wrapper)
代码生成器
//构建一个代码生成器对象
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String dir = System.getProperty("user.dir");
// 输出路径
gc.setOutputDir(dir+"/src/main/java");
gc.setAuthor("dean");
gc.setOpen(false);
gc.setFileOverride(false);// 是否覆盖
gc.setServiceName("%sService");
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
// 数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl();
dataSourceConfig.setUsername();
dataSourceConfig.setPassword();
dataSourceConfig.setDriverName();
dataSourceConfig.setDbType(DbType.MYSQL);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("blog");
pc.setParent("top.dean");
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
//策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("user","role");
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
strategyConfig.setSuperEntityClass("父类,没有就不设置");
strategyConfig.setEntityLombokModel(true);
strategyConfig.setRestControllerStyle(true);
strategyConfig.setLogicDeleteFieldName("deleted");// 逻辑删除子段
// 自动填充
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_create", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> list = new ArrayList<>();
list.add(gmtCreate);
list.add(gmtModified);
strategyConfig.setTableFillList(list);
// 乐观锁
strategyConfig.setVersionFieldName("version");
strategyConfig.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategyConfig);
mpg.setPackageInfo(pc);
mpg.setDataSource(dataSourceConfig);
mpg.setGlobalConfig(gc);
mpg.execute();
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可评论咨询.