在平时使用 Mybatis 的时候,总会开发一些通用的增删改查,真正自己定义的方法并不多,这时我们就在考虑:有没有那么一种框架,可以提供简单的 CRUD,还能进行自定义扩展自己的数据库操作层接口,灵活的进行多表联结查询?JPA 标准(实现框架有 Hibernate 和 Spring Data)可以解决上述需求,不过多表联结查询还是不够优雅,个人感觉扩展和自定义查询不够灵活。这个时候一般选用 Myabtis 作为 ORM 框架。只要你用过 Mybatis,就会被它的灵活和简洁征服,但是它没有提供一个通用的 CRUD,Mybatis 的代码生成插件可以生成通用的 CRUD,不过配置稍显麻烦。Myabtis Plus 优雅的解决了上面的问题,对 Myabtis 框架无侵入,也有一个代码生成器,不过本次不作为讨论内容。既然 Mybatis Plus 可以解决上面的问题,一起来看一下。
首先要导入依赖包,笔者这里用的 Spring Boot,依赖管理插件使用 Maven,创建 Spring Boot 项目,pom.xml 内容为:
<?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>
注意:
接下来我们创建数据库和表,并且填入一些数据:
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:
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"net.blf2.mybatisplus.mapper"})
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
注意:
接下来新建两个 entity,对应数据表 User 和 Company:
@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 +
'}';
}
}
注意:
@TableName
是用于类名和数据表名映射@TableId
用于标记主键,如果 entity 和数据表主键名都为 id,可以不传入 value 参数,笔者在类属性 id 的注解 @TableId
省略了 value 参数,type 参数是用来设置主键的生成策略,笔者这里设置的是输入类型。@TableField
用来映射数据库表字段和 entity 属性,默认参数是数据表字段名。@TableField
注解的字段会被 Mybatis Plus 自动映射,默认使用驼峰命名和下划线互相转换进行映射,jav a类使用驼峰命名,数据表字段使用下划线,除非显式的告诉 Mybatis Plus 不要映射此字段,例如:companyId 遵循驼峰命名法,Mybatis Plus 会自定映射数据表中的列名为 company_id 的字段,age 字段映射数据表中的 age 列,而属性 company 在数据表中不存在此字段, exists=false
代表数据表中没有有此属性对应的字段。@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;
}
}
注意:
protectedSerializablepkVal()
方法,此方法作用是获取主键对应的属性。然后写这两个 entity 对应的 Mapper:
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);
}
注意:
UserselectOneIncludeCompany(Stringid)
和方法 UserselectOneIncludeCompany2(Stringid)
是笔者自定义的查询,可以看的出来,我们即获得了通用 CRUD,还没有失去 Mybatis 的灵活性public interface CompanyMapper extends BaseMapper<Company> {
}
然后 我们要在 application.yml
中配置数据库连接相关信息:
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 包下找到测试类,开始写测试,笔者的测试类如下:
@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);
}
}
注意:
testCompanyAR()
方法中的 company 的操作属于 ActiveRecord 模式,有点颠覆 Java 程序员的思想,其实这种操作是一种语法糖,本质还是通过调用通用 CRUD 实现的,所以 Company 对应的 Mapper 还是要存在的,不然会报错。testUserMapper()
方法中用到了 QueryWrapper,这个是条件构造器,可以通过调用方法的形式组装 where 条件,此外还有 UpdateWrapper。日志输出为:
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 如下:
<?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 方法,写代码生成器的一些配置:
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:
public interface UserMapper extends BaseMapper<User> {
List<User> selectIncludeCompany();
}
与之对应的 UserMapper.xml:
<?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 接口如下:
public interface UserService extends IService<User> {
}
可以看到继承自 IService 接口,此接口提供的是通用 CRUD 的 service 风格的方法,部分源码:
UserServiceImpl:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
ServiceImpl 类实现了 IService 接口:部分源码
UserController:
@Controller
@RequestMapping("/user")
public class UserController {
}
一个项目基本的框架,controller 层,service 层,mapper(dao) 层都生成好了,我们可以去完善自己的业务逻辑了。
完整代码可见:https://gitee.com/blf2/MpGenerator