springboot+mybatisplus(使用总结,配置总结!!!干货...)
更新!!手把手教你搭建springboot+mybatisplus+lombok
通过代码生成器方式
写在前面的话
- 首先搭建一个springboot项目
- 数据库下文以mysql8为例
- 数据库连接池采用阿里的druid
话不多说,正文开始
1.pom文件引入相关依赖(此处依赖只涉及mybatisplus相关方面)
<!-- mybatisplus插件 https://mvnrepository.com/artifact/com.baomidou/mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!-- freemarker 模板引擎--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-core</artifactId> <version>3.0.7.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.0.7.1</version> </dependency>
2接下来就是propertises文件中相关的配置,这里面的注释应该是比较全的,总结了很多。其中的配置按需索取,没必要的配置大家注释掉就行。
#mysql spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://localhost:3306/school?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.dbcp2.min-idle=5 spring.datasource.dbcp2.initial-size=5 spring.datasource.dbcp2.max-total=5 spring.datasource.dbcp2.max-wait-millis=200 #mybatis-plus # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml # 如果是放在resource目录 classpath:/mapper/*Mapper.xml mybatis-plus.mapper-locations=classpath:/com/springboot/study/mapper/*Mapper.xml #实体扫描,多个package用逗号或者分号分隔 mybatis-plus.type-aliases-package=com.springboot.study.entity #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; mybatis-plus.global-config.id-type=3 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" mybatis-plus.global-config.field-strategy=2 #驼峰下划线转换 mybatis-plus.global-config.db-column-underline=true #mp2.3+ 全局表前缀 mp_ #mybatis-plus.global.table-prefix: mp_ #刷新mapper 调试神器 mybatis-plus.global-config.refresh-mapper=true #数据库大写下划线转换 mybatis-plus.global-config.capital-mode=true # Sequence序列接口实现类配置 mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.OracleKeyGenerator #逻辑删除配置(下面3个配置) mybatis-plus.global-config.logic-delete-value=1 mybatis-plus.global-config.logic-not-delete-value=0 mybatis-plus.global-config.sql-injector=com.baomidou.springboot.MyMetaObjectHandler #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId) mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.configuration.cache-enabled=false #配置JdbcTypeForNull, oracle数据库必须配置 mybatis-plus.configuration.jdbc-type-for-null=null
3.将代码生成器(java文件)放置到项目中,一般放置到根目录下。下面代码粘过来,简单修改一下配置就可使用。其中jsp文件暂时生成不了,可以生成dao,mapper.xml,service,serviceimpl,到controller一整套的代码。其中基本的增删该查都已经封装好。
整理代码遇到的坑
1.mapper文件无法按照自己定义的路径生成,原因在于 /templates/mapper.xml.ftl。网上给出的有 /template/mapper.xml.vm、有
/templates/mapper.xml.vm 、有 /template/mapper.xml.ftl 等等。。。真的是让人很难选择,最后经过多番尝试确定为 /templates/mapper.xml.ftl。之后查了,这是freemarker模板引擎搞得鬼,有兴趣的同学可以查找资料了解一下。
2.还有一个和本文不是太重要的坑,mysql8连接需要指定时区,即在数据库连接url上拼上 ?serverTimezone=Hongkong
3.其他遇到的都是小坑了,具体都已经解决,代码中有相关注释说明
package com.springboot.study.mybatisplus.generator; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.InjectionConfig; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; import com.baomidou.mybatisplus.generator.config.rules.DbType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> * 代码生成器演示 * </p> */ public class MpGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); //整合配置 全局配置+数据源配置+策略配置+包名策略配置 // 选择 freemarker 引擎,默认 Velocity 需要在配置文件引入依赖 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); // 1全局配置 GlobalConfig gc = new GlobalConfig(); gc.setAuthor("zcf"); gc.setOutputDir("D://workspace/study/springboot_mybatisplus_lombok/src/main/java/"); gc.setFileOverride(false);// 是否覆盖同名文件,默认是false gc.setIdType(IdType.AUTO);// 主键策略 gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false gc.setEnableCache(false);// XML 二级缓存 gc.setBaseResultMap(true);// XML ResultMap 生成基本的resultmap gc.setBaseColumnList(false);// XML columList 生成基本的sql片段 /* 自定义文件命名,注意 %s 会自动填充表实体属性! */ gc.setMapperName("%sDao"); gc.setXmlName("%sMapper"); gc.setServiceName("%sService"); gc.se 3ff7 tServiceImplName("%sServiceImpl"); gc.setControllerName("%sController"); mpg.setGlobalConfig(gc); // 2数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); dsc.setTypeConvert(new MySqlTypeConvert() { // 自定义数据库表字段类型转换【可选】 @Override public DbColumnType processTypeConvert(String fieldType) { System.out.println("转换类型:" + fieldType); // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。 return super.processTypeConvert(fieldType); } }); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("password"); dsc.setUrl("jdbc:mysql://localhost:3306/school?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8"); mpg.setDataSource(dsc); // 3策略配置globalConfiguration中 StrategyConfig strategy = new StrategyConfig(); strategy.setEntityLombokModel(true);//实体类以lombok注解氏生产 strategy.setRestControllerStyle(true);//controller以restFule风格 // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意 strategy.setTablePrefix(new String[]{"test_"});// 此处可以修改为您的表前缀 strategy.setNaming(NamingStrategy.nochange);// 表名生成策略 此处可以更换为underline_to_camel 下滑线转驼峰 strategy.setInclude(new String[]{"test_student"}); // 需要生成的表 // strategy.setExclude(new String[]{"test"}); // 排除生成的表 // 自定义实体父类 // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity"); // 自定义实体,公共字段 // strategy.setSuperEntityColumns(new String[] { "test_id", "age" }); // 自定义 mapper 父类 // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper"); // 自定义 service 父类 // strategy.setSuperServiceClass("com.baomidou.demo.TestService"); // 自定义 service 实现类父类 // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl"); // 自定义 controller 父类 // strategy.setSuperControllerClass("com.baomidou.demo.TestController"); // 【实体】是否生成字段常量(默认 false) // public static final String ID = "test_id"; // strategy.setEntityColumnConstant(true); // 【实体】是否为构建者模型(默认 false) // public User setName(String name) {this.name = name; return this;} // strategy.setEntityBuilderModel(true); mpg.setStrategy(strategy); // 4包配置 修改包生成的名称 //pkConfig.setParent("com.imooc") // .setMapper("dao")//dao // .setService("service")//servcie // .setController("controller")//controller // .setEntity("entity") // .setXml("resource");//mapper.xml PackageConfig pc = new PackageConfig(); pc.setParent("com.springboot.study").setController("controller").setMapper("dao"); // pc.setModuleName("test"); mpg.setPackageInfo(pc); // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { Map<String, Object> map = new HashMap<String, Object>(); map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp"); this.setMap(map); } }; // 自定义 xxList.jsp 生成 List<FileOutConfig> focList = new ArrayList<>(); /*focList.add(new FileOutConfig("/template/list.jsp.vm") { @Override public String outputFile(TableInfo tableInfo) { // 自定义输入文件名称 return "D://workspace/study/springboot_mybatisplus_lombok/src/main/webapp/" + tableInfo.getEntityName() + ".jsp"; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg);*/ // 调整 xml 生成目录演示 focList.add(new FileOutConfig("/templates/mapper.xml.ftl") { @Override public String outputFile(TableInfo tableInfo) { return "D://workspace/study/springboot_mybatisplus_lombok/src/main/resources/com/springboot/study/mapper/" + tableInfo.getEntityName()+"Mapper" + ".xml"; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 关闭默认 xml 生成,调整生成 至 根目录 TemplateConfig tc = new TemplateConfig(); tc.setXml(null); mpg.setTemplate(tc); // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改, // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称 // TemplateConfig tc = new TemplateConfig(); // tc.setController("..."); // tc.setEntity("..."); // tc.setMapper("..."); // tc.setXml("..."); // tc.setService("..."); // tc.setServiceImpl("..."); // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。 // mpg.setTemplate(tc); // 执行生成 mpg.execute(); // 打印注入设置【可无】 // System.err.println(mpg.getCfg().getMap().get("abc")); } }
4.上述配置文件修改好配置之后就到了激动人心的时刻,生成代码文件,执行2步骤代码。
这是我的数据库表
这是执行之后生成的项目目录结构,其中我把步骤2中的代码生成器放到了mybatisplus.generator中
5.基本使用
这是我写的controller用来测试使用,其中用到了分页插件new Page<>(1,10),其中1表示的是第几页,10表示的是我要取10条数据,是不是很方便,很easy,很舒服
6.结果展示
其中如果遇到total,pages配置项查出来的数据为0的情况,这种错误情况可能是由下面两种原因引起的.
其一: 项目的pom文件中引入了其他的分页插件,导致两个插件冲突。可以搜索一下自己的pom文件里面是否有下面的这个插件,有的话删除该依赖即可。
pagehelper-spring-boot-starter
其二: 需要在项目中添加如下配置类,重启项目即可。
@Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDialectType("mysql"); return paginationInterceptor; };
总结
最近将mybatisplus2.2.0升级到mybatisplus3.1.0,发现变化还是很大的,也踩了很多坑。记录下来分享给大家。
1.一定要添加下面这个依赖,且版本不能使用2.2.0,推荐使用3.1.0版本的,否则你会发现会一直报错找不到dao中的方法
MyBatis-Plus 从 `3.0.3` 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖: - 添加 代码生成器 依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>latest-version</version> </dependency>
2.修改生成器文件
//dsc.setDbType(DbType.MYSQL); 这行代码可以注释掉了,没测试不注释会不会报错
gc.setIdType(IdType.AUTO);// 主键策略 这里面的idType注意引入的是下面这个包 import com.baomidou.mybatisplus.annotation.IdType;
学习建议
最近我也是翻了许多相关博客内容,但是效果不是很理想。于是上mybatisplus官网上看了看,发现很多问题在官网上都可以解决,建议想要深入了解的同学移步https://mp.baomidou.com,源码包,及相关文档都可以找到。需要点耐心你一定能找到。找不到的同学可以留言评论。
2.2.0查询练习
Page<Chinese> chinesePage1 = chineseService.selectPage(new Page<>(1, 10), new EntityWrapper<Chinese>().setSqlSelect("chinese", "uni")); System.out.println(chinesePage1.toString()); Page<Map<String, Object>> mapPage = chineseService.selectMapsPage(new Page<>(1, 10), new EntityWrapper<Chinese>().setSqlSelect("chinese", "uni")); System.out.println(mapPage); List<Map<String, Object>> chinese = chineseService.selectMaps(new EntityWrapper<Chinese>() .setSqlSelect("chinese")); System.out.println(chinese); Chinese chinese1 = new Chinese(); chinese1.setId("f888b62dc1344a51aa120d8410c97160"); /*多表分页查询*/ Page<Map<String,Object>> studentPage = chineseService.selectStudentListPage(new Page<>(1, 2), chinese1); System.out.println(studentPage); /*// 查询练习之 分页查询 Page<Chinese> chinesePage = chineseService.selectPage(new Page<>(1, 10)); System.out.println(chinesePage.toString()); System.out.println("--------------------------------------------------------------------"); // 查询练习之 自定义dao(通过@select标签) List<Chinese> chinese = chineseService.selectAll(); System.out.println(chinese.toString()); System.out.println("--------------------------------------------------------------------"); // 查询练习 selectOne List<Chinese> chinese2 = chineseDao.selectPage(new Page<Chinese>(1, 3), new EntityWrapper<Chinese>() .eq("id", "38244336880746cfbb46579032bd07ec")); System.out.println(chinese2.toString()); System.out.println("--------------------------------------------------------------------"); // 查询练习之 自带byID查询 Chinese chinese1 = chineseService.selectById("38244336880746cfbb46579032bd07ec"); System.out.println(chinese1.toString()); System.out.println("--------------------------------------------------------------------");*/ return chinese3;
3.1.1查询练习
/*关联查询*/ Surname surname = new Surname(); surname.setId("f888b62dc1344a51aa120d8410c97160"); Page<Map<String, Object>> mapPage = surnameService.selectStudentListPage(new Page(1, 2), surname); System.out.println("多表分页查询:"+ mapPage); /*查询表中name列*/ List<Surname> name = surnameService.list(new QueryWrapper<Surname>().select("name")); System.out.println("查询表中的某列值其他字段返回的都是null" + name); IPage<Map<String, Object>> name1 = surnameService.pageMaps( new Page<>(1, 5), new QueryWrapper<Surname>().select("name")); System.out.println("分页查询表中的某一列值,该种返回不会包括其他字段值:" + name1); /*getMap*/ Map<String, Object> id1 = surnameService.getMap(new QueryWrapper<Surname>() .eq("id", "0056623880974129a601ea39af211cda")); System.out.println("以map形式返回-->getMap:"+id1); List<Map<String, Object>> maps = surnameService.listMaps(); System.out.println("以list<map>形式返回所有-->listMaps:" + maps); List<Surname> id2 = surnameService.list(new QueryWrapper<Surname>() .eq("id", "0056623880974129a601ea39af211cda")); System.out.println("以list<entity>形式返回单个-->listMaps:" + id2); List<Surname> list = surnameService.list(); System.out.println("以list<entity>形式返回所有-->list:" + list); List<Map<String, Object>> maps1 = surnameService.listMaps(new QueryWrapper<Surname>() .eq("id", "0056623880974129a601ea39af211cda") .or().eq("id", "01e8a582f50b4675974dde3c59b5161d")); System.out.println("查询id为他或她的集合对象:"+maps1); /*getOne*/ Surname byId = surnameService.getById("0056623880974129a601ea39af211cda"); System.out.println("通过自带id查询:"+byId); Surname id = surnameService.getOne(new QueryWrapper<Surname>() .eq("id", "01e8a582f50b4675974dde3c59b5161d")); System.out.println("通过new QueryWrapper()条件构造器查询:"+id.toString()); Surname one = surnameService.getOne(new QueryWrapper<Surname>() .eq("name", "仝").eq("uni", "1")); System.out.println("条件构造器查询:"+one); /*分页查询 */ IPage<Surname> page = surnameService.page(new Page<>(1, 10)); System.out.println("分页查询:"+page.toString());
MybatisPlusConfig.java 配置文件,分页插件,多扫描dao,sql语句展示(性能分析器等都在此设置)
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; //import com.baomidou.mybatisplus.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration //@MapperScan("com.baomidou.springboot.mapper*")//这个注解,作用相当于下面的@Bean MapperScannerConfigurer,2者配置1份即可 public class MybatisPlusConfig { /** * SQL输出拦截器,性能分析器,不建议生产环境使用,开发环境使用(方便) */ @Bean public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); //sql格式化 performanceInterceptor.setFormat(true); return performanceInterceptor; } /** * mybatis-plus分页插件<br> * 文档:http://mp.baomidou.com<br> */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); //paginationInterceptor.setDiale 8000 ctType("mysql"); //指定数据库类型,不写自动匹配 return paginationInterceptor; }; //@Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer(); scannerConfigurer.setBasePackage("com.baomidou.springboot.mapper*"); return scannerConfigurer; } }
- spring boot使用总结(六)spring boot+mybatis配置多数据库
- Spring Boot通过Mybatis,使用mapper接口和xml配置sql,连接数据库
- 记录SpringBoot使用Druid和Mybatis配置
- Spring Boot学习(九)之Spring Boot中使用MyBatis注解配置详解
- 企业分布式微服务云SpringCloud SpringBoot mybatis (十四)Spring Boot中使用MyBatis注解配置详解
- 使用IDEA构建Spring boot2.0+版本+MyBatis(properties文件配置)
- Spring Cloud Spring Boot mybatis分布式微服务云架构(三十四)注解配置与EhCache使用(2)
- Spring Boot教程(三十八)使用MyBatis注解配置详解(1)
- springboot + Mybatis Plus配置多数据源
- spring boot 1.5.6 配置mybaits-plus 多模块配置 ,出现的问题 总结
- SpringBoot 使用yml配置 mybatis+pagehelper+druid+freemarker实例
- 初学Spring boot + mybatis-plus 配置
- Spring Cloud Spring Boot mybatis分布式微服务云架构(二十七)使用MyBatis注解配置详解(2)
- 架构实战项目心得(七):使用SpringBoot+Dubbo+Mybatisplus+Oracle搭建后台项目框架(二)
- Spring Cloud Spring Boot mybatis分布式微服务云架构(二十六)使用MyBatis注解配置详解(1)
- 架构实战项目心得(七):使用SpringBoot+Dubbo+Mybatisplus+Oracle搭建后台项目框架(一)
- 使用Spring Boot搭配mybatis配置项目
- Spring Boot中使用MyBatis注解配置详解
- spring boot多数据源mybatis-plus的baseMapper的里面的方法无法使用
- MyBatis-Spring-Boot 使用总结