当前位置:   article > 正文

SpringBoot整合Mybatis-Plus_springboot配置mybatisplus

springboot配置mybatisplus

目录

1. 简介

2.特点

3. MP快速入门

3.1 数据库准备

 3.2 依赖导入

3.3 application.properties配置文件

3.4 实体类User

3.5 表的Dao接口 UserDao

3.6 单元测试

3.7 CRUD操作

3.7.1 添加操作

3.7.2 删除操作

3.7.3 修改操作

3.7.4 查询

3.8 分页查询

3.8.1 单表分页查询

3.8.2 联表分页查询

 3.8.2.1 实体类

3.8.2.2 Mybatis-PlusConfig配置类

3.8.2.3 dao层

3.8.2.4 UserMapper.xml

3.8.2.5 测试

4. MP代码生成器

4.1 引入依赖

4.2 创建CodeGenerator代码生成器

4.3 代码生成器内容修改


1. 简介

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

2.特点

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现==单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询.
  • 分页插件支持多种数据库:支持 MySQL[阿里巴巴]、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

3. MP快速入门

3.1 数据库准备

  1. DROP TABLE IF EXISTS user;
  2. CREATE TABLE user
  3. (
  4. id BIGINT(20) NOT NULL COMMENT '主键ID',
  5. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  6. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
  7. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
  8. PRIMARY KEY (id)
  9. );
  10. DELETE FROM user;
  11. INSERT INTO user (id, name, age, email) VALUES
  12. (1, 'Jone', 18, 'test1@baomidou.com'),
  13. (2, 'Jack', 20, 'test2@baomidou.com'),
  14. (3, 'Tom', 28, 'test3@baomidou.com'),
  15. (4, 'Sandy', 21, 'test4@baomidou.com'),
  16. (5, 'Billie', 24, 'test5@baomidou.com');

 3.2 依赖导入

  1. <dependencies>
  2. <!--mp依赖-->
  3. <dependency>
  4. <groupId>com.baomidou</groupId>
  5. <artifactId>mybatis-plus-boot-starter</artifactId>
  6. <version>3.3.2</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>mysql</groupId>
  14. <artifactId>mysql-connector-java</artifactId>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.projectlombok</groupId>
  18. <artifactId>lombok</artifactId>
  19. <optional>true</optional>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-test</artifactId>
  24. <scope>test</scope>
  25. </dependency>
  26. </dependencies>

3.3 application.properties配置文件

  1. #数据源信息
  2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. # characterEncoding防止您添加到数据的数据出现乱码。
  4. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
  5. spring.datasource.username=root
  6. spring.datasource.password=970812
  7. #指定映射文件的路径--链表操作
  8. mybatis.mapper-locations=classpath:mapper/*.xml
  9. #sql日志
  10. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3.4 实体类User

  1. @Data
  2. @TableName(value = "tbl_user") //如果没有添加该注解默认实体类映射对应的表名
  3. public class User {
  4. @TableId(value = "id",type = IdType.AUTO) //标记该属性为表的主键列,属性名和主键列名映射
  5. private long uid;
  6. @TableField(value = "name") //让属性名和列名映射
  7. private String username;
  8. private Integer age;
  9. private String email;
  10. @TableField(exist = false) //标记数据库中没有与之对应的列
  11. private String hobby; //属性在数据库中不存在
  12. }

3.5 表的Dao接口 UserDao

  1. @Mapper
  2. public interface UserDao extends BaseMapper<User> {
  3. }

3.6 单元测试

                ----根据id查询

  1. @Autowired
  2. private UserDao userDao;
  3. @Test
  4. void testById() {
  5. //根据id查找员工
  6. User user = userDao.selectById(1);
  7. System.out.println(user);
  8. }

3.7 CRUD操作

3.7.1 添加操作

  1. @Autowired
  2. private UserDao userDao;
  3. @Test
  4. void testSave() {
  5. //添加
  6. User user = new User();
  7. user.setUsername("王五");
  8. user.setAge(15);
  9. user.setEmail("123@qq.com");
  10. int insert = userDao.insert(user);
  11. System.out.println("影响行数" + insert);
  12. }

注意:

        mp会自动为主键生成值,默认按照雪花算法【得到的值100%不会重复】。能否修改主键的生成策略.---能---如果想使用主键自增必须要求数据库中表的主键是递增模式。

  1. /**
  2. * AUTO(0),递增 按照数据库表的主键递增模式
  3. * NONE(1),人为输入id值
  4. * INPUT(2),人为输入id值
  5. * ASSIGN_ID(3),默认的算法。雪花算法
  6. * ASSIGN_UUID(4),按照UUID生成---字符串
  7. */
  8. @TableId(type = IdType.AUTO) ---实体类中写入该注解

3.7.2 删除操作

  1. @Test
  2. void delete() {
  3. //根据主键删除
  4. // int i = userDao.deleteById(9);
  5. // System.out.println("影响的行数:"+i);
  6. //批量删除
  7. // List<Integer> ids = Arrays.asList(1, 2, 7, 8);
  8. // int i = userDao.deleteBatchIds(ids);
  9. // System.out.println("影响的行数:" + i);
  10. UpdateWrapper<User> wrapper = new UpdateWrapper<>();//修改的条件构造器
  11. //wrapper.eq("name","张三"); //name="张三"
  12. wrapper.like("name","张"); //模糊查询
  13. //wrapper.gt("age", 18); //大于18 ge:大于等于 lt:小于 le:小于等于 ne:不等于
  14. //wrapper.between("age", 12, 15); //年龄区间:11-15之间
  15. userDao.delete(wrapper); //Wrapper对象:它是条件构造器

3.7.3 修改操作

  1. @Test
  2. void testUpdate(){
  3. //修改操作
  4. User user = new User();
  5. user.setUid(3);
  6. user.setUsername("辉辉");
  7. user.setAge(11);
  8. user.setEmail("123@qq.com");
  9. int i = userDao.updateById(user);
  10. System.out.println("受影响的行数:"+i);
  11. }

3.7.4 查询

  1. @Test
  2. void testSelect(){
  3. //批量查询
  4. // List<Integer> ids = Arrays.asList(1,2,4);
  5. // List<User> users = userDao.selectBatchIds(ids);
  6. // System.out.println(users);
  7. //根据条件查询,如果传递的对象为null,则查询全部
  8. // List<User> users = userDao.selectList(null);
  9. // System.out.println(users);
  10. //条件查询
  11. QueryWrapper<User> wrapper = new QueryWrapper<>();
  12. wrapper.select("name","age"); //查询指定列的值
  13. wrapper.orderByDesc("age");//排序
  14. wrapper.groupBy("name");//分组 --select只能跟聚合函数以及分组的字段
  15. List<User> users = userDao.selectList(wrapper);
  16. System.out.println(users);

3.8 分页查询

3.8.1 单表分页查询

  • 创建Mybatis-PlusConfig配置类
  1. @Configuration
  2. public class MybatisPlusConfig {
  3. /**
  4. * 分页插件 MP3.3.2版本
  5. */
  6. @Bean
  7. public PaginationInterceptor paginationInterceptor() {
  8. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  9. // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
  10. // paginationInterceptor.setOverflow(false);
  11. // 设置最大单页限制数量,默认 500 条,-1 不受限制
  12. // paginationInterceptor.setLimit(500);
  13. // 开启 count 的 join 优化,只针对部分 left join
  14. //paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
  15. return paginationInterceptor;
  16. }
  17. }
  • 测试类
  1. @Test
  2. void testSelect() {
  3. QueryWrapper<User> wrapper = new QueryWrapper<>();
  4. //分页查询
  5. Page<User> page = new Page<>(2,2);
  6. Page<User> page1 = userDao.selectPage(page, null);
  7. System.out.println("总条数:"+page1.getTotal());
  8. System.out.println("总页数:"+page1.getPages());
  9. System.out.println("当前页的记录:"+page1.getRecords());
  10. }

3.8.2 联表分页查询

  • tbl_user表

  • tbl_dept表

 3.8.2.1 实体类
  • User
  1. @Data
  2. @TableName(value = "tbl_user") //如果没有添加该注解默认实体类映射对应的表名
  3. public class User {
  4. @TableId(value = "id",type = IdType.AUTO) //标记该属性为表的主键列,属性名和主键列名映射
  5. private long uid;
  6. @TableField(value = "name") //让属性名和列名映射
  7. private String username;
  8. private Integer age;
  9. private String email;
  10. private Long did;
  11. @TableField(exist = false)
  12. private Dept dept;
  13. }
  • Dept
  1. @Data
  2. @TableName(value = "tbl_Dept")
  3. public class Dept {
  4. @TableId(type = IdType.AUTO)
  5. private Long did;
  6. private String dname;
  7. }
3.8.2.2 Mybatis-PlusConfig配置类
  1. @Configuration
  2. public class MybatisPlusConfig {
  3. /**
  4. * 分页插件 MP3.3.2版本
  5. */
  6. @Bean
  7. public PaginationInterceptor paginationInterceptor() {
  8. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  9. // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
  10. // paginationInterceptor.setOverflow(false);
  11. // 设置最大单页限制数量,默认 500 条,-1 不受限制
  12. // paginationInterceptor.setLimit(500);
  13. // 开启 count 的 join 优化,只针对部分 left join
  14. //paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
  15. return paginationInterceptor;
  16. }
  17. }
3.8.2.3 dao层
  • UserDao

                            --------添加分页

  1. @Mapper
  2. public interface UserDao extends BaseMapper<User> {
  3. /*分页*/
  4. IPage<User> selectByCondition(IPage<User> page ,@Param("ew") Wrapper<User> queryWrapper);
  5. }
3.8.2.4 UserMapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <!--namesapce的内容必须和对应的接口路径映射-->
  5. <mapper namespace="com.aaa.dao.UserDao">
  6. <resultMap id="myMap" type="com.aaa.pojo.User" autoMapping="true">
  7. <id property="uid" column="id"/>
  8. <result property="username" column="name"/>
  9. <association property="dept" javaType="com.aaa.pojo.Dept">
  10. <id property="did" column="did"/>
  11. <result property="dname" column="dname"/>
  12. </association>
  13. </resultMap>
  14. <!--联表查询 分页功能-->
  15. <select id="selectByCondition" resultMap="myMap">
  16. select u.*,d.* from tbl_user u join tbl_dept d on u.did = d.did
  17. <if test="ew!=null and ew.customSqlSegment!=null">
  18. ${ew.customSqlSegment}
  19. </if>
  20. </select>
  21. </mapper>
3.8.2.5 测试
  1. @Test
  2. void testSelect02(){
  3. //联表分页查询
  4. IPage<User> page = new Page<>(1,3);
  5. QueryWrapper<User> wrapper = new QueryWrapper<>();
  6. wrapper.between("age",18,25);
  7. //IPage<User> page1 = userDao.selectByCondition(page,null);
  8. IPage<User> page1 = userDao.selectByCondition(page,wrapper);
  9. System.out.println("总条数:"+page1.getTotal());
  10. System.out.println("总页数:"+page1.getPages());
  11. System.out.println("当前页的记录:"+page1.getRecords());
  12. }

4. MP代码生成器

4.1 引入依赖

  1. <!--mp代码生成器依赖-->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-generator</artifactId>
  5. <version>3.3.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.freemarker</groupId>
  9. <artifactId>freemarker</artifactId>
  10. <version>2.3.29</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.velocity</groupId>
  14. <artifactId>velocity-engine-core</artifactId>
  15. <version>2.3</version>
  16. </dependency>

4.2 创建CodeGenerator代码生成器

  1. package com.aaa;
  2. import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
  3. import com.baomidou.mybatisplus.core.toolkit.StringPool;
  4. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  5. import com.baomidou.mybatisplus.generator.AutoGenerator;
  6. import com.baomidou.mybatisplus.generator.InjectionConfig;
  7. import com.baomidou.mybatisplus.generator.config.*;
  8. import com.baomidou.mybatisplus.generator.config.po.TableInfo;
  9. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  10. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Scanner;
  14. // 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
  15. public class CodeGenerator {
  16. /**
  17. * <p>
  18. * 读取控制台内容
  19. * </p>
  20. */
  21. public static String scanner(String tip) {
  22. Scanner scanner = new Scanner(System.in);
  23. StringBuilder help = new StringBuilder();
  24. help.append("请输入" + tip + ":");
  25. System.out.println(help.toString());
  26. if (scanner.hasNext()) {
  27. String ipt = scanner.next();
  28. if (StringUtils.isNotBlank(ipt)) {
  29. return ipt;
  30. }
  31. }
  32. throw new MybatisPlusException("请输入正确的" + tip + "!");
  33. }
  34. public static void main(String[] args) {
  35. // 代码生成器
  36. AutoGenerator mpg = new AutoGenerator();
  37. // 全局配置
  38. GlobalConfig gc = new GlobalConfig();
  39. String projectPath = System.getProperty("user.dir");
  40. gc.setOutputDir( "D:\\dev\\springboot_test06/src/main/java"); //设置输出目录
  41. gc.setAuthor("CCH"); //作者
  42. gc.setOpen(false);
  43. gc.setSwagger2(true); //实体属性 Swagger2 注解
  44. mpg.setGlobalConfig(gc);
  45. // 数据源配置
  46. DataSourceConfig dsc = new DataSourceConfig();
  47. dsc.setUrl("jdbc:mysql://localhost:3306/springboot?characterEncoding=utf8&serverTimezone=Asia/Shanghai");
  48. // dsc.setSchemaName("public");
  49. dsc.setDriverName("com.mysql.cj.jdbc.Driver");
  50. dsc.setUsername("root");
  51. dsc.setPassword("970812");
  52. mpg.setDataSource(dsc);
  53. // 包配置
  54. PackageConfig pc = new PackageConfig();
  55. pc.setModuleName("user");
  56. pc.setParent("com.aaa"); //com.aaa.user 父包+模块名
  57. mpg.setPackageInfo(pc);
  58. // 自定义配置
  59. InjectionConfig cfg = new InjectionConfig() {
  60. @Override
  61. public void initMap() {
  62. // to do nothing
  63. }
  64. };
  65. // 如果模板引擎是 freemarker
  66. String templatePath = "/templates/mapper.xml.ftl";
  67. // 如果模板引擎是 velocity
  68. // String templatePath = "/templates/mapper.xml.vm";
  69. // 自定义输出配置
  70. List<FileOutConfig> focList = new ArrayList<>();
  71. // 自定义配置会被优先输出
  72. focList.add(new FileOutConfig(templatePath) {
  73. @Override
  74. public String outputFile(TableInfo tableInfo) {
  75. // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
  76. return "D:\\dev\\springboot_test06" + "/src/main/resources/mapper/" + pc.getModuleName()
  77. + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
  78. }
  79. });
  80. /*
  81. cfg.setFileCreate(new IFileCreate() {
  82. @Override
  83. public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
  84. // 判断自定义文件夹是否需要创建
  85. checkDir("调用默认方法创建的目录,自定义目录用");
  86. if (fileType == FileType.MAPPER) {
  87. // 已经生成 mapper 文件判断存在,不想重新生成返回 false
  88. return !new File(filePath).exists();
  89. }
  90. // 允许生成模板文件
  91. return true;
  92. }
  93. });
  94. */
  95. cfg.setFileOutConfigList(focList);
  96. mpg.setCfg(cfg);
  97. // 配置模板
  98. TemplateConfig templateConfig = new TemplateConfig();
  99. // 配置自定义输出模板
  100. //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
  101. // templateConfig.setEntity("templates/entity2.java");
  102. // templateConfig.setService();
  103. // templateConfig.setController();
  104. templateConfig.setXml(null);
  105. mpg.setTemplate(templateConfig);
  106. // 策略配置
  107. StrategyConfig strategy = new StrategyConfig();
  108. strategy.setNaming(NamingStrategy.underline_to_camel);
  109. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  110. strategy.setEntityLombokModel(true);
  111. strategy.setRestControllerStyle(true);
  112. // 公共父类
  113. // 写于父类中的公共字段
  114. strategy.setSuperEntityColumns("id");
  115. strategy.setControllerMappingHyphenStyle(true);
  116. strategy.setTablePrefix("tbl_");
  117. mpg.setStrategy(strategy);
  118. mpg.setTemplateEngine(new FreemarkerTemplateEngine());
  119. mpg.execute();
  120. }
  121. }

4.3 代码生成器内容修改

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/665623
推荐阅读
相关标签
  

闽ICP备14008679号