Mybatis逆向生成使用扩展类

1.背景介绍 用的mybatis自动生成的插件,然而每次更改数据库的时候重新生成需要替换原有的mapper.xml文件,都要把之前业务相关的sql重新写一遍,感觉十分麻烦,就想着把自动生成的作为一个基础...

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文件进行替换即可,不需要再去将业务代码复制重新粘贴

  • 发表于 2019-05-27 14:20
  • 阅读 ( 155 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除