前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis Plus 初体验

MyBatis Plus 初体验

作者头像
CS实验室
发布2021-03-22 12:28:16
1.2K0
发布2021-03-22 12:28:16
举报
文章被收录于专栏:CS实验室

MyBatis Plus 初体验

觊觎 baomidou 的 mybatis-plus 已久,十一假期,趁机体验尝试。本文通过设计一个简单的场景来展示 Myabtis Plus 的基本用法、ActiveRecord 模式 CRUD 和自定义查询,更多详情可参考官方文档(地址:http://mp.baomidou.com )

通用CRUD和自定义多表查询

在平时使用 Mybatis 的时候,总会开发一些通用的增删改查,真正自己定义的方法并不多,这时我们就在考虑:有没有那么一种框架,可以提供简单的 CRUD,还能进行自定义扩展自己的数据库操作层接口,灵活的进行多表联结查询?JPA 标准(实现框架有 Hibernate 和 Spring Data)可以解决上述需求,不过多表联结查询还是不够优雅,个人感觉扩展和自定义查询不够灵活。这个时候一般选用 Myabtis 作为 ORM 框架。只要你用过 Mybatis,就会被它的灵活和简洁征服,但是它没有提供一个通用的 CRUD,Mybatis 的代码生成插件可以生成通用的 CRUD,不过配置稍显麻烦。Myabtis Plus 优雅的解决了上面的问题,对 Myabtis 框架无侵入,也有一个代码生成器,不过本次不作为讨论内容。既然 Mybatis Plus 可以解决上面的问题,一起来看一下。

首先要导入依赖包,笔者这里用的 Spring Boot,依赖管理插件使用 Maven,创建 Spring Boot 项目,pom.xml 内容为:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.blf2</groupId>
    <artifactId>mybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mybatisplus</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

注意:

  1. 引入 mybatis-plus-boot-starter 后不要再引入 Mybatis 的依赖,因为 Mybatis Plus 会维护 Mybatis 的依赖,如果两者同时引入,可能造成版本冲突等一系列的问题。
  2. 数据库笔者使用的是 Mysql5.7.23,创建出的项目结构为:

接下来我们创建数据库和表,并且填入一些数据:

代码语言:javascript
复制
CREATE DATABASE testmp DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

use testmp;

create table user(
  id VARCHAR(32) PRIMARY KEY ,
  name VARCHAR(30),
  sex TINYINT,
  age tinyint,
  email VARCHAR(50),
  company_id varchar(32)
);

create table company(
  company_id varchar(32) PRIMARY  KEY ,
  company_name varchar(50)
);

INSERT INTO company VALUES('e3805e02c64911e8a355529269fb1459','济南曜派');
INSERT INTO company VALUES('148e855ac64a11e8a355529269fb1459','上海曜派');

INSERT into user(id,name,sex,age,email,company_id)VALUES ('c03c327cc64911e8a355529269fb1459','孟孟',0,24,'blf20822@126.com','e3805e02c64911e8a355529269fb1459');
insert into user(id,name,sex,age,email,company_id)VALUES ('49e3f8c0c64a11e8a355529269fb1459','任小笛',1,22,'rmd@126.com','148e855ac64a11e8a355529269fb1459');

然后新建一个 class,名字为 MybatisPlusConfig,这是 Java 配置文件风格的 MybatisPlus的config:

代码语言:javascript
复制
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"net.blf2.mybatisplus.mapper"})
public class MybatisPlusConfig {

  /**
   * 分页插件
   */
  @Bean
  public PaginationInterceptor paginationInterceptor() {
      return new PaginationInterceptor();
  }
}

注意:

  1. MapperScan 写在了此配置文件中,指定 mapper 接口所在的包名
  2. 自定义分页插件,Mybatis Plus 默认的分页插件属于内存分页,即把所有符合的数据查询到内存中,再进行分页,这样的分页在数据量较大的时候是非常慢的,对资源占用也是非常大的,所以此处选择 PaginationInterceptor 作为分页插件,PaginationInterceptor 属于物理分页,即在数据库层面进行分页,原理是在 sql 末尾使用 limit 关键字。

接下来新建两个 entity,对应数据表 User 和 Company:

代码语言:javascript
复制
@TableName("user")//此处可以不加此注解
public class User {

    @TableId(type = IdType.INPUT)//主键策略
    private String id;
    @TableField("name")//如果是驼峰命名法,可以不加此注解 但要开启下划线和驼峰的转换 mp3.0后默认开启
    private String name;
    private Integer sex;
    private Integer age;
    private String email;
    private String companyId;
    @TableField(exist = false)//此字段在数据库中不存在 不做映射
    private Company company;
    //省略了getter和setter
    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", companyId='" + companyId + '\'' +
                ", company=" + company +
                '}';
    }
}

注意:

  1. 注解 @TableName 是用于类名和数据表名映射
  2. 注解 @TableId 用于标记主键,如果 entity 和数据表主键名都为 id,可以不传入 value 参数,笔者在类属性 id 的注解 @TableId 省略了 value 参数,type 参数是用来设置主键的生成策略,笔者这里设置的是输入类型。
  3. 注解 @TableField 用来映射数据库表字段和 entity 属性,默认参数是数据表字段名。
  4. 没有标记 @TableField 注解的字段会被 Mybatis Plus 自动映射,默认使用驼峰命名和下划线互相转换进行映射,jav a类使用驼峰命名,数据表字段使用下划线,除非显式的告诉 Mybatis Plus 不要映射此字段,例如:companyId 遵循驼峰命名法,Mybatis Plus 会自定映射数据表中的列名为 company_id 的字段,age 字段映射数据表中的 age 列,而属性 company 在数据表中不存在此字段, exists=false代表数据表中没有有此属性对应的字段。
代码语言:javascript
复制
@TableName("company")
public class Company extends Model<Company>{//开启ActiveRecord模式

    @TableId(type = IdType.INPUT)
    private String companyId;//主键要用注解指定出来 不然查询的时候 where条件会是 where null=?
    @TableField("company_name")
    private String companyName;

    //省略getter setter

    @Override
    public String toString() {
        return "Company{" +
                "companyId='" + companyId + '\'' +
                ", companyName='" + companyName + '\'' +
                '}';
    }

    @Override
    protected Serializable pkVal() {//开启ActiveRecord模式必须提供此方法 方法的功能为获取主键
        return this.companyId;
    }
}

注意:

  1. 此类继承 Model(由 baomidou 组织提供)开启 ActiveRecord 模式,ActiveRecord 在动态语言中存在(例如 PHP),Java 作为准静态语言,很难从语言层面支持此模式,ActiveRecord 模式通俗的理解就是类映射数据表,实例映射表中的记录。
  2. Model 需要一个泛型传入,并且它是一个抽象类,作为它的子类要覆盖其 protectedSerializablepkVal() 方法,此方法作用是获取主键对应的属性。

然后写这两个 entity 对应的 Mapper:

代码语言:javascript
复制
public interface UserMapper extends BaseMapper<User> {

    @Select("SELECT * from user u " +
            "inner join company c " +
            "on u.company_id = c.company_id " +
            "where u.id = #{id};")
    @Results({
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "sex",property = "sex"),
            @Result(column = "age",property = "age"),
            @Result(column = "email",property = "email"),
            @Result(column = "company_id",property = "companyId"),
            @Result(column = "company_id",property = "company.companyId"),
            @Result(column = "company_name",property = "company.companyName")
    })
    User selectOneIncludeCompany(String id);

    @Select("SELECT * from user where id = #{id};")
    @Results({
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "sex",property = "sex"),
            @Result(column = "age",property = "age"),
            @Result(column = "email",property = "email"),
            @Result(column = "company_id",property = "companyId"),
            @Result(column = "company_id",property = "company",one = @One(select = "net.blf2.mybatisplus.mapper.CompanyMapper.selectById"))
    })
    User selectOneIncludeCompany2(String id);
}

注意:

  1. 此 Mapper 需要继承 BaseMapper,传入泛型才能获得通用 CRUD 方法
  2. 方法 UserselectOneIncludeCompany(Stringid) 和方法 UserselectOneIncludeCompany2(Stringid) 是笔者自定义的查询,可以看的出来,我们即获得了通用 CRUD,还没有失去 Mybatis 的灵活性
代码语言:javascript
复制
public interface CompanyMapper extends BaseMapper<Company> {
}

然后 我们要在 application.yml 中配置数据库连接相关信息:

代码语言:javascript
复制
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testmp?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    username: root
    password: root
mybatis-plus: #此配置将mybatis plus的sql输出到控制台
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

接下来就可以写测试了,在 test 包下找到测试类,开始写测试,笔者的测试类如下:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisplusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testUserMapper(){

        //查询所有数据
        List<User> allUser = userMapper.selectList(null);
        System.out.println("user表中所有数据:" + allUser);

        //根据Id查询
        User userById = userMapper.selectById("c03c327cc64911e8a355529269fb1459");
        System.out.println("根据Id查询user:" + userById);

        //根据email查询 使用条件构造器
        User userByEmail = userMapper.selectOne(
                new QueryWrapper<User>().eq("email","blf20822@126.com"));//此处的eq方法的第一个参数为数据表中此字段的名字 而不是entity中的
        System.out.println("根据email查询user:" + userByEmail);

        //自定义查询语句的多表查询
        User userDef = userMapper.selectOneIncludeCompany("c03c327cc64911e8a355529269fb1459");
        System.out.println("自定义sql多表查询:" + userDef);

        Page<User> page = new Page<User>(1,1);
        userMapper.selectPage(page,new QueryWrapper<User>());
        System.out.println("分页查询:list=" + page.getRecords());
        System.out.println("总个数:total=" + page.getTotal());
        System.out.println("当前页:currentPage=" + page.getCurrent());
        System.out.println("每个页大小:size=" + page.getSize());
        System.out.println("当前分页总页数:" + page.getPages());

        //级联查询
        User userDef2 = userMapper.selectOneIncludeCompany2("c03c327cc64911e8a355529269fb1459");
        System.out.println("自定义sql多表查询:" + userDef2);

    }

    @Test
    public void testCompanyAR(){

        Company company = new Company();

        company.setCompanyId("e3805e02c64911e8a355529269fb1459");
        company = company.selectById();//AR模式下的根据id查询
        System.out.println("AR模式根据id查询company=" + company);

        Company company2 = new Company();
        List<Company> allCompany = company2.selectList(new QueryWrapper());
        System.out.println("AR模式查询所有company:" + allCompany);
    }

}

注意:

  1. testCompanyAR() 方法中的 company 的操作属于 ActiveRecord 模式,有点颠覆 Java 程序员的思想,其实这种操作是一种语法糖,本质还是通过调用通用 CRUD 实现的,所以 Company 对应的 Mapper 还是要存在的,不然会报错。
  2. testUserMapper()方法中用到了 QueryWrapper,这个是条件构造器,可以通过调用方法的形式组装 where 条件,此外还有 UpdateWrapper。

日志输出为:

代码语言:javascript
复制
JDBC Connection [HikariProxyConnection@127758389 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT company_id,company_name FROM company WHERE company_id=?
==> Parameters: e3805e02c64911e8a355529269fb1459(String)
<==    Columns: company_id, company_name
<==        Row: e3805e02c64911e8a355529269fb1459, 济南曜派
<==      Total: 1
AR模式根据id查询company=Company{companyId='e3805e02c64911e8a355529269fb1459', companyName='济南曜派'}
JDBC Connection [HikariProxyConnection@1256384385 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT company_id,company_name FROM company
==> Parameters:
<==    Columns: company_id, company_name
<==        Row: 148e855ac64a11e8a355529269fb1459, 上海曜派
<==        Row: e3805e02c64911e8a355529269fb1459, 济南曜派
<==      Total: 2
AR模式查询所有company:[Company{companyId='148e855ac64a11e8a355529269fb1459', companyName='上海曜派'}, Company{companyId='e3805e02c64911e8a355529269fb1459', companyName='济南曜派'}]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@280fafd] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@971324399 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT id,name,sex,age,email,company_id FROM user
==> Parameters:
<==    Columns: id, name, sex, age, email, company_id
<==        Row: 49e3f8c0c64a11e8a355529269fb1459, 任小笛, 1, 22, rmd@126.com, 148e855ac64a11e8a355529269fb1459
<==        Row: c03c327cc64911e8a355529269fb1459, 孟孟, 0, 24, blf20822@126.com, e3805e02c64911e8a355529269fb1459
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@280fafd]
user表中所有数据:[User{id='49e3f8c0c64a11e8a355529269fb1459', name='任小笛', sex=1, age=22, email='rmd@126.com', companyId='148e855ac64a11e8a355529269fb1459', company=null}, User{id='c03c327cc64911e8a355529269fb1459', name='孟孟', sex=0, age=24, email='blf20822@126.com', companyId='e3805e02c64911e8a355529269fb1459', company=null}]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@273fa9e] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1383761509 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT id,name,sex,age,email,company_id FROM user WHERE id=?
==> Parameters: c03c327cc64911e8a355529269fb1459(String)
<==    Columns: id, name, sex, age, email, company_id
<==        Row: c03c327cc64911e8a355529269fb1459, 孟孟, 0, 24, blf20822@126.com, e3805e02c64911e8a355529269fb1459
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@273fa9e]
根据Id查询user:User{id='c03c327cc64911e8a355529269fb1459', name='孟孟', sex=0, age=24, email='blf20822@126.com', companyId='e3805e02c64911e8a355529269fb1459', company=null}
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@69ed5ea2] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1250315597 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT id,name,sex,age,email,company_id FROM user WHERE email = ?
==> Parameters: blf20822@126.com(String)
<==    Columns: id, name, sex, age, email, company_id
<==        Row: c03c327cc64911e8a355529269fb1459, 孟孟, 0, 24, blf20822@126.com, e3805e02c64911e8a355529269fb1459
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@69ed5ea2]
根据email查询user:User{id='c03c327cc64911e8a355529269fb1459', name='孟孟', sex=0, age=24, email='blf20822@126.com', companyId='e3805e02c64911e8a355529269fb1459', company=null}
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@44bc2449] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1009313206 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT * from user u inner join company c on u.company_id = c.company_id where u.id = ?;
==> Parameters: c03c327cc64911e8a355529269fb1459(String)
<==    Columns: id, name, sex, age, email, company_id, company_id, company_name
<==        Row: c03c327cc64911e8a355529269fb1459, 孟孟, 0, 24, blf20822@126.com, e3805e02c64911e8a355529269fb1459, e3805e02c64911e8a355529269fb1459, 济南曜派
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@44bc2449]
自定义sql多表查询:User{id='c03c327cc64911e8a355529269fb1459', name='孟孟', sex=0, age=24, email='blf20822@126.com', companyId='e3805e02c64911e8a355529269fb1459', company=Company{companyId='e3805e02c64911e8a355529269fb1459', companyName='济南曜派'}}
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26457986] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@771715205 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
 JsqlParserCountOptimize sql=SELECT  id,name,sex,age,email,company_id  FROM user
==>  Preparing: SELECT COUNT(1) FROM user
==> Parameters:
<==    Columns: COUNT(1)
<==        Row: 2
==>  Preparing: SELECT id,name,sex,age,email,company_id FROM user LIMIT 0,1
==> Parameters:
<==    Columns: id, name, sex, age, email, company_id
<==        Row: 49e3f8c0c64a11e8a355529269fb1459, 任小笛, 1, 22, rmd@126.com, 148e855ac64a11e8a355529269fb1459
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26457986]
分页查询:list=[User{id='49e3f8c0c64a11e8a355529269fb1459', name='任小笛', sex=1, age=22, email='rmd@126.com', companyId='148e855ac64a11e8a355529269fb1459', company=null}]
总个数:total=2
当前页:currentPage=1
每个页大小:size=1
当前分页总页数:2
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5287ba5f] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@192318053 wrapping com.mysql.jdbc.JDBC4Connection@372461a9] will not be managed by Spring
==>  Preparing: SELECT * from user u where u.id = ?;
==> Parameters: c03c327cc64911e8a355529269fb1459(String)
<==    Columns: id, name, sex, age, email, company_id
<==        Row: c03c327cc64911e8a355529269fb1459, 孟孟, 0, 24, blf20822@126.com, e3805e02c64911e8a355529269fb1459
====>  Preparing: SELECT company_id,company_name FROM company WHERE company_id=?
====> Parameters: e3805e02c64911e8a355529269fb1459(String)
<====    Columns: company_id, company_name
<====        Row: e3805e02c64911e8a355529269fb1459, 济南曜派
<====      Total: 1
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5287ba5f]
自定义sql多表查询:User{id='c03c327cc64911e8a355529269fb1459', name='孟孟', sex=0, age=24, email='blf20822@126.com', companyId='e3805e02c64911e8a355529269fb1459', company=Company{companyId='e3805e02c64911e8a355529269fb1459', companyName='济南曜派'}}

可以看出,无论是继承BaseMapper的方法还是我们自定义的查询,ActiveRecord模式的查询,输出都是没有问题的

完整代码可见:https://gitee.com/blf2/TestMybatisPlus

代码生成器

Mybatis 是当今最流行的 Java Web ORM 框架之一,灵活的 SQL 查询和小巧精悍的功能都让人欲罢不能,但是也有个缺点,那就是通用 CURD 和一些通用配置没有默认实现,为此 Mybatis 官网提供一个名为 generator 的插件,在 IDE 中配置正确可以生成通用的 CRUD,配置文件为 XML 形式,笔者并没有使用过这个生成器。今天想分享的这一款生成器类似 generator,是 Mybatis Plus 中的生成器,使用 Java Config 模式配置,感觉不错,配置没有晦涩难懂的地方。

为了不和上面冲突,也为了更清晰的看出效果,我们创建一个新的 Spring Boot 工程,当然,数据库还是使用上面的。项目的结构如下:

pom.xml 如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>net.blf2</groupId>
<artifactId>mpgenerator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>mpgenerator</name>
<description>Demo project for Spring Boot</description>

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.0.5.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.1</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
  </dependency>

  <!--
        模板依赖 此处应该添加前端模板引擎,我这里cotroller计划提供REST接口 于是没有引入模板引擎依赖
    -->

  <!-- Mybatis Plus 代码生成器的日志输出依赖-->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.7</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
</project>

然后在测试类中新建一个 main 方法,写代码生成器的一些配置:

代码语言:javascript
复制
public static void main(String[] args){
        //全局配置
        GlobalConfig config = new GlobalConfig();
        config.setActiveRecord(true) //是否支持AR模式
                .setAuthor("blf2") //作者
                .setOutputDir("C:\\Users\\blf2\\IdeaProjects\\MpGenerator\\src\\main\\java")//生成路径
                .setFileOverride(true)//文件覆盖 如果多次生成 后面的生成的文件是否覆盖前一次的
                .setServiceName("%sService") //设置生成的service接口名 首字母是否为I 例如IUserService 此处为不设置首字母为I
                .setIdType(IdType.INPUT); //主键策略
        //数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL)
                .setUrl("jdbc:mysql://localhost:3306/testmp")
                .setDriverName("com.mysql.jdbc.Driver")
                .setUsername("root")
                .setPassword("root");
        //策略配置
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true) // 全局大写命名
                .setColumnNaming(NamingStrategy.underline_to_camel) //表字段名是下划线 类属性名转为驼峰命名
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表名映射到类名的命名策略 下划线转驼峰
                .setInclude("user", "company"); //生成的表
                //.setTablePrefix("test_"); // 表前缀  如果表为统一前缀 可以设置此前缀
        //包名策略
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("net.blf2.mpgenerator")//父包名  例如org.springframework为父报名,子包名可以是core,webmvc等
                .setController("controller")//controller所在的包名
                .setEntity("entity")//实体所在包名
                .setService("service");//service所在包名

        AutoGenerator ag = new
                AutoGenerator().setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);
        ag.execute();
}

配置代表的意义笔者在注释中都写得很清楚了,如果不清楚,可以从 IDE 中打开源码,里面的注释都是中文的,一看就明白。生成后的结构图:

UserMapper接口继承了 BaseMapper,提供通用 CRUD:

代码语言:javascript
复制
public interface UserMapper extends BaseMapper<User> {

  List<User> selectIncludeCompany();
}

与之对应的 UserMapper.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.blf2.mpgenerator.mapper.UserMapper">

  <select id="selectIncludeCompany" resultType="net.blf2.mpgenerator.entity.User">
      SELECT * from user
  </select>
</mapper>

我们可以在这里面扩展我们自定义的方法。UserService 接口如下:

代码语言:javascript
复制
public interface UserService extends IService<User> {

}

可以看到继承自 IService 接口,此接口提供的是通用 CRUD 的 service 风格的方法,部分源码:

UserServiceImpl:

代码语言:javascript
复制
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

ServiceImpl 类实现了 IService 接口:部分源码

UserController:

代码语言:javascript
复制
@Controller
@RequestMapping("/user")
public class UserController {

}

一个项目基本的框架,controller 层,service 层,mapper(dao) 层都生成好了,我们可以去完善自己的业务逻辑了。

完整代码可见:https://gitee.com/blf2/MpGenerator

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CS实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MyBatis Plus 初体验
    • 觊觎 baomidou 的 mybatis-plus 已久,十一假期,趁机体验尝试。本文通过设计一个简单的场景来展示 Myabtis Plus 的基本用法、ActiveRecord 模式 CRUD 和自定义查询,更多详情可参考官方文档(地址:http://mp.baomidou.com )
      • 通用CRUD和自定义多表查询
        • 代码生成器
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档