介绍

  • MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  • Druid 是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。

相关链接

环境搭建

  • 建立User表```sql DROP TABLE IF EXISTS USER;

    CREATE TABLE USER(

    1. ID INTEGER NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    2. NAME VARCHAR(64) COMMENT '姓名',
    3. PRIMARY KEY (ID)

    ) COMMENT ‘demo’;

DELETE FROM USER;

INSERT INTO USER(NAME) VALUES (‘AAA’), (‘BBB’), (‘CCC’);

  1. - 新建springboot工程,引入相关依赖```groovy
  2. // springboot 相关依赖
  3. implementation 'org.springframework.boot:spring-boot-starter-web'
  4. // mybatis-plus 依赖
  5. implementation 'com.baomidou:mybatis-plus-boot-starter:3.2.0'
  6. implementation 'com.baomidou:mybatis-plus-generator:3.2.0'
  7. implementation 'org.springframework.boot:spring-boot-starter-freemarker'
  8. // druid 依赖
  9. implementation 'com.alibaba:druid-spring-boot-starter:1.1.17'
  10. // mysql jdbc
  11. implementation 'mysql:mysql-connector-java:5.1.48'
  12. // nacos
  13. implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.1.0.RELEASE'
  • 配置启动参数```yaml server:

    1. port: 8080

    spring:

    1. application:
    2. # 应用名称
    3. name: mybatis-plus-druid-demo
    4. cloud:
    5. nacos:
    6. discovery:
    7. # nacos地址
    8. server-addr: 10.0.109.80:8848
    9. datasource:
    10. # 采用Druid连接池
    11. type: com.alibaba.druid.pool.DruidDataSource
    12. driver-class-name: com.mysql.jdbc.Driver
    13. url: jdbc:mysql://localhost:3306/cloud-demo?useUnicode=true&useSSL=false&characterEncoding=utf8
    14. username: root
    15. password: root
    16. druid:
    17. # 连接池的配置信息
    18. # 初始化大小,最小,最大
    19. initial-size: 5
    20. min-idle: 5
    21. maxActive: 20
    22. # 配置获取连接等待超时的时间
    23. maxWait: 60000
    24. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    25. timeBetweenEvictionRunsMillis: 60000
    26. # 配置一个连接在池中最小生存的时间,单位是毫秒
    27. minEvictableIdleTimeMillis: 300000
    28. validationQuery: SELECT 1
    29. testWhileIdle: true
    30. testOnBorrow: false
    31. testOnReturn: false
    32. # 打开PSCache,并且指定每个连接上PSCache的大小
    33. poolPreparedStatements: true
    34. maxPoolPreparedStatementPerConnectionSize: 20
    35. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    36. filters: stat,wall,slf4j
    37. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    38. connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    39. # 配置DruidStatFilter
    40. web-stat-filter:
    41. enabled: true
    42. url-pattern: "/*"
    43. exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
    44. # 配置DruidStatViewServlet,用于页面监控
    45. stat-view-servlet:
    46. # 访问druid监控页面的路径
    47. url-pattern: "/druid/*"
    48. allow: 127.0.0.1
    49. login-username: root
    50. login-password: root
    51. reset-enable: false
    52. enabled: true

    ```

  • 编写Mybatis-plus代码生成器,需要先执行sql建立表之后才能根据表生成相应的文件```java @Component public class MybatisGenerator {

@Value(“${spring.datasource.url}”) private String url;

@Value(“${spring.datasource.username}”) private String username;

@Value(“${spring.datasource.password}”) private String password;

public void generateFromTable(String moduleName, String parent, String… tables) { // 代码生成器 AutoGenerator mpg = new AutoGenerator();

// 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty(“user.dir”); gc.setOutputDir(projectPath + “/src/main/java”) .setAuthor(“yhy”) .setOpen(false); mpg.setGlobalConfig(gc);

// 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl(url) .setDbType(DbType.MYSQL) .setDriverName(“com.mysql.jdbc.Driver”) .setUsername(username) .setPassword(password); mpg.setDataSource(dsc);

// 包配置 PackageConfig pc = new PackageConfig(); // 生成文件的路径 parent.moduleName pc.setModuleName(moduleName) .setParent(parent); mpg.setPackageInfo(pc);

// 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } };

// 如果模板引擎是 freemarker String templatePath = “/templates/mapper.xml.ftl”;

// 自定义输出配置 List focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + “/src/main/resources/mapper/“ + pc.getModuleName()

  1. + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
  2. }

}); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg);

// 配置模板 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null); mpg.setTemplate(templateConfig);

// 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underlineto_camel) .setColumnNaming(NamingStrategy.underline_to_camel) .setEntityLombokModel(true) .setRestControllerStyle(true) // 需要生成的表名 .setInclude(tables) .setControllerMappingHyphenStyle(true) .setTablePrefix(pc.getModuleName() + ““) //设置继承关系 .setSuperMapperClass(“kl.v2x.common.mapper.BaseMapper”) .setSuperServiceClass(“kl.v2x.common.service.CrudService”) .setSuperServiceImplClass(“kl.v2x.common.service.impl.CrudServiceImpl”); mpg.setStrategy(strategy);

mpg.setTemplateEngine(new FreemarkerTemplateEngine()); // 执行 mpg.execute(); } }

  1. - 编写测试类,生成所需文件```java
  2. @SpringBootTest
  3. public class GenerateTest {
  4. @Autowired
  5. public MybatisGenerator mybatisGenerator;
  6. @Test
  7. public void generate() {
  8. // 指定生成文件的路径和需要生成的表
  9. mybatisGenerator.generateFromTable("kl.pki.cloud","user");
  10. }
  11. }
  • 生成的所有文件如下图

mybatis-plus-code-generator.png

实际开发阶段

  • 指定mapper路径,使用注解@MapperScan来执行Mapper类的路径```java @EnableDiscoveryClient @MapperScan(“kl.pki.cloud.mapper”) @SpringBootApplication public class MybatisPlusDruidDemoApplication {

    1. public static void main(String[] args) {
    2. SpringApplication.run(MybatisPlusDruidDemoApplication.class, args);
    3. }

    } ```

  • 编写Controller测试CRUD,采用Restful的风格,通过body提交表单的方式提交相关数据| A | B | HTTP | URL | 说明 | | —- | —- | —- | —- | —- | | C | create | POST | /user/create | 新增用户 | | R | read | GET | /user/read | 查询单个用户 | | | | GET | /user/list | 查询所有用户 | | U | update | PUT | /user/update | 更新用户 | | D | update | DELETE | /user/delete | 删除用户 |

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. public IUserService userService;
  6. @GetMapping(value = "/list")
  7. public String getUserList(){
  8. List<User> userList=userService.list();
  9. return userList.toString();
  10. }
  11. @PostMapping(value = "/create")
  12. public void createUser(String userName){
  13. User user = new User();
  14. user.setName(userName);
  15. userService.save(user);
  16. }
  17. @GetMapping(value ="/read")
  18. public String readUser(int id){
  19. return userService.getById(id).toString();
  20. }
  21. @PutMapping(value = "/update")
  22. public void updateUser(int id,String userName){
  23. User user = new User();
  24. user.setId(id);
  25. user.setName(userName);
  26. userService.updateById(user);
  27. }
  28. @DeleteMapping(value = "delete")
  29. public void deleteUser(int id){
  30. User user = new User();
  31. user.setId(id);
  32. userService.removeById(id);
  33. }
  34. }
  • 以新增用户为例
    Mybatis-plus Druid Demo说明 - 图2
    • 编写CRUD测试类,参照官方给的例子
      官方例子 example link
    • 访问Druid监控页面
  • 启动之后访问 http://localhost:8080/druid
  • 用户名/密码 root/root
  • 相关配置见配置文件中的 spring.datasource.druid.stat-view-servlet配置项