MyBatisPlus
快速入门 使用第三方组件:
- 导入对应的依赖
- 研究依赖如何配置
- 代码如何编写
- 提高扩展技术能力
步骤
-
创建数据库
-
编写项目,初始化项目 使用
springboot
初始化 -
导入依赖
-
连接数据库
-
传统方式:pojo--dao(mybatis,mapper.xml)--service--controller
-
使用了mybatis-plus后
- pojo
- mapper接口
- main 添加扫描包注解
- 测试类
-
配置日志
-
CRUD扩展
-
插入操作
User user = new User(); user.setUsername("zhangsan"); //1774720336040734721 user.setPassword("123456"); user.setEmail("1234562"); user.setPhone("1234562"); user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(LocalDateTime.now()); user.setStatus(1); user.setBalance(100); int insert = userMapper.insert(user);
-
主键生成策略: 数据库字段自增,实体类字段上加: @TableId(value = "id", type = IdType.ASSIGN_ID)
AUTO(0), // 数据库id自增 NONE(1), // 未设置主键 INPUT(2), // 手动输入 ID_WORKER(3), // 默认的全局唯一id UUID(4), // 全局唯一id uuid ID_WORKER_STR(5); //ID_WORKER 字符串表示法
-
更新操作
User user = new User(); user.setId(29L); user.setUsername("zhangsan"); user.setAge(20); int i = userMapper.updateById(user);
-
自动填充时间
baocuo
☕字段属性添加注解 @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间") private LocalDateTime createtime; @TableField(fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value = "修改时间") private LocalDateTime updatetime; @Component public class MyMetaObjectHandler implements MetaObjectHandler { //插入时的填充策略 @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill......"); //this.setFieldValByName("createTime",new Date(),metaObject); //this.setFieldValByName("updateTime",new Date(),metaObject); } //更新时的填充策略 @Override public void updateFill(MetaObject metaObject) { log.info("start update fill......"); //this.setFieldValByName("updateTime",new Date(),metaObject); } }
-
乐观锁
乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,
再次更新值测试
悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
//字段添加注解 @Version //乐观锁注解 @ApiModelProperty(value = "版本号") private Integer version; @MapperScan("com.ishop.mapper") @EnableTransactionManagement @Configuration //配置类 public class MyBatisPlusConfig { @Bean //注册乐观锁插件 public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
-
查询操作
批量查询:userMapper.selectBatchIds(Arrays.asList(1,2,3))
map查询:usermapper.selectByMap(map)
-
分页操作
-
原始Limit分页
-
pageHelper第三方插件分页
-
MP其实也内置了分页插件
-
-
删除操作
userMapper.deleteById(1L); userMapper.deleteBatchIds(Array.asList(1L,2L)); HashMap<String,Object> map=new HashMap<>(); map.put("name","zhangsan"); userMapper.deleteByMap(map);
-
逻辑删除
物理删除 :从数据库中直接移除
逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1
字段添加注解 @TableLogic //逻辑删除 @ApiModelProperty(value = "使用状态(1正常 2删除)") private Integer status; 配置文件: logic-delete-value: 1 #逻辑删除 logic-not-delete-value: 0 @Test public void testDeleteByIDS(){ userMapper.deleteById(1L); }
-
性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间
MP也提供性能分析插件,如果超过这个时间就停止运行!
执行sql超过了时间就抛出异常,可以帮助我们提供工作效率
-
条件构造器
Wrapper我们写一些复杂的sql就可以使用它来替代!
几乎有所有的条件:
allEq,eq,ne,gt,lt,ge,le,between,notBetween,like,notLike,likeLeft,likeRight,isNull,isNotNull,in notIn,groupBy,orderByAsc,orderByDesc,having,and,or@Test void testWrapper(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.isNotNull("username") .isNotNull("email") .ge("age",12) .eq("username","zhangsan31"); userMapper.selectList(userWrapper).forEach(System.out::println); } @Test void testWrapper2(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.inSql("id","select id from user where id<30"); List<User> users = userMapper.selectList(userWrapper); users.forEach(System.out::println); } @Test void testWrapper3(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.orderByAsc("id"); List<User> users = userMapper.selectList(userWrapper); users.forEach(System.out::println); }
-
代码自动生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、
Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
//
代码自动生成器
public class KuangCode {public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor("XXX");
gc.setOpen(false);
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/XXX_DB?
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);
//3、包的配置
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);
//4、策略配置
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); // 自动lombok;
strategy.setLogicDeleteFieldName("deleted");
// 自动填充配置
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_modified",
FieldFill.INSERT_UPDATE);
ArrayList
tableFills = new ArrayList<>(); tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
// 乐观锁
strategy.setVersionFieldName("version");strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); //
localhost:8080/hello_id_2
mpg.setStrategy(strategy);
mpg.execute(); //执行
}
}
-