前言
在看之前的代碼時,總是在接口層和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