性能分析插件
开发过程中我们会遇到一些运行较慢的SQL,我们需要进行测试,或者使用druid进行操作。
在mybatis-plus中也提供了这样的插件,如果超过就停止运行!
1.导入插件
/** * SQL执行效率插件 */ @Bean @Profile({"dev","test"})//设置dev test环境开启,保证我们的效率 public PerformanceInterceptor performanceInterceptor(){ PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1);//ms毫秒 设置sql执行的最大时间,如果超过了则不执行 performanceInterceptor.setFormat(true);//是否开启格式化(开启) return performanceInterceptor; }
得在springboot中配置环境dev 或者 test环境。
#开发环境 spring.profiles.active=dev
2.测试使用
//测试通过id查询用户 @Test public void selectById(){ SysUser sysUser = userMapper.selectById(1303211966619484161L); System.out.println(sysUser); }
注意:该方法3.0x已经被移除,官方不再推荐使用!
条件构造器
Wrapper:十分重要
我们写的一些复杂的SQL我们可以使用它来代替!
条件构造器官网地址:https://baomidou.com/guide/wrapper.html#abstractwrapper
测试使用:
@SpringBootTest public class WrapperApplication { @Autowired private UserMapper userMapper; //查询name不为空的用户,并且邮箱不为空且年龄大于等于12的用户 @Test public void contextLoads(){ QueryWrapper<SysUser> wrapper=new QueryWrapper<SysUser>(); wrapper.isNotNull("username") .isNotNull("email") .ge("age", 18); List<SysUser> users = userMapper.selectList(wrapper); users.forEach(System.out::println); } //查询名字叫XXX的一个人 @Test public void contextLoads2(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); wrapper.eq("username", "手残"); SysUser sysUser = userMapper.selectOne(wrapper); System.out.println("username = " + sysUser); } //查询年龄在21到30之间的用户 @Test public void contextLoads3_1(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); wrapper.between("age", 21, 30); List<SysUser> user = userMapper.selectList(wrapper);//查询一个数据有结果数据时我们可以使用List 或者 Map user.forEach(System.out::println); } //查询年龄在21到30之间的用户数 @Test public void contextLoads3_2(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); wrapper.between("age", 21, 30);//区间 Integer count = userMapper.selectCount(wrapper);//查询结果数 System.out.println("count = " + count); } //查询名字不含j的而且email以t开头的 @Test public void contextLoads4(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); wrapper.notLike("username", "j") .likeRight("email", "t"); List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println); } //id在子查询查出来 @Test public void contextLoads5(){ QueryWrapper<SysUser> wrapper = new QueryWrapper<>(); wrapper.inSql("user_id", "select user_id from sys_user where user_id < 3"); List<Object> objects = userMapper.selectObjs(wrapper); objects.forEach(System.out::println); } //查询name不为空的用户、并且邮箱不为空、且年龄大于等于16的用户,并按age升序排序 @Test public void contextLoads6(){ QueryWrapper<SysUser> wrapper=new QueryWrapper<SysUser>(); wrapper.isNotNull("username") .isNotNull("email") .ge("age", 12) .orderByAsc("age"); List<SysUser> users = userMapper.selectList(wrapper); users.forEach(System.out::println); } }
代码生成器
1.导入依赖
<!-- 模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.0.5</version> </dependency> <!--Swagger依赖开始--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!--Swagger依赖结束--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
注意:mybatis-plus-generator 版本必须和 mybatis-plus-boot-starter 一致为 3.0.5,不然逻辑删除插件和SQL执行效率插件的@Bean就会出现异常!!!
2.在测试文件test中新建一个文件TestApplication添加代码自动生成器
//代码自动生成器 public class TestApplication { public static void main(String[] args) { //需要构建一个代码自动生成器对象 AutoGenerator autoGenerator = new AutoGenerator(); //配置策略 //全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath=System.getProperty("user.dir");//获取当前系统的目录 “user.dir”用户目录
gc.setOutputDir(projectPath+"/src/main/java");//生成到哪个路径 gc.setAuthor("ljj");//作者名 gc.setOpen(false);//是否打开资源管理器 gc.setFileOverride(false);//是否覆盖 gc.setServiceName("%sService");//去Service的I前缀 gc.setIdType(IdType.AUTO);//设置主键增长策略 gc.setDateType(DateType.ONLY_DATE);//设置日期格式 gc.setSwagger2(true);//开启swagger autoGenerator.setGlobalConfig(gc); //2.设置数据源 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/carddb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10\n"); dsc.setUsername("root"); dsc.setPassword("123456"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setDbType(DbType.MYSQL); autoGenerator.setDataSource(dsc); //3.设置包的位置 PackageConfig pc = new PackageConfig(); pc.setModuleName("test"); pc.setParent("com.ljj"); pc.setEntity("pojo"); pc.setMapper("mapper"); pc.setService("service"); pc.setController("controller"); autoGenerator.setPackageInfo(pc); //4.策略配置 StrategyConfig strategy = new StrategyConfig(); //strategy.setInclude("sys_user");//设置要映射的表名 注释掉就是生成全部 strategy.setNaming(NamingStrategy.underline_to_camel);//设置驼峰命名映射 strategy.setColumnNaming(NamingStrategy.underline_to_camel);//设置驼峰命名映射 strategy.setEntityLombokModel(true);//设置lombok支持 strategy.setLogicDeleteFieldName("deleted"); //自动填充配置 TableFill createTime = new TableFill("create_time", FieldFill.INSERT);//create_time增加填充 TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);//update_time增加或修改填充 ArrayList<TableFill> tableFills = new ArrayList<>(); tableFills.add(createTime); tableFills.add(updateTime); strategy.setTableFillList(tableFills); //乐观锁 strategy.setVersionFieldName("version"); //设置Controller层驼峰命名 strategy.setRestControllerStyle(true); //设置url驼峰命名 // strategy.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2 autoGenerator.setStrategy(strategy); autoGenerator.execute();//执行 } }
3.测试使用
素材来源地址:狂神说 https://www.bilibili.com/video/BV17E411N7KN?p=2
//获取当前用户的目录