文档章节

mybatis-generator-core自动生成代码,支持生成中文注释、支持分页、提供BaseDao封装

ht896632
 ht896632
发布于 2017/04/16 22:19
字数 1576
阅读 1998
收藏 120

 

自定义修改mybatis-generator-core,更适合国内开发环境,目前只在mysql下做了测试;

码云地址:

    https://git.oschina.net/ht896632/mybatis-generator-core

一:主要修改信息如下:

   1:将原有实体类生成的英文注释修改为数据库中的中文注释

   2:将原有生成的Dao接口和Mapper.xml文件后面的Mapper更改为Dao;如:UserMapper.java 修改为:UserDao.java;UserMapper.xml修改为UserDao.xml;

   3:生成的配置文件和Dao中去除insert方法和updateById方法,因为insertSelective和updateByPrimaryKeySelective完全可以满足我们的需求

   4:强制生成的所有文件编码为UTF-8

   5.为生成的Dao方法中添加中文注释

   6.将原有Example相关示例类替换为Criteria

   7.增加分页插件,自动生成分页SQL

<plugin type="org.mybatis.generator.plugins.MySqlPaginationPlugin">
            <!--可选属性:起始页记录limitStart,根据自己实际情况可以修改,默认为limitStart->
            <property name="limitStartName" value="limitStart"></property>
            <!--可选属性:结束记录limitSize,根据自己实际情况可以修改,默认为limitSize->
            <property name="limitSizeName" value="limitSize"></property>
</plugin>


  8.增加分页插件和BaseDao插件    

<plugin type="org.mybatis.generator.plugins.MyBaseMapperGeneratorPlugin" >
            <!--必选属性baseDao在你应用中的完全限定名 name:必须是baseDaoPath,value:是你BaseDao          在你项目中的完全限定名-->
            <property name="baseDaoPath" value="com.lht.bp.api.common.BaseDao"></property>
</plugin>


注:如果需要使用,将这两个配置到generatorConfig.xml中即可,可以参考源码中的generatorConfigA.xml文件;BaseDao文件不是自动生成的,需要手动将提供的BaseDao.java文件复制到自己对应的目录 BaseDao.java文件目录:org.mybatis.generator.codegen.mybatis3.javamapper.elements.BaseDao;

废话说了这么多该上示例代码了:

1.实体

package ibatisData;

/**
 * 
 * t_dict
 * 
 * @version 1.0 2017-04-16
 */
public class Dict {
    /**
     * 主键
     * t_dict.id
     */
    private String id;

    /**
     * 字典的Key
     * t_dict.dkey
     */
    private String dkey;


    /**
     * 主键<br>
     *
     * column:t_dict.id<br>
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * 主键<br>
     *
     * column:t_dict.id<br>
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 字典的Key<br>
     *
     * column:t_dict.dkey<br>
     * @return dkey
     */
    public String getDkey() {
        return dkey;
    }

    /**
     * 字典的Key<br>
     *
     * column:t_dict.dkey<br>
     * @param dkey
     */
    public void setDkey(String dkey) {
        this.dkey = dkey;
    }

}

 

2.Dao接口

BaseDao(所有Dao接口都继承该类):

package org.mybatis.generator.codegen.mybatis3.javamapper.elements;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.annotations.Param;

/**
 * @author mybatis T表示与table表对应的实体类(Entity) E表示Entity对应的Param类 PK表示可能会用到主键
 *         (比如Integer等)
 * @param <T> 对应的实体
 * @param <E> 对应查询参数实体
 * @param <PK> 主键类型
 */
public interface BaseDao<T, E, PK extends Serializable> {
	int countByCriteria(E criteria);

	int deleteByCriteria(E criteria);

	int deleteByPrimaryKey(PK id);

	int insertSelective(T record);

	List<T> selectByCriteria(E criteria);

	T selectByPrimaryKey(PK id);

	int updateByCriteriaSelective(@Param("record") T record, @Param("param") E criteria);

	int updateByPrimaryKeySelective(T record);

}

DictDao: 

package ibatisData;

import com.lht.bp.api.common.BaseDao;
import ibatisData.Dict;
import ibatisData.DictCriteria;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface DictDao extends BaseDao<Dict, DictCriteria, String> {
}

3.XML映射文件

<?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="ibatisData.DictDao" >
  <resultMap id="BaseResultMap" type="ibatisData.Dict" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    <id column="id" property="id" jdbcType="VARCHAR" />
    <result column="dkey" property="dkey" jdbcType="VARCHAR" />
    <result column="dvalue" property="dvalue" jdbcType="VARCHAR" />
    <result column="group_id" property="groupId" jdbcType="VARCHAR" />
    <result column="dstatus" property="dstatus" jdbcType="INTEGER" />
    <result column="description" property="description" jdbcType="CHAR" />
    <result column="seq" property="seq" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Criteria_Where_Clause" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Criteria_Where_Clause" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    <where >
      <foreach collection="param.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    id, dkey, dvalue, group_id, dstatus, description, seq
  </sql>
  <select id="selectByCriteria" resultMap="BaseResultMap" parameterType="ibatisData.DictCriteria" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    select
    <if test="distinct" >
      distinct
    </if>
    'true' as QUERYID,
    <include refid="Base_Column_List" />
    from t_dict
    <if test="_parameter != null" >
      <include refid="Criteria_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
    <if test="start != null and end !=null " >
      limit #{start} , #{end}
    </if>
  </select>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    select 
    <include refid="Base_Column_List" />
    from t_dict
    where id = #{id,jdbcType=VARCHAR}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    delete from t_dict
    where id = #{id,jdbcType=VARCHAR}
  </delete>
  <delete id="deleteByCriteria" parameterType="ibatisData.DictCriteria" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    delete from t_dict
    <if test="_parameter != null" >
      <include refid="Criteria_Where_Clause" />
    </if>
  </delete>
  <insert id="insertSelective" parameterType="ibatisData.Dict" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    <selectKey resultType="java.lang.String" keyProperty="id" order="AFTER" >
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into t_dict
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="dkey != null" >
        dkey,
      </if>
      <if test="dvalue != null" >
        dvalue,
      </if>
      <if test="groupId != null" >
        group_id,
      </if>
      <if test="dstatus != null" >
        dstatus,
      </if>
      <if test="description != null" >
        description,
      </if>
      <if test="seq != null" >
        seq,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="dkey != null" >
        #{dkey,jdbcType=VARCHAR},
      </if>
      <if test="dvalue != null" >
        #{dvalue,jdbcType=VARCHAR},
      </if>
      <if test="groupId != null" >
        #{groupId,jdbcType=VARCHAR},
      </if>
      <if test="dstatus != null" >
        #{dstatus,jdbcType=INTEGER},
      </if>
      <if test="description != null" >
        #{description,jdbcType=CHAR},
      </if>
      <if test="seq != null" >
        #{seq,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <select id="countByCriteria" parameterType="ibatisData.DictCriteria" resultType="java.lang.Integer" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    select count(*) from t_dict
    <if test="_parameter != null" >
      <include refid="Criteria_Where_Clause" />
    </if>
  </select>
  <update id="updateByCriteriaSelective" parameterType="map" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    update t_dict
    <set >
      <if test="record.dkey != null" >
        dkey = #{record.dkey,jdbcType=VARCHAR},
      </if>
      <if test="record.dvalue != null" >
        dvalue = #{record.dvalue,jdbcType=VARCHAR},
      </if>
      <if test="record.groupId != null" >
        group_id = #{record.groupId,jdbcType=VARCHAR},
      </if>
      <if test="record.dstatus != null" >
        dstatus = #{record.dstatus,jdbcType=INTEGER},
      </if>
      <if test="record.description != null" >
        description = #{record.description,jdbcType=CHAR},
      </if>
      <if test="record.seq != null" >
        seq = #{record.seq,jdbcType=INTEGER},
      </if>
    </set>
    <if test="_parameter != null" >
      <include refid="Update_By_Criteria_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="ibatisData.Dict" >
    <!--
      WARNING - 
      		此SQL语句为自动生成,请不要修改.
      DATE: 2017-04-16 21:38
    -->
    update t_dict
    <set >
      <if test="dkey != null" >
        dkey = #{dkey,jdbcType=VARCHAR},
      </if>
      <if test="dvalue != null" >
        dvalue = #{dvalue,jdbcType=VARCHAR},
      </if>
      <if test="groupId != null" >
        group_id = #{groupId,jdbcType=VARCHAR},
      </if>
      <if test="dstatus != null" >
        dstatus = #{dstatus,jdbcType=INTEGER},
      </if>
      <if test="description != null" >
        description = #{description,jdbcType=CHAR},
      </if>
      <if test="seq != null" >
        seq = #{seq,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
</mapper>

更加详细的生成代码实例,请实际运行生成查看

码云地址:

https://git.oschina.net/ht896632/mybatis-generator-core

© 著作权归作者所有

ht896632
粉丝 37
博文 53
码字总数 31361
作品 0
闵行
高级程序员
私信 提问
加载中

评论(12)

ht896632
ht896632 博主

引用来自“伍咖”的评论

mapper.xml注释中有个@mbg ger什么的,你给他去掉了,会导致重新生成的时候覆盖掉自己新增的地方。

引用来自“ht896632”的评论

说的这个问题确实存在;现在我只是把mapper.xml区分开了,自己写的和生成的分开为两个文件,但是两个共用一个namespace,至于Mapper.java文件,我是直接每次重新生成了然后把自己自定义的那部分手动加上去,也不是很麻烦;期望有更好的解决方案

引用来自“伍咖”的评论

mapper.xml其实不需要区分为两个文件的,下面这段注释不需要去掉就行,自己新增的不要带这个注释,重新生成的时候就不会呗覆盖掉。而且你拆成两个的话 会导致文件比较多,Mapper.java这个我也没有找到好方法,也是手动拷贝的。 下一步可能希望能将@mbg.generated复用到Mapper.java文件中去。
找到为什么没合并Mapper.java文件了,因为在DefaultShellCallback中未实现mergeJavaFile方法;可能需要自己去实现下合并的逻辑
非职业码农
非职业码农

引用来自“伍咖”的评论

mapper.xml注释中有个@mbg ger什么的,你给他去掉了,会导致重新生成的时候覆盖掉自己新增的地方。

引用来自“ht896632”的评论

说的这个问题确实存在;现在我只是把mapper.xml区分开了,自己写的和生成的分开为两个文件,但是两个共用一个namespace,至于Mapper.java文件,我是直接每次重新生成了然后把自己自定义的那部分手动加上去,也不是很麻烦;期望有更好的解决方案
mapper.xml其实不需要区分为两个文件的,下面这段注释不需要去掉就行,自己新增的不要带这个注释,重新生成的时候就不会呗覆盖掉。而且你拆成两个的话 会导致文件比较多,Mapper.java这个我也没有找到好方法,也是手动拷贝的。 下一步可能希望能将@mbg.generated复用到Mapper.java文件中去。
ht896632
ht896632 博主

引用来自“伍咖”的评论

mapper.xml注释中有个@mbg ger什么的,你给他去掉了,会导致重新生成的时候覆盖掉自己新增的地方。
说的这个问题确实存在;现在我只是把mapper.xml区分开了,自己写的和生成的分开为两个文件,但是两个共用一个namespace,至于Mapper.java文件,我是直接每次重新生成了然后把自己自定义的那部分手动加上去,也不是很麻烦;期望有更好的解决方案
ht896632
ht896632 博主

引用来自“伍咖”的评论

可以一起交流下,我最近也对这个进行改造呢。
好的,有问题随时留言,一起讨论下;
非职业码农
非职业码农
可以一起交流下,我最近也对这个进行改造呢。
非职业码农
非职业码农
mapper.xml注释中有个@mbg ger什么的,你给他去掉了,会导致重新生成的时候覆盖掉自己新增的地方。
ihuotui
ihuotui

引用来自“pch”的评论

引用来自“ihuotui”的评论

我也写过类似的
凌晨两点啊,程序员容易猝死哦!

@pch 那么三点的程序员怎样?
ht896632
ht896632 博主

引用来自“pch”的评论

爱折腾的程序员,真不错。
生成注解的方式其实也挺漂亮的,最新的1.3.5生成器。个人认为,xml里面逻辑多了还不如用注解形式+sqlprovider。
还有写基础代码的时候,不太喜欢让其他人以继承的形式来扩展,感觉会让别人对这个有天生的恐惧。
spring现在也推崇写简单的类,尽量不要继承他的。比如说以前写controller还得继承他的AbstractController,现在不用了,普通一个类就行,清爽,也更利于自己组织类结构
赞同,越简单越好,但是现实太残酷;但是每当表中添加字段的时候,就不得不去改之前写的SQL语句,这样太痛苦,如果用生成的方式,直接重新生成就好;
p
pch

引用来自“ihuotui”的评论

我也写过类似的
凌晨两点啊,程序员容易猝死哦!
p
pch
爱折腾的程序员,真不错。
生成注解的方式其实也挺漂亮的,最新的1.3.5生成器。个人认为,xml里面逻辑多了还不如用注解形式+sqlprovider。
还有写基础代码的时候,不太喜欢让其他人以继承的形式来扩展,感觉会让别人对这个有天生的恐惧。
spring现在也推崇写简单的类,尽量不要继承他的。比如说以前写controller还得继承他的AbstractController,现在不用了,普通一个类就行,清爽,也更利于自己组织类结构
ht896632/mybatis-generator-core

重点:在使用之前,请认真阅读,请不要在自己写的地方添加 WARNING - @mbg.generated 这个注释,也不要删除自动生成的 WARNING - @mbg.generated 注释,因为合并是根据这个注释进行做操作的,...

ht896632
2016/04/20
0
0
nature/kunter-generator

kunter-generator Git@OSC GitHub Bitbucket Coding 因服务器问题,Maven私库无法提供服务,如需下载kunter-base包请私信我 特别声明:因为采用了12c特有分页语法,本工具Oracle暂时不支持O...

nature
2015/06/03
0
0
代码生成平台 - Xxl-Code-Generator

代码生成平台Xxl-Code-Generator Xxl-Code-Generator 是一个 "controller/service/dao/mybatis/model" 多层的代码生成平台。只需要提供SQL,将会自动生成全部代码。 特性 1、简洁:界面操作,...

许雪里
2018/05/04
1K
5
kunter-generator 1.3.2 版本发布,代码生成工具

kunter-generator 参考 MyBatis 官方 generator 设计而成,参考版本为(1.3.2)。具有生成项目基础代码、根据数据库生成 Excel 格式的设计文档、根据Excel格式生成创建数据库脚本功能。为了方...

angelsinklow
2015/06/09
699
0
在Spring4中使用通用Mapper

在Spring4中使用通用Mapper Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写,可以通过来实现通用的。 这篇文档主要讲解...

Liuzh_533
2014/12/12
22.3K
29

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
687
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
39
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
25
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
74
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
72
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部