SpringBoot整合通用Mapper插件實現單表無SQL

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章