SpringBoot整合Druid、Mybatis、MybatisPlus以及MybatisPlus代码生成器

1.SpringBoot整合Druid

1)引入jar包

   <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid-spring-boot-starter</artifactId>
       <version>1.2.3</version>
   </dependency>

2)在application.yml中

# 数据源
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springboot_mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #   数据源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    #初始化时运行sql脚本
    schema: classpath:sql/schema.sql
    initialization-mode: always

    druid:
      #开启druid 监控台servlet
      stat-view-servlet:
        enabled: true
        login-username: admin
        loginPassword: 123456
      #开启druid 监控filter
      web-stat-filter:
        enabled: true

注意: initialization-mode: always 第一次用过之后注释掉,或者将其改成never

3).启动项目,访问:http://127.0.0.1:8080/druid/    

     用户名:admin/密码:123456(在配置文件中有)

2.SpringBoot整合Mybatis

ps:还记得mybatis中的sqlSessionFactory要传入一个dataSource吗?所以我们先学习了druid。

1)关于逆向工程:我们更多的使用插件plugin的方式

(注意:mybatis的逆向工程生成的是mapper接口和mapper.xml文件

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。)

Mybatis逆向工程_飞鸟的心情的博客-CSDN博客

2)集成mybatis

   第一步:jar包引入:  

   <!--mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

   第二步:

   在application.yml中:

#设置mybatis
mybatis:
  mapper-locations: classpath:com/tulingxueyuan/mapper/*Mapper.xml
  typeAliasesPackage: com.tulingxueyuan.pojo
  configuration:
    mapUnderscoreToCamelCase: true
  • typeAliasesPackage 的作用就是指定一个包名,在该包中的所有类都会被自动注册为 MyBatis 的别名,无需显式在 XML 配置文件中指定别名。这可以减少在 XML 配置文件中的重复工作,同时使得配置更加简洁。
  • mapUnderscoreToCamelCase: true的作用是:(参考如下代码)其中的查询结果就算没有resultMap映射,那么也可以将dept_name字段映射成deptName
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
  select id, dept_name
  from dept
  where id = #{id,jdbcType=INTEGER}
</select>

  第三步:

在启动类中加入:@MapperScan("com.tulingxueyuan.mapper")或者在mapper接口上加上@Mapper注解

@SpringBootApplication
@MapperScan("com.tulingxueyuan.mapper")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

  ok,集成好了。

3.SpringBoot整合MybatisPlus

Idea先安装插件MybatisX

官网:MyBatis-Plus

1.引入jar包:

这里使用的是3.4.2的版本,还有其他版本在mvn repository中查找

  <!-- mybatis-plus   不需要再额外引入mybatis了-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>

2.集成配置:

application.yml中:

# 数据源
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/mybatisplus?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    #初始化时运行sql脚本
    schema: classpath:sql/schema.sql
    initialization-mode : never
logging:
  level:
    root: info
    com.tulingxueyuan: debug  #设置日志级别 mp的mapper日志级别
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false  #下划线命名转化为驼峰命名

sql文件的内容:

-- 创建表
CREATE TABLE tbl_employee(
   id INT(11) PRIMARY KEY AUTO_INCREMENT,
   last_name VARCHAR(50),
   email VARCHAR(50),
   gender CHAR(1),
   age INT
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','tom@atguigu.com',1,22);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','jerry@atguigu.com',0,25);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','black@atguigu.com',1,30);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@atguigu.com',0,35);

启动类中:

@SpringBootApplication
@MapperScan("com.tulingxueyuan.mbp.mapper")
public class QuickStartApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuickStartApplication.class, args);
    }

}

3.编写mapper接口和servcie接口

   看下图的重点:编写的接口都要继承通用的Mapper和Servcie接口:BaseMapper和IService

mapper中:

package com.tulingxueyuan.mbp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tulingxueyuan.mbp.pojo.Employee;

public interface EmployeeMapper extends BaseMapper<Employee> {
}

service中:

package com.tulingxueyuan.mbp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tulingxueyuan.mbp.pojo.Employee;

public interface EmployeeService extends IService<Employee> {
}

   serviceImpl中:

package com.tulingxueyuan.mbp.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tulingxueyuan.mbp.mapper.EmployeeMapper;
import com.tulingxueyuan.mbp.pojo.Employee;
import com.tulingxueyuan.mbp.service.EmployeeService;
import org.springframework.stereotype.Service;

/***
 *
 *  service实现类   继承mp提供通用的service基类
 *  ServiceImpl<EmployeeMapper, Employee>
 *      2个泛型 1.EmployeeMapper  Mapper接口
 *              2.Employee  对应Pojo
 */
@Service
public class EmployeeImplService extends 
ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {


}

  4.创建实体类pojo

package com.tulingxueyuan.mbp.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;


//  mp 会默认将pojo类名当表名,如果类名和表名不一致可以使用注解
@TableName("tbl_employee")
public class Employee {
    // mp 会自动识别pojo类中名为id的属性,如果名字叫id就会当做是主键
    // 如果你的注解没有赋值那它会帮你使用ID_WORKER的生成策略, 主要是为了防止你忘记给主键赋值
    // 如果字段是自动增长需要手动改一下生成策略
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @TableField("last_name")
    private String lastName;
    private String email;
    private Integer gender;
    private Integer age;
    @TableField(exist = false)
    private String genderName; // 这个字段在表中是没有的

    public String getGenderName() {
         if(gender==0){
             return "女";
         }
         else
         {
             return "男";
         }
    }


    public Employee() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Employee(Integer id, String lastName, String email, Integer gender, Integer age) {
        super();
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }
 
    //getter和setter省略...    

    @Override
    public String toString() {
        return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + getGenderName()+", age="
                + age + "]";
    }


}

ok,以上就是springboot集成MybatisPlus的过程。

ps:有没有发现MP当中,不用像mybatis那样指定mapper-locations了(在mybatis中mapper-locations: classpath:com/tulingxueyuan/mapper/*Mapper.xml),那是因为在mybatisPlus自动配置类中:已经指定了

4.MybatisPlus代码生成器(旧版)

官方文档:

代码生成器(新) | MyBatis-Plus

1.jar包引入

默认使用的是velocity模板

 <!-- 代码生成器的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!--velocity模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>

2.代码:

package com.tulingxueyuan;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/***
 * @Author 徐庶   QQ:1092002729
 * @Slogan 致敬大师,致敬未来的你
 *
 * pms_product
 */
public class GeneratorApp {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        // 判断用户是否输入
        if (scanner.hasNext()) {
            // 拿到输入内容
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {

        String moduleName = scanner("模块名");
        String tableName = scanner("表名(多个用,号分隔,或者按前缀(pms*))");
        String prefixName = scanner("需要替换的表前缀");


        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 获得当前项目的路径
        String projectPath = System.getProperty("user.dir")+"/05_generator";
        // 设置生成路径
        gc.setOutputDir(projectPath + "/src/main/java");
        // 作者
        gc.setAuthor("xushu");
        // 代码生成是不是要打开所在文件夹
        gc.setOpen(false);
        // 生成Swagger2注解
        gc.setSwagger2(true);
        // 会在mapper.xml 生成一个基础的<ResultMap> 映射所有的字段
        gc.setBaseResultMap(true);
        // 同文件生成覆盖
        gc.setFileOverride(true);
        //gc.setDateType(DateType.ONLY_DATE)
        // 实体名:直接用表名  %s=表名
        gc.setEntityName("%s");
        // mapper接口名
        gc.setMapperName("%sMapper");
        // mapper.xml 文件名
        gc.setXmlName("%sMapper");
        // 业务逻辑类接口名
        gc.setServiceName("%sService");
        // 业务逻辑类实现类名
        gc.setServiceName("%sImplService");
        // 将全局配置设置到AutoGenerator
        mpg.setGlobalConfig(gc);



        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/tuling_mall?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //  模块名
        pc.setModuleName(moduleName);
        // 包名
        pc.setParent("com.tulingxueyuan");
        // 完整的报名: com.tulingxueyuan.pms
        mpg.setPackageInfo(pc);



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

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

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

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 把已有的xml生成置空
        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 表名的生成策略:下划线转驼峰 pms_product -- PmsProduct
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 列名的生成策略:下划线转驼峰 last_name -- lastName
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategy.setEntityLombokModel(true);
        // 在controller类上是否生成@RestController
        strategy.setRestControllerStyle(true);
        // 公共父类
        //strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");

        if(tableName.indexOf('*')>0){
            // 按前缀生成表
            strategy.setLikeTable(new LikeTable(tableName.replace('*','_')));
        }
        else{
            // 要生成的表名 多个用逗号分隔
             strategy.setInclude(tableName);
        }
        // 设置表替换前缀
        // 很重要的一个配置 比如:表名是pms_product 那么设置了strategy.setTablePrefix("pms_");
        // 之后实体类名及mapper和service就都不带pms_了,就是Product及ProductMapper等等类似的命名了
        strategy.setTablePrefix(prefixName);
        // 驼峰转连字符 比如 pms_product --> controller @RequestMapping("/pms/pmsProduct")
        //strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);

        // 进行生成
        mpg.execute();

    }
}

ps:相应的swagger依赖:

 <!--Swagger-UI API文档生产工具-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger2.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger2.version}</version>
        </dependency>
        <!--解决Swagger 2.9.2版本NumberFormatException-->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>${swagger-models.version}</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>${swagger-annotations.version}</version>
        </dependency>
<!--lombok最新版本-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>


 <properties>
        <java.version>1.8</java.version>
        <swagger2.version>2.9.2</swagger2.version>
        <swagger-models.version>1.6.0</swagger-models.version>
        <swagger-annotations.version>1.6.0</swagger-annotations.version>
    </properties>

ps:在 Lombok 中,@Data 注解是一个组合注解,它包含了一系列其他的注解,用于自动生成 Java 类的常用方法,如 getter、setter、toString、equals 和 hashCode 等。使用 @Data 注解可以减少编写重复的代码,让类的定义更加简洁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值