SpringBoot整合通用Mapper插件实现单表无SQL

本文介绍如何在SpringBoot项目中使用通用Mapper插件,配合MBG自动生成单表CRUD代码,简化开发流程。文章详细展示了POM依赖添加、代码生成器配置及DAO层接口定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在看之前的代码时,总是在接口层和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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值