spring boot项目整合通用mapper以及代码生成

通用mapper地址:https://gitee.com/free/Mapper

感谢作者

简介:用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。

极其方便的使用MyBatis单表的增删改查。

支持单表操作,不支持通用的多表联合查询。

通用 Mapper 支持 Mybatis-3.2.4 及以上版本。

 

新建spring boot项目 整合mybatis  读取数据库数据 成功之后

1 配置通用mapper实现增删改查

1.1 maven添加依赖

        <!-- 通用 Mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.0</version>
        </dependency>
        <!-- 通用 Mapper 代码生成依赖-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>
        <!-- 通用 Mapper 代码生成依赖 end-->

1.2 修改启动类Application,

@MapperScan 换成 tk.mybatis包下的

1.3 dao层接口 继承 通用类mapper

1.4 编写测试代码,调取通用mapper方法。启动项目,成功返回数据。

 2 代码生成器

 2.1 创建generatorConfig.xml

<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--

       通用mapper 专用代码生成器
       只生成model、mapper、mapper.xml
       生成之后直接能运行
       但是controller和service层需手动创建

-->
<generatorConfiguration>
    <!--引入配置文件-->
    <properties resource="application.yml"/>

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>
        <!--配置数据库-->
        <jdbcConnection driverClass="${driver-class-name}"
                        connectionURL="${url}"
                        userId="${username}"
                        password="${password}">
        </jdbcConnection>

        <!--model文件保存路径-->
        <javaModelGenerator targetPackage="com.example.demo3.model"
                            targetProject="src/main/java"/>

        <!--mapper.xml文件保存路径-->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources"/>

        <!--mapper文件保存路径-->
        <javaClientGenerator targetPackage="com.example.demo3.mapper"
                             targetProject="src/main/java"
                             type="XMLMAPPER"/>

        <!--表名-->
        <table tableName="sys_menu">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>

2.3 创建CodeGenerator.java

package com.example.bootmybatis.generator;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.util.ArrayList;
import java.util.List;

import static org.apache.ibatis.io.Resources.getResourceAsStream;

public class CodeGenerator {

    /**
     * *************************************************
     *                     代码生成
     *    启动前需修改配置文件    generatorConfig.xml
     * *************************************************
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config =
                cp.parseConfiguration(getResourceAsStream("generatorConfig/generatorConfig.xml"));
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

2.4 启动main方法,文件自动生成。

2.5 通用mapper代码生成器还支持模板方式生成代码,以下generatorConfig.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<!--
**********************************************************************************************************************************************

                                                        通用mapper 代码生成器 支持模板生成代码

**********************************************************************************************************************************************
-->
<generatorConfiguration>
    <!--引入配置文件-->
    <properties resource="application.yml" />

    <!--引入驱动文件 (已在maven中引入)-->
    <!--<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>-->

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="javaFileEncoding" value="UTF-8"/>
        <!--配置是否使用通用 Mapper 自带的注释扩展,默认 true-->
        <!--<property name="useMapperCommentGenerator" value="false"/>-->

        <!--通用 Mapper 插件,可以生成带注解的实体类-->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.hsqldb.HsqldbMapper"/>
            <property name="caseSensitive" value="true"/>
            <property name="forceAnnotation" value="true"/>
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
        </plugin>

        <!--通用代码生成器插件-->
        <plugin type="tk.mybatis.mapper.generator.TemplateFilePlugin">
            <property name="targetProject" value="src/main/java"/>
            <property name="targetPackage" value="com.example.demo3.dao"/>
            <property name="templatePath" value="templates/mapper.ftl"/>
            <property name="mapperSuffix" value="Dao"/>
            <property name="fileName" value="${tableClass.shortClassName}${mapperSuffix}.java"/>
            <!--自定义属性-->
            <property name="author" value="xxxx"/>
        </plugin>
        <plugin type="tk.mybatis.mapper.generator.TemplateFilePlugin">
            <property name="targetProject" value="src/main/java"/>
            <property name="targetPackage" value="com.example.demo3.controller"/>
            <property name="templatePath" value="templates/controller.ftl"/>
            <property name="mapperSuffix" value="Controller"/>
            <property name="fileName" value="${tableClass.shortClassName}${mapperSuffix}.java"/>
            <!--自定义属性-->
            <property name="author" value="xxxx"/>
        </plugin>

        <jdbcConnection driverClass="${driver-class-name}"
                        connectionURL="${url}"
                        userId="${username}"
                        password="${password}">
        </jdbcConnection>

        <!--MyBatis 生成器只需要生成 Model-->
        <javaModelGenerator targetPackage="com.example.demo3.model" targetProject="src/main/java"/>
        <!--生成mapper.xml (系统模板,因为使用了自定义模板所以不需要)-->
        <!--<sqlMapGenerator targetPackage="com.example.demo3.model.1" targetProject="${javaPath}"/>-->

        <table tableName="sys_menu">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>

 

2.6 这个例子通过模板生成了mapper.xml和controller  还有工具自带模板的model

模板就不放上了了,根据自己业务编写。没有固定格式。

模板是freemarker实现的

把官方示例放上来以供参考

特殊:targetPackage值在 ${package} 中。

<!-- 详细日期用法参考:http://freemarker.apache.org/docs/ref_builtins_date.html -->
当前时间:
<#assign dateTime = .now>
日期:${dateTime?date}
时间:${dateTime?time}
格式化:${dateTime?string["yyyy-MM-dd HH:mm:ss"]}


所有配置的属性信息:
<#list props?keys as key>
    ${key} - ${props[key]}
</#list>

<#--自定义属性-->
作者:${author}
<#--自定义属性 end-->



实体和表的信息:
表名:${tableClass.tableName}
变量名:${tableClass.variableName}
小写名:${tableClass.lowerCaseName}
类名:${tableClass.shortClassName}
全名:${tableClass.fullClassName}
包名:${tableClass.packageName}

列的信息:
=====================================
<#if tableClass.pkFields??>
    主键:
    <#list tableClass.pkFields as field>
        -------------------------------------
        列名:${field.columnName}
        列类型:${field.jdbcType}
        字段名:${field.fieldName}
        注释:${field.remarks}
        类型包名:${field.typePackage}
        类型短名:${field.shortTypeName}
        类型全名:${field.fullTypeName}
        是否主键:${field.identity?c}
        是否可空:${field.nullable?c}
        是否为BLOB列:${field.blobColumn?c}
        是否为String列:${field.stringColumn?c}
        是否为字符串列:${field.jdbcCharacterColumn?c}
        是否为日期列:${field.jdbcDateColumn?c}
        是否为时间列:${field.jdbcTimeColumn?c}
        是否为序列列:${field.sequenceColumn?c}
        列长度:${field.length?c}
        列精度:${field.scale}
    </#list>
</#if>

<#if tableClass.baseFields??>
    基础列:
    <#list tableClass.baseFields as field>
        -------------------------------------
        列名:${field.columnName}
        列类型:${field.jdbcType}
        字段名:${field.fieldName}
        注释:${field.remarks}
        类型包名:${field.typePackage}
        类型短名:${field.shortTypeName}
        类型全名:${field.fullTypeName}
        是否主键:${field.identity?c}
        是否可空:${field.nullable?c}
        是否为BLOB列:${field.blobColumn?c}
        是否为String列:${field.stringColumn?c}
        是否为字符串列:${field.jdbcCharacterColumn?c}
        是否为日期列:${field.jdbcDateColumn?c}
        是否为时间列:${field.jdbcTimeColumn?c}
        是否为序列列:${field.sequenceColumn?c}
        列长度:${field.length?c}
        列精度:${field.scale}
    </#list>
</#if>

<#if tableClass.blobFields??>
    Blob列:
    <#list tableClass.blobFields as field>
        -------------------------------------
        列名:${field.columnName}
        列类型:${field.jdbcType}
        字段名:${field.fieldName}
        注释:${field.remarks}
        类型包名:${field.typePackage}
        类型短名:${field.shortTypeName}
        类型全名:${field.fullTypeName}
        是否主键:${field.identity?c}
        是否可空:${field.nullable?c}
        是否为BLOB列:${field.blobColumn?c}
        是否为String列:${field.stringColumn?c}
        是否为字符串列:${field.jdbcCharacterColumn?c}
        是否为日期列:${field.jdbcDateColumn?c}
        是否为时间列:${field.jdbcTimeColumn?c}
        是否为序列列:${field.sequenceColumn?c}
        列长度:${field.length?c}
        列精度:${field.scale}
    </#list>
</#if>

=====================================
全部列(包含了pk,base,blob 字段,可用的属性和上面的一样):
<#if tableClass.allFields??>
    列名 - 字段名
    <#list tableClass.allFields as field>
        ${field.columnName} - ${field.fieldName}
    </#list>
</#if>

根据模板生成文件内容

特殊:targetPackage值在 com.example.bootmybatis.dao 中。


作者:xxxx


<!-- 详细日期用法参考:http://freemarker.apache.org/docs/ref_builtins_date.html -->
当前时间:
日期:2019-8-17
时间:19:12:55
格式化:2019-08-17 19:12:55


所有配置的属性信息:
    targetPackage - com.example.bootmybatis.dao
    mapperSuffix - Dao
    author - xxxx
    templatePath - templates/mapper.ftl
    targetProject - src/main/java
    fileName - ${tableClass.shortClassName}${mapperSuffix}.java

实体和表的信息:
表名:sys_menu
变量名:sysMenu
小写名:sysmenu
类名:SysMenu
全名:com.example.bootmybatis.model.SysMenu
包名:com.example.bootmybatis.model

列的信息:
=====================================
    主键:
        -------------------------------------
        列名:id
        列类型:INTEGER
        字段名:id
        注释:
        类型包名:java.lang
        类型短名:Integer
        类型全名:java.lang.Integer
        是否主键:true
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:10
        列精度:0

    基础列:
        -------------------------------------
        列名:parent_id
        列类型:INTEGER
        字段名:parentId
        注释:父菜单ID,一级菜单为0
        类型包名:java.lang
        类型短名:Integer
        类型全名:java.lang.Integer
        是否主键:false
        是否可空:true
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:10
        列精度:0
        -------------------------------------
        列名:menu_name
        列类型:VARCHAR
        字段名:menuName
        注释:菜单名称
        类型包名:java.lang
        类型短名:String
        类型全名:java.lang.String
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:true
        是否为字符串列:true
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:32
        列精度:0
        -------------------------------------
        列名:path
        列类型:VARCHAR
        字段名:path
        注释:路径
        类型包名:java.lang
        类型短名:String
        类型全名:java.lang.String
        是否主键:false
        是否可空:true
        是否为BLOB列:false
        是否为String列:true
        是否为字符串列:true
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:64
        列精度:0
        -------------------------------------
        列名:is_menu_type
        列类型:BIT
        字段名:isMenuType
        注释:类型:0:目录,1:菜单,2:按钮
        类型包名:java.lang
        类型短名:Boolean
        类型全名:java.lang.Boolean
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:1
        列精度:0
        -------------------------------------
        列名:icon
        列类型:VARCHAR
        字段名:icon
        注释:菜单图标
        类型包名:java.lang
        类型短名:String
        类型全名:java.lang.String
        是否主键:false
        是否可空:true
        是否为BLOB列:false
        是否为String列:true
        是否为字符串列:true
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:32
        列精度:0
        -------------------------------------
        列名:create_uid
        列类型:INTEGER
        字段名:createUid
        注释:创建者ID
        类型包名:java.lang
        类型短名:Integer
        类型全名:java.lang.Integer
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:10
        列精度:0
        -------------------------------------
        列名:update_uid
        列类型:INTEGER
        字段名:updateUid
        注释:修改者ID
        类型包名:java.lang
        类型短名:Integer
        类型全名:java.lang.Integer
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:10
        列精度:0
        -------------------------------------
        列名:create_time
        列类型:TIMESTAMP
        字段名:createTime
        注释:创建时间
        类型包名:java.util
        类型短名:Date
        类型全名:java.util.Date
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:19
        列精度:0
        -------------------------------------
        列名:update_time
        列类型:TIMESTAMP
        字段名:updateTime
        注释:修改时间
        类型包名:java.util
        类型短名:Date
        类型全名:java.util.Date
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:19
        列精度:0
        -------------------------------------
        列名:status
        列类型:SMALLINT
        字段名:status
        注释:状态 0:禁用 1:正常
        类型包名:java.lang
        类型短名:Short
        类型全名:java.lang.Short
        是否主键:false
        是否可空:false
        是否为BLOB列:false
        是否为String列:false
        是否为字符串列:false
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:5
        列精度:0
        -------------------------------------
        列名:router
        列类型:VARCHAR
        字段名:router
        注释:路由
        类型包名:java.lang
        类型短名:String
        类型全名:java.lang.String
        是否主键:false
        是否可空:true
        是否为BLOB列:false
        是否为String列:true
        是否为字符串列:true
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:64
        列精度:0
        -------------------------------------
        列名:alias
        列类型:VARCHAR
        字段名:alias
        注释:别名
        类型包名:java.lang
        类型短名:String
        类型全名:java.lang.String
        是否主键:false
        是否可空:true
        是否为BLOB列:false
        是否为String列:true
        是否为字符串列:true
        是否为日期列:false
        是否为时间列:false
        是否为序列列:false
        列长度:64
        列精度:0

    Blob列:

=====================================
全部列(包含了pk,base,blob 字段,可用的属性和上面的一样):
    列名 - 字段名
        id - id
        parent_id - parentId
        menu_name - menuName
        path - path
        is_menu_type - isMenuType
        icon - icon
        create_uid - createUid
        update_uid - updateUid
        create_time - createTime
        update_time - updateTime
        status - status
        router - router
        alias - alias

以上

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值