1.背景介绍

用的mybatis自动生成的插件,然而每次更改数据库的时候重新生成需要替换原有的mapper.xml文件,都要把之前业务相关的sql重新写一遍,感觉十分麻烦,就想着把自动生成的作为一个基础文件,然后业务相关的写在扩展文件里面,这样更改数据库后只需要把所有基础文件替换掉就可以了

2.代码

2.1 BaseMapper.java

把自动生成的方法都抽到一个base类,然后可以写一些公共的方法

/**
* @author 吕梁山
* @date 2019/4/23
*/
public interface BaseMapper<T> { int deleteByPrimaryKey(Integer id); int insert(T entity); int insertSelective(T entity); int updateByPrimaryKeySelective(T entity); int updateByPrimaryKey(T entity); T selectByPrimaryKey(Integer id);
}

2.2 UserMapper.java

自动生成的mapper文件,里面基本都是空的了

public interface UserMapper extends BaseMapper<User> { }

2.3 ExtUserMapper.java

mapper的扩展类,业务相关的

/**
* @author 吕梁山
* @date 2019/4/25
*/
public interface ExtUserMapper extends UserMapper { ExtUser selectUserByOpenId(String openId); int existUserByOpenId(String openId); int updateByOpenId(User user);
}

2.4 UserMapper.xml

自动生成的mapper.xml文件,没有改动,不同的生成器生成的可能不同

注意namespace要写正确

<?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="com.pikaqiu.barber.dao.base.UserMapper">
<resultMap id="BaseResultMap" type="com.pikaqiu.barber.entity.base.User">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="user_img" property="userImg" jdbcType="VARCHAR"/>
<result column="open_id" property="openId" jdbcType="VARCHAR"/>
<result column="phone" property="phone" jdbcType="VARCHAR"/>
<result column="sex" property="sex" jdbcType="INTEGER"/>
<result column="province" property="province" jdbcType="VARCHAR"/>
<result column="country" property="country" jdbcType="VARCHAR"/>
<result column="city" property="city" jdbcType="VARCHAR"/>
<result column="birth_date" property="birthDate" jdbcType="VARCHAR"/>
<result column="subscribe_date" property="subscribeDate" jdbcType="TIMESTAMP"/>
<result column="subscribe_scene" property="subscribeScene" jdbcType="VARCHAR"/>
<result column="create_date" property="createDate" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, user_name, user_img, open_id, phone, sex, province, country, city, birth_date,
subscribe_date, subscribe_scene, create_date
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from t_user
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from t_user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.pikaqiu.barber.entity.base.User">
insert into t_user (id, user_name, user_img,
open_id, phone, sex,
province, country, city,
birth_date, subscribe_date, subscribe_scene,
create_date)
values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{userImg,jdbcType=VARCHAR},
#{openId,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{sex,jdbcType=INTEGER},
#{province,jdbcType=VARCHAR}, #{country,jdbcType=VARCHAR},
#{city,jdbcType=VARCHAR},
#{birthDate,jdbcType=VARCHAR}, #{subscribeDate,jdbcType=TIMESTAMP},
#{subscribeScene,jdbcType=VARCHAR},
#{createDate,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" parameterType="com.pikaqiu.barber.entity.base.User">
insert into t_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="userName != null">
user_name,
</if>
<if test="userImg != null">
user_img,
</if>
<if test="openId != null">
open_id,
</if>
<if test="phone != null">
phone,
</if>
<if test="sex != null">
sex,
</if>
<if test="province != null">
province,
</if>
<if test="country != null">
country,
</if>
<if test="city != null">
city,
</if>
<if test="birthDate != null">
birth_date,
</if>
<if test="subscribeDate != null">
subscribe_date,
</if>
<if test="subscribeScene != null">
subscribe_scene,
</if>
<if test="createDate != null">
create_date,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="userName != null">
#{userName,jdbcType=VARCHAR},
</if>
<if test="userImg != null">
#{userImg,jdbcType=VARCHAR},
</if>
<if test="openId != null">
#{openId,jdbcType=VARCHAR},
</if>
<if test="phone != null">
#{phone,jdbcType=VARCHAR},
</if>
<if test="sex != null">
#{sex,jdbcType=INTEGER},
</if>
<if test="province != null">
#{province,jdbcType=VARCHAR},
</if>
<if test="country != null">
#{country,jdbcType=VARCHAR},
</if>
<if test="city != null">
#{city,jdbcType=VARCHAR},
</if>
<if test="birthDate != null">
#{birthDate,jdbcType=VARCHAR},
</if>
<if test="subscribeDate != null">
#{subscribeDate,jdbcType=TIMESTAMP},
</if>
<if test="subscribeScene != null">
#{subscribeScene,jdbcType=VARCHAR},
</if>
<if test="createDate != null">
#{createDate,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.pikaqiu.barber.entity.base.User">
update t_user
<set>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="userImg != null">
user_img = #{userImg,jdbcType=VARCHAR},
</if>
<if test="openId != null">
open_id = #{openId,jdbcType=VARCHAR},
</if>
<if test="phone != null">
phone = #{phone,jdbcType=VARCHAR},
</if>
<if test="sex != null">
sex = #{sex,jdbcType=INTEGER},
</if>
<if test="province != null">
province = #{province,jdbcType=VARCHAR},
</if>
<if test="country != null">
country = #{country,jdbcType=VARCHAR},
</if>
<if test="city != null">
city = #{city,jdbcType=VARCHAR},
</if>
<if test="birthDate != null">
birth_date = #{birthDate,jdbcType=VARCHAR},
</if>
<if test="subscribeDate != null">
subscribe_date = #{subscribeDate,jdbcType=TIMESTAMP},
</if>
<if test="subscribeScene != null">
subscribe_scene = #{subscribeScene,jdbcType=VARCHAR},
</if>
<if test="createDate != null">
create_date = #{createDate,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.pikaqiu.barber.entity.base.User">
update t_user
set user_name = #{userName,jdbcType=VARCHAR},
user_img = #{userImg,jdbcType=VARCHAR},
open_id = #{openId,jdbcType=VARCHAR},
phone = #{phone,jdbcType=VARCHAR},
sex = #{sex,jdbcType=INTEGER},
province = #{province,jdbcType=VARCHAR},
country = #{country,jdbcType=VARCHAR},
city = #{city,jdbcType=VARCHAR},
birth_date = #{birthDate,jdbcType=VARCHAR},
subscribe_date = #{subscribeDate,jdbcType=TIMESTAMP},
subscribe_scene = #{subscribeScene,jdbcType=VARCHAR},
create_date = #{createDate,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>

2.5 ExtUserMapper.xml

业务相关的sql,这里用不了自动生成mapper.xml里面的BaseResultMap这些东西

<?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="com.pikaqiu.barber.dao.ExtUserMapper"> <resultMap id="BaseResultMap" type="com.pikaqiu.barber.entity.ExtUser">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="user_img" property="userImg" jdbcType="VARCHAR"/>
<result column="open_id" property="openId" jdbcType="VARCHAR"/>
<result column="phone" property="phone" jdbcType="VARCHAR"/>
<result column="sex" property="sex" jdbcType="INTEGER"/>
<result column="province" property="province" jdbcType="VARCHAR"/>
<result column="country" property="country" jdbcType="VARCHAR"/>
<result column="city" property="city" jdbcType="VARCHAR"/>
<result column="birth_date" property="birthDate" jdbcType="VARCHAR"/>
<result column="subscribe_date" property="subscribeDate" jdbcType="TIMESTAMP"/>
<result column="subscribe_scene" property="subscribeScene" jdbcType="VARCHAR"/>
<result column="create_date" property="createDate" jdbcType="TIMESTAMP"/>
</resultMap> <update id="updateByOpenId" parameterType="com.pikaqiu.barber.entity.base.User" >
update t_user
<set>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="userImg != null">
user_img = #{userImg,jdbcType=VARCHAR},
</if>
<if test="phone != null">
phone = #{phone,jdbcType=VARCHAR},
</if>
<if test="sex != null">
sex = #{sex,jdbcType=INTEGER},
</if>
<if test="province != null">
province = #{province,jdbcType=VARCHAR},
</if>
<if test="country != null">
country = #{country,jdbcType=VARCHAR},
</if>
<if test="city != null">
city = #{city,jdbcType=VARCHAR},
</if>
<if test="birthDate != null">
birth_date = #{birthDate,jdbcType=VARCHAR},
</if>
<if test="subscribeDate != null">
subscribe_date = #{subscribeDate,jdbcType=TIMESTAMP},
</if>
<if test="subscribeScene != null">
subscribe_scene = #{subscribeScene,jdbcType=VARCHAR},
</if>
<if test="createDate != null">
create_date = #{createDate,jdbcType=TIMESTAMP},
</if>
</set>
where open_id = #{openId,jdbcType=INTEGER}
</update>
<select id="selectUserByOpenId" parameterType="String" resultMap="BaseResultMap">
select *
from t_user
where open_id = #{openId,jdbcType=VARCHAR}
</select> <select id="existUserByOpenId" parameterType="String" resultType="Integer">
select count(0)
from t_user
where open_id = #{openId,jdbcType=VARCHAR}
</select>
</mapper>

2.6 UserServiceImpl.java

service层调用的时候直接调用扩展的mapper

/**
* @author 吕梁山
* @date 2019/4/23
*/
@Service("userService")
public class UserServiceImpl implements UserService { @Resource
private ExtUserMapper extUserMapper; @Override
public ExtUser getUserByOpenId(String openId) {
return extUserMapper.selectUserByOpenId(openId);
}
}

注:如果生成的mapper.xml和extmapper.xml不在同一个目录,需要在application.yml将所有mapper.xml文件都添加到扫描中

mybatis:
#扫描sql.xml文件
mapper-locations: classpath:mapping/**/*.xml
#自动扫描实体类
type-aliases-package: com.pikaqiu.barber.entity

至此,每次更改数据库结构后,直接重新生成文件对base文件进行替换即可,不需要再去将业务代码复制重新粘贴

Mybatis逆向生成使用扩展类的更多相关文章

  1. 「小程序JAVA实战」Springboot版mybatis逆向生成工具(32)

    转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootbanmybatisnixiangshengchenggongju32/ ...

  2. myBatis逆向生成及使用

    引入数据库驱动 <!-- mybatis逆向生成包 --><dependency> <groupId>org.mybatis.generator</group ...

  3. eclipse从数据库逆向生成Hibernate实体类

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

  4. [转]eclipse借助hibernate tool从数据库逆向生成Hibernate实体类

    如何从数据库逆向生成Hibernate实体类呢??? 1. 首先,要在eclipse中采用自带的数据库管理器(Data Management),连通你的数据库: 然后选择数据库,这里用的oracle, ...

  5. (转) Eclipse通过HibernateTools实现逆向生成Hibernate实体类

    背景:工作中使用Hibernate进行持久化的开发工作,所以有必要详细了解这方面的知识. ps:这里有个问题就是刷新表的时候速度太慢了.还不如自己手动去创建.如果表太多倒是可以采取批量生成的策略. 在 ...

  6. MyBatis逆向工程生成的Example类的方法总结

    很早之前就在项目开发中多次使用MyBatis逆向工程生成的Example类,但一直没有对其下的方法做一个简单的总结,现总结如下:一.mapper接口中的方法解析mapper接口中的部分常用方法及功能如 ...

  7. 【SSM 4】Mybatis逆向生成工具

    在上一篇博客中说到,Mybatis是灵活的SQL语句应用,不想Hibernate一样有其封装好的方法,那么,当我们用Mybatis的时候(Hibernate),我们都需要编写其实体类,和配置文件.本篇 ...

  8. Springboot学习与mybatis逆向生成工具

    最近H2数据库越用越觉得方便,在不同办公处无缝继续demo的感觉就是爽.   今天接上一篇Springboot简洁整合mybatis,补上sts(即eclipse)使用mybatis generato ...

  9. Mybatis逆向生成

    在已经有了数据库的表的时候,为了方便起见,我们可以逆向生成javabean,xml,dao接口等,当然,下载mybaits-generation的工具,我这里用的是eclipse插件,然后准备一 个x ...

随机推荐

  1. solr配置中文分词器

    配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...

  2. IOC容器和Bean的配置

     IOC容器和Bean的配置   1        IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取 ...

  3. HDU - 5884 Sort (二分答案+贪心)

    有n个数字,你需要把这n个数字合成一个数字,每次只能把k个数字合并成一个,花费为这k个数字的和. 给一个最大花费,问不超过这个最大花费的情况下,k的最小值. Sample Input 1 5 25 1 ...

  4. JavaScript: 2015 年回顾与展望

    链接:http://www.sitepoint.com/javascript-2015-review/ JavaScript经历了一个不平凡的一年.尽管到5月份已经20年了,关于JS的新闻.项目和兴趣 ...

  5. JSON Undefined 问题

    在IE6和IE7浏览器下或在IE8-IE10浏览器文档模式为IE7及以下时,控制台会报错:JSON is undefined. 这种错误在IE6和IE7浏览器下出现很正常,因为JSON在IE8+浏览器 ...

  6. SVN 删除所有目录下的“.svn”文件夹,让文件夹脱离SVN控制

    SVN 删除所有目录下的“.svn”文件夹,将如下语句拷备到记事本,并保存为 *.reg,双击导入注册表,在文件夹右键中就多了一条“Delete SVN Folders”,点击就可以删处此目录下的所有 ...

  7. 【SDOJ 3741】 【poj2528】 Mayor's posters

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  8. HTTP的一些概念

    1. 什么是回调? 回调是异步编程时的基础,将后续逻辑封装成起始函数的参数,逐层嵌套 2. 什么是同步/异步? 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指: ...

  9. Welcome-to-Swift-20扩展(Extensions)

    扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(cate ...

  10. kb-07线段树-12--二分查找区间边界

    /* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...