通用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
以上