前言
在看之前的代码时,总是在接口层和XML文件之前来回跳转,看的头都晕了,在阅读一个开源项目时,作者使用了通用Mapper插件来完成单表的CRUD,再配合MBG,就可以生成简洁的代码并实现单表无SQL
使用
这里使用SpringBoot整合该插件,SpringBoot版本为
2.1.7.RELEASE
- 添加POM依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--MBG-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!--通用Mapper插件;1.1.4版本没有tk.mybatis.spring.annotation.MapperScan注解-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
<!--<version>1.1.4</version>-->
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 配置插件
通过官方文档的介绍,整合mapper插件可以通过JAVA编码和纯Spring配置方式,这里通过JAVA编码方式实现MBG和mapper插件的整合
package cn.lhc.test.datasyn.common;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.*;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @ProjectName: uublog
* @Package: com.lhc.uublog.common
* @ClassName: CodeGenerator
* @Author: 龙海成
* @Description: 代码生成器
* @Date: 2019/8/25 下午 10:24
*/
public class CodeGenerator {
public static void main(String[] args) throws InterruptedException, SQLException, IOException, InvalidConfigurationException, XMLParserException {
doCode("staff", "staff_id");
}
/**
*
* @param tableName 表名
* @param key 主键
* @throws InvalidConfigurationException
* @throws InterruptedException
* @throws SQLException
* @throws IOException
*/
private static void doCode(String tableName, String key) throws InvalidConfigurationException, InterruptedException, SQLException, IOException {
List<String> warnings = new ArrayList<>();
Configuration config = new Configuration();
// context配置
Context context = new Context(ModelType.FLAT);
context.setTargetRuntime("MyBatis3Simple");
context.setId("MBG");
context.addProperty("beginningDelimiter", "'");
context.addProperty("endingDelimiter", "'");
// 通用Mapper插件配置
PluginConfiguration mapperConfiguration = new PluginConfiguration();
mapperConfiguration.setConfigurationType("tk.mybatis.mapper.generator.MapperPlugin");
mapperConfiguration.addProperty("mappers", "cn.lhc.test.datasyn.common.BaseDao");
// 序列化插件配置
PluginConfiguration serializConfiguration = new PluginConfiguration();
serializConfiguration.setConfigurationType("org.mybatis.generator.plugins.SerializablePlugin");
context.addPluginConfiguration(mapperConfiguration);
context.addPluginConfiguration(serializConfiguration);
// 注释配置
CommentGeneratorConfiguration commentGeneratorConfiguration = new CommentGeneratorConfiguration();
commentGeneratorConfiguration.addProperty("suppressAllComments", "true");
commentGeneratorConfiguration.addProperty("suppressDate", "true");
context.setCommentGeneratorConfiguration(commentGeneratorConfiguration);
// jdbc配置
JDBCConnectionConfiguration jdbcConnectionConfiguration = new JDBCConnectionConfiguration();
jdbcConnectionConfiguration.setConnectionURL("jdbc:mysql://120.79.180.167:3306/sakila?characterEncoding=utf-8");
jdbcConnectionConfiguration.setUserId("root");
jdbcConnectionConfiguration.setPassword("lhc1043153738*");
jdbcConnectionConfiguration.setDriverClass("com.mysql.jdbc.Driver");
context.setJdbcConnectionConfiguration(jdbcConnectionConfiguration);
// 生成实体类的存放路径
JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
javaModelGeneratorConfiguration.setTargetPackage("cn.lhc.test.datasyn.model");
javaModelGeneratorConfiguration.setTargetProject("src/main/java");
javaModelGeneratorConfiguration.addProperty("enableSubPackages", "true");
javaModelGeneratorConfiguration.addProperty("trimStrings", "true");
context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
// 生成mapping.xml的存放路径
SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
sqlMapGeneratorConfiguration.setTargetPackage("/mapper");
sqlMapGeneratorConfiguration.setTargetProject("src/main/resources");
sqlMapGeneratorConfiguration.addProperty("enableSubPackages", "true");
context.setSqlMapGeneratorConfiguration(sqlMapGeneratorConfiguration);
// 生成接口和实现类的存放路径;type指定sql文件是注解形式、混合模式或XML模式
JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
javaClientGeneratorConfiguration.setTargetPackage("cn.lhc.test.datasyn.dao");
javaClientGeneratorConfiguration.setTargetProject("src/main/java");
javaClientGeneratorConfiguration.addProperty("enableSubPackages", "true");
context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);
TableConfiguration tableConfiguration = new TableConfiguration(context);
tableConfiguration.setTableName(tableName);
// 主键自增
GeneratedKey generatedKey = new GeneratedKey(key, "mysql", Boolean.TRUE, null);
tableConfiguration.setGeneratedKey(generatedKey);
// PermissionMapper
context.addTableConfiguration(tableConfiguration);
config.addContext(context);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println("### 成功 ###");
}
}
说明:cn.lhc.test.datasyn.common.BaseDao
该类为所有DAO层的基类,可以自定义继承
- model
尽管MBG已经能做大部分的工作,但为了让代码更简洁,使用
lombok
插件,并自定义toString方法
package cn.lhc.test.datasyn.model;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
@NoArgsConstructor
public class Staff extends AbstractModel implements Serializable {
@Id
@Column(name = "staff_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Byte staffId;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "address_id")
private Short addressId;
private String email;
@Column(name = "store_id")
private Byte storeId;
private Boolean active;
private String username;
private String password;
@Column(name = "last_update")
private Date lastUpdate;
private byte[] picture;
private static final long serialVersionUID = 1L;
}
package cn.lhc.test.datasyn.model;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* @ProjectName: datasyn
* @Package: cn.sccl.nlp.datasyn.model
* @ClassName: AbstractModel
* @Author: lhc
* @Description: TODO
* @Date: 2019/10/17 下午 4:47
*/
public abstract class AbstractModel {
@Override
public String toString() {
Gson gson = new GsonBuilder()
.serializeNulls()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
return gson.toJson(this);
}
}
- dao
非常简洁
package cn.lhc.test.datasyn.dao;
import cn.lhc.test.datasyn.common.BaseDao;
import cn.lhc.test.datasyn.model.Staff;
public interface StaffMapper extends BaseDao<Staff> {
}
- mapper
<?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="cn.lhc.test.datasyn.dao.StaffMapper">
<resultMap id="BaseResultMap" type="cn.lhc.test.datasyn.model.Staff">
<!--
WARNING - @mbg.generated
-->
<id column="staff_id" jdbcType="TINYINT" property="staffId" />
<result column="first_name" jdbcType="VARCHAR" property="firstName" />
<result column="last_name" jdbcType="VARCHAR" property="lastName" />
<result column="address_id" jdbcType="SMALLINT" property="addressId" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="store_id" jdbcType="TINYINT" property="storeId" />
<result column="active" jdbcType="BIT" property="active" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="last_update" jdbcType="TIMESTAMP" property="lastUpdate" />
<result column="picture" jdbcType="LONGVARBINARY" property="picture" />
</resultMap>
</mapper>
若不想使用mapper插件做操作,也可以在和之前一样,先定义方法,在XML文件写SQL
- 在调试阶段可以输出Mybatis的执行SQL
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
源码地址:https://gitee.com/longhaicheng/mapper