导入依赖

  1. <!-- alibaba的druid数据库连接池 -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.20</version>
  6. </dependency>
  7. <!-- alibaba的druid数据库连接池 -->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>druid-spring-boot-starter</artifactId>
  11. <version>1.1.20</version>
  12. </dependency>
  13. <!-- mybatis-plus-->
  14. <dependency>
  15. <groupId>com.baomidou</groupId>
  16. <artifactId>mybatis-plus-boot-starter</artifactId>
  17. <version>3.5.2</version>
  18. </dependency>
  19. <!-- mysql驱动-->
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. </dependency>
  24. <!-- mybatisplus 生成器 -->
  25. <dependency>
  26. <groupId>com.baomidou</groupId>
  27. <artifactId>mybatis-plus-generator</artifactId>
  28. <version>3.5.2</version>
  29. </dependency>
  30. <!-- Freemarker 引擎模板 -->
  31. <dependency>
  32. <groupId>org.freemarker</groupId>
  33. <artifactId>freemarker</artifactId>
  34. <version>2.3.31</version>
  35. </dependency>

配置yaml文件

  1. spring:
  2. #配置数据源信息
  3. datasource:
  4. #配置数据源类型
  5. type: com.alibaba.druid.pool.DruidDataSource
  6. #配置连接数据库信息
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. url: jdbc:mysql://localhost:3306/appinfodb?useUnicode=yes&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=GMT%2B8
  9. username: root
  10. password: zax
  11. druid:
  12. # 初始化大小,最小,最大
  13. initial-size: 5
  14. min-idle: 5
  15. max-active: 30
  16. # 配置获取连接等待超时的时间
  17. max-wait: 60000
  18. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  19. time-between-eviction-runs-millis: 60000
  20. # 配置一个连接在池中最小生存的时间,单位是毫秒
  21. min-evictable-idle-time-millis: 300000
  22. mvc:
  23. # 开启put,delete请求
  24. hiddenmethod:
  25. filter:
  26. enabled: true
  27. #文件上传
  28. # 最大支持文件大小
  29. # 最大支持请求大小
  30. servlet:
  31. multipart:
  32. max-file-size: 10MB
  33. max-request-size: 10MB
  34. thymeleaf:
  35. cache: false
  36. #邮件发送
  37. mail:
  38. password: fghwjhrzpnmnjied
  39. host: smtp.qq.com
  40. username: 1507550179@qq.com
  41. default-encoding: UTF-8
  42. redis:
  43. #redis主机地址
  44. host: 192.168.207.128
  45. port: 6379
  46. password:
  47. #设置sql打印日志
  48. mybatis-plus:
  49. configuration:
  50. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  51. #配置类型别名所对应的包
  52. type-aliases-package: com.zax.appmanage.entity
  53. #配置扫描mapper映射文件的代码
  54. mapper-locations: classpath:mapper/*.xml

常用注解

  1. @Data
  2. @ToString
  3. //对应数据库表名
  4. @TableName("user")
  5. public class User {
  6. //对应表中主键
  7. @TableId("userName")
  8. private String userName;
  9. //对应表中字段
  10. @TableField("password")
  11. private String password;
  12. }

@TableName :

  • 描述:表名注解,标识实体类对应的表
  • 使用位置:实体类

image.png

schema属性

shcema 属性用来指定模式名称。如果你使用的是 mysql 数据库,则指定数据库名称。如果你使用的是 oracle,则为 schema,例如:schema=”scott”,其中:scott 就是 oracle 中的 schema

@TableId :

  • 描述:主键注解
  • 使用位置:实体类主键字段

image.png

@TableField

描述:字段注解(非主键)
image.png
image.png

新代码生成器

image.png

  1. package com.kgc.appmanager.util;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  4. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  5. public class Generator {
  6. public static void main(String[] args) {
  7. // 数据库配置
  8. FastAutoGenerator.create("jdbc:mysql://localhost:3306/appinfodb?useUnicode=yes&characterEncoding=utf-8&rewriteBatchedStatements=true&serverTimezone=GMT%2B8", "root", "zax")
  9. //全局配置
  10. .globalConfig(builder -> {
  11. builder.author("zax") // 设置作者
  12. // .enableSwagger() // 开启 swagger 模式
  13. .disableOpenDir()// 禁止打开输出目录,默认值:true
  14. .commentDate("yyyy-MM-dd HH:mm")// 注释日期,默认值: yyyy-MM-dd
  15. .outputDir("E:\\idea\\untitled\\AppManager\\src\\main\\java"); // 指定输出目录
  16. })
  17. //包配置
  18. .packageConfig(builder -> {
  19. builder.parent("com.kgc") // 设置父包名,默认值:com.baomidou
  20. .moduleName("appmanager") // 设置父包模块名,默认值:无
  21. .entity("entity")// Entity 包名,默认值:entity
  22. .service("service")// Service 包名,默认值:service
  23. .serviceImpl("service.impl")// Service Impl 包名,默认值:service.impl
  24. .mapper("mapper")// Mapper 包名,默认值:mapper
  25. .xml("mapper.xml")// Mapper XML 包名,默认值:mapper.xml
  26. // .pathInfo(Collections.singletonMap(OutputFile.xml, "E:\\idea\\untitled\\AppManager\\src\\main\\java")) // 路径配置信息
  27. .controller("controller");// Controller 包名,默认值:controller
  28. })
  29. //策略配置
  30. .strategyConfig(builder -> {
  31. builder.addInclude() // 设置需要生成的表名,不写默认是数据库全表
  32. // .addTablePrefix("ad_", "app_")// 设置过滤表前缀
  33. .entityBuilder().disableSerialVersionUID()// 禁用生成 serialVersionUID,默认值:true
  34. .enableChainModel()// 开启链式模型,默认值:false
  35. .enableLombok()// 开启 lombok 模型,默认值:false
  36. .enableTableFieldAnnotation()// 开启生成实体时生成字段注解,默认值:false
  37. .enableActiveRecord()// 开启 ActiveRecord 模型,默认值:false
  38. // .versionColumnName("version")// 乐观锁字段名(数据库)
  39. // .logicDeleteColumnName("deleted")// 逻辑删除字段名(数据库)
  40. // .addTableFills(new Column("create_time", FieldFill.INSERT))
  41. // .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
  42. .mapperBuilder().superClass(BaseMapper.class)// 设置父类
  43. .enableMapperAnnotation()// 开启 @Mapper 注解,默认值:false
  44. .enableBaseResultMap()// 启用 BaseResultMap 生成,默认值:false
  45. .enableBaseColumnList()// 启用 BaseColumnList,默认值:false
  46. // .enableRestStyle()// 开启生成@RestController 控制器,默认值:false
  47. .controllerBuilder().enableHyphenStyle();// 开启驼峰转连字符,默认值:false
  48. })
  49. .templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 引擎模板
  50. .execute();
  51. }
  52. }

BaseMapper接口

mapper接口需要继承baseMapper类泛型为实体类

  1. /**
  2. * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
  3. * 这个 Mapper 支持 id 泛型*/
  4. public interface BaseMapper<T> {
  5. /**
  6. * 插入一条记录
  7. * @param entity
  8. * 实体对象
  9. * @return int
  10. */
  11. Integer insert(T entity);
  12. /**
  13. * 根据 ID 删除
  14. * @param id
  15. * 主键ID
  16. * @return int
  17. */
  18. Integer deleteById(Serializable id);
  19. /**
  20. * 根据 columnMap 条件,删除记录
  21. * @param columnMap
  22. * 表字段 map 对象
  23. * @return int
  24. */
  25. Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);
  26. /**
  27. * 根据 entity 条件,删除记录
  28. * @param wrapper
  29. * 实体对象封装操作类(可以为 null)
  30. * @return int
  31. */
  32. Integer delete(@Param("ew") Wrapper<T> wrapper);
  33. /**
  34. * 删除(根据ID 批量删除)
  35. * @param idList
  36. * 主键ID列表
  37. * @return int
  38. */
  39. Integer deleteBatchIds(List<? extends Serializable> idList);
  40. /**
  41. * 根据 ID 修改
  42. * @param entity
  43. * 实体对象
  44. * @return int
  45. */
  46. Integer updateById(T entity);
  47. /**
  48. * 根据 whereEntity 条件,更新记录
  49. * @param entity
  50. * 实体对象
  51. * @param wrapper
  52. * 实体对象封装操作类(可以为 null)
  53. * @return
  54. */
  55. Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper);
  56. /**
  57. * 根据 ID 查询
  58. * @param id
  59. * 主键ID
  60. * @return T
  61. */
  62. T selectById(Serializable id);
  63. /**
  64. * 查询(根据ID 批量查询)
  65. * @param idList
  66. * 主键ID列表
  67. * @return List<T>
  68. */
  69. List<T> selectBatchIds(List<? extends Serializable> idList);
  70. /**
  71. * 查询(根据 columnMap 条件)
  72. * @param columnMap
  73. * 表字段 map 对象
  74. * @return List<T>
  75. */
  76. List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
  77. /**
  78. * 根据 entity 条件,查询一条记录
  79. * @param entity
  80. * 实体对象
  81. * @return T
  82. */
  83. T selectOne(@Param("ew") T entity);
  84. /**
  85. * 根据 Wrapper 条件,查询总记录数
  86. * @param wrapper
  87. * 实体对象
  88. * @return int
  89. */
  90. Integer selectCount(@Param("ew") Wrapper<T> wrapper);
  91. /**
  92. * 根据 entity 条件,查询全部记录
  93. * @param wrapper
  94. * 实体对象封装操作类(可以为 null)
  95. * @return List<T>
  96. */
  97. List<T> selectList(@Param("ew") Wrapper<T> wrapper);
  98. /**
  99. * 根据 Wrapper 条件,查询全部记录
  100. * @param wrapper
  101. * 实体对象封装操作类(可以为 null)
  102. * @return List<T>
  103. */
  104. List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> wrapper);
  105. /**
  106. * 根据 Wrapper 条件,查询全部记录
  107. * @param wrapper
  108. * 实体对象封装操作类(可以为 null)
  109. * @return List<Object>
  110. */
  111. List<Object> selectObjs(@Param("ew") Wrapper<T> wrapper);
  112. /**
  113. * 用法:(new RowBounds(offset, limit), ew);
  114. * 根据 entity 条件,查询全部记录(并翻页)
  115. * @param rowBounds
  116. * 分页查询条件(可以为 RowBounds.DEFAULT)
  117. * @param wrapper
  118. * 实体对象封装操作类(可以为 null)
  119. * @return List<T>
  120. */
  121. List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);
  122. /** -- 不常用,
  123. * 根据 Wrapper 条件,查询全部记录(并翻页)
  124. * @param rowBounds
  125. * 分页查询条件(可以为 RowBounds.DEFAULT)
  126. * @param wrapper
  127. * 实体对象封装操作类
  128. * @return List<Map<String, Object>>
  129. */
  130. List<Map<String, Object>> selectMapsPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);
  131. }

IService接口

image.png

官方文档

分页page

  1. // 无条件分页查询
  2. IPage<T> page(IPage<T> page);
  3. // 条件分页查询
  4. IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
  5. // 无条件分页查询
  6. IPage<Map<String, Object>> pageMaps(IPage<T> page);
  7. // 条件分页查询
  8. IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

20210903204905231.png条件sql用例

Wrapper条件构造器

查询条件构造器:
LambdaQueryWrapper<实体类> wrapper = new LambdaQueryWrapper<>();
实体类::get属性
修改条件构造器:LambdaUpdateWrapper

逻辑删除

逻辑删除是名义上的删除,就是对要要删除的数据打上一个删除标记,在逻辑上数据是被删除的,但数据本身依然存在,可通过修改删除标记来恢复数据。
只对自动注入的 sql 起效,自己在mapper.xml中写的sql不生效:
插入: 不作限制
查找: 追加 where 条件过滤掉已删除数据
更新: 追加 where 条件防止更新到已删除数据
删除: 转变为更新

实体类加@TableLog

分页插件

先创建一个配置值类

  1. package com.zax.appmanage.config;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  5. import org.mybatis.spring.annotation.MapperScan;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. @Configuration//myBatisPlus分页配置
  9. @MapperScan("com.zax.appmanage.mapper")
  10. public class MyBatisPlusConfig {
  11. @Bean
  12. public MybatisPlusInterceptor mybatisPlusInterceptor(){
  13. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  14. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  15. return mybatisPlusInterceptor;
  16. }
  17. }

分页导航栏

  1. //新建一个数组,用来存放分页导航栏
  2. List<Integer> pages = new ArrayList<>();
  3. //将当前页放入数组
  4. pages.add(pageNum);//pageNum为当前页
  5. for (int i = 1; i <= 3; i++) {//当数据里的数只有1-3个
  6. //左边的元素
  7. if (pageNum - i > 0) {
  8. pages.add(0, pageNum - i);
  9. }
  10. //右边的元素
  11. if (pageNum + i <= questions.getPages()) {// questions.getPages()从MybatisPlus分页插件中查出分页条数
  12. pages.add(pageNum + i);
  13. }
  14. }

多表联查

@TableField(exist=false)
在实体类中表示此属性不是数据库中的字段,但在项目中必须使用

条件多表联查

https://blog.csdn.net/qq_43073558/article/details/120616959
这里需要注意:写完SQL语句后,需要在结尾加上${ew.customSqlSegment},查询参数,由mybatis plus自动拼装。

  1. /**
  2. * 获取自定义SQL 简化自定义XML复杂情况
  3. * <p>使用方法</p>
  4. * <p>`自定义sql` + ${ew.customSqlSegment}</p>
  5. * <p>1.逻辑删除需要自己拼接条件 (之前自定义也同样)</p>
  6. * <p>2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦)</p>
  7. * <p>3.用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!)</p>
  8. * <p>4.ew是wrapper定义别名,可自行替换</p>
  9. */
  10. //多表分页多条件查询
  11. Page<User> selectAllByLike
  12. (@Param("page")Page<User> page, //分页
  13. @Param(Constants.WRAPPER) Wrapper<User> wrapper);//条件查询
  14. //Constants.WRAPPER就是ew
  15. //条件联查
  16. <select id="selectAllByLike" resultType="com.zax.appmanage.entity.User">
  17. select * from user,data_dictionary
  18. where typeCode='USER_TYPE'
  19. AND userType=valueId
  20. <if test="ew != null">
  21. <if test="ew.nonEmptyOfWhere">
  22. AND
  23. </if>
  24. ${ew.sqlSegment}
  25. </if>
  26. </select>
  1. //条件查询
  2. @Override
  3. public Page<User> selectAllByLike(Integer pageNum, Integer pageSize, String userName, Integer userType,Integer myUserType
  4. , LocalDateTime old, LocalDateTime yang) {
  5. QueryWrapper<User> wrapper=new QueryWrapper<>();
  6. //分页设置
  7. Page<User> page = new Page<>(pageNum==null?1:pageNum,pageSize);
  8. //条件设置
  9. wrapper.like(StringUtils.isNotBlank(userName),"userName",userName)
  10. .eq(userType!=null,"userType",userType)
  11. .gt("userType",myUserType)//>
  12. .ge(old!=null,"user.creationDate",old)//>=
  13. .le(yang!=null,"user.creationDate",yang);//<=
  14. // .orderByDesc("user.creationDate");
  15. return userMapper.selectAllByLike(page, wrapper);
  16. }

在XML中,需要转义的字符有:
(1)& &
(2)< <
(3)> >
(4)" "
(5)' '