mybatis generator自定义sql以及方法生成(二)

前言

接着上篇文章,一步步自定义需要生成的自定义方法以及在mapper.xml中生成自己想要的sql文件

开始改造

更改mapper方法命名风格

mybatis-generator生成的默认方法不是我想要的,我想要的风格如下:

selectByPrimaryKey --> selectOne

updateByPrimaryKeySelective --> update

deleteByPrimaryKey --> delete

mybatis-generator生成的mapper方法名来自于org.mybatis.generator.api.IntrospectedTable.java,找到该类中的calculateXmlAttributes方法,修改如下

protected void calculateXmlAttributes() {
        ---部分省略----
//      将deleteByPrimaryKey修改成 delete
//      setDeleteByPrimaryKeyStatementId("deleteByPrimaryKey"); //$NON-NLS-1$
        setDeleteByPrimaryKeyStatementId("delete");

//      将insertSelective修改成 insert
//      setInsertSelectiveStatementId("insertSelective"); //$NON-NLS-1$
        setInsertSelectiveStatementId("insert"); //$NON-NLS-1$


//      将selectByPrimaryKey修改成 selectOne
//      setSelectByPrimaryKeyStatementId("selectByPrimaryKey"); //$NON-NLS-1$
        setSelectByPrimaryKeyStatementId("selectOne");

//      将updateByPrimaryKeySelective修改成 update
//      setUpdateByPrimaryKeySelectiveStatementId("updateByPrimaryKeySelective"); //$NON-NLS-1$
        setUpdateByPrimaryKeySelectiveStatementId("update");
//$NON-NLS-1$

    }

mybaits-example工程中运行myTest类,成功生成了自己想要的命名风格方法,同时mapper.xml文件中insert标签中的id属性值也跟着变了,但是有个问题,生成的insert方法冲突了,接着改造。

public interface SysUserMapper {
    int delete(String id);

    int insert(SysUser row);

    int insert(SysUser row);

    SysUser selectOne(String id);

    int update(SysUser row);

    int updateByPrimaryKey(SysUser row);
}
<select id="selectOne" parameterType="java.lang.String" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </select>
  <delete id="delete" parameterType="java.lang.String">
    delete from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </delete>
  <insert id="insert" parameterType="com.cloud.dao.po.SysUser">
    insert into t_sys_user (id, username, password, 
      nickname, dep_id, pos_id
      )
    values (#{id,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{nickname,jdbcType=VARCHAR}, #{depId,jdbcType=INTEGER}, #{posId,jdbcType=VARCHAR}
      )
  </insert>
  <insert id="insert" parameterType="com.cloud.dao.po.SysUser">
    insert into t_sys_user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="username != null">
        username,
      </if>
      <if test="password != null">
        password,
      </if>
      <if test="nickname != null">
        nickname,
      </if>
      <if test="depId != null">
        dep_id,
      </if>
      <if test="posId != null">
        pos_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="username != null">
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        #{posId,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="update" parameterType="com.cloud.dao.po.SysUser">
    update t_sys_user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        dep_id = #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        pos_id = #{posId,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.cloud.dao.po.SysUser">
    update t_sys_user
    set username = #{username,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR},
      nickname = #{nickname,jdbcType=VARCHAR},
      dep_id = #{depId,jdbcType=INTEGER},
      pos_id = #{posId,jdbcType=VARCHAR}
    where id = #{id,jdbcType=VARCHAR}
  </update>

 找到org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator.java中的getCompilationUnits方法,只保留我们想要生成的mapper方法

@Override
    public List<CompilationUnit> getCompilationUnits() {
        ---省略部分代码---

        //        addCountByExampleMethod(interfaze);
//        addDeleteByExampleMethod(interfaze);
//        addDeleteByPrimaryKeyMethod(interfaze);
//        addInsertMethod(interfaze);
//        addInsertSelectiveMethod(interfaze);
//        addSelectByExampleWithBLOBsMethod(interfaze);
//        addSelectByExampleWithoutBLOBsMethod(interfaze);
//        addSelectByPrimaryKeyMethod(interfaze);
//        addUpdateByExampleSelectiveMethod(interfaze);
//        addUpdateByExampleWithBLOBsMethod(interfaze);
//        addUpdateByExampleWithoutBLOBsMethod(interfaze);
//        addUpdateByPrimaryKeySelectiveMethod(interfaze);
//        addUpdateByPrimaryKeyWithBLOBsMethod(interfaze);
//        addUpdateByPrimaryKeyWithoutBLOBsMethod(interfaze);

       
        addDeleteByPrimaryKeyMethod(interfaze);
        addInsertSelectiveMethod(interfaze);
        addUpdateByPrimaryKeySelectiveMethod(interfaze);
        addSelectByPrimaryKeyMethod(interfaze);

        ----省略部分代码----
    }

运行myTest类,生成的结果只保留了我们想要生成的方法,但是生成的sql还是有多余的,并没有随着JavaMapperGenerator.java这个类的修改而减少,接着往下改造

public interface SysUserMapper {
    int delete(String id);

    int insert(SysUser row);

    int update(SysUser row);

    SysUser selectOne(String id);
}
<select id="selectOne" parameterType="java.lang.String" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </select>
  <delete id="delete" parameterType="java.lang.String">
    delete from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </delete>
  <insert id="insert" parameterType="com.cloud.dao.po.SysUser">
    insert into t_sys_user (id, username, password, 
      nickname, dep_id, pos_id
      )
    values (#{id,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{nickname,jdbcType=VARCHAR}, #{depId,jdbcType=INTEGER}, #{posId,jdbcType=VARCHAR}
      )
  </insert>
  <insert id="insert" parameterType="com.cloud.dao.po.SysUser">
    insert into t_sys_user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="username != null">
        username,
      </if>
      <if test="password != null">
        password,
      </if>
      <if test="nickname != null">
        nickname,
      </if>
      <if test="depId != null">
        dep_id,
      </if>
      <if test="posId != null">
        pos_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="username != null">
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        #{posId,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="update" parameterType="com.cloud.dao.po.SysUser">
    update t_sys_user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        dep_id = #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        pos_id = #{posId,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.cloud.dao.po.SysUser">
    update t_sys_user
    set username = #{username,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR},
      nickname = #{nickname,jdbcType=VARCHAR},
      dep_id = #{depId,jdbcType=INTEGER},
      pos_id = #{posId,jdbcType=VARCHAR}
    where id = #{id,jdbcType=VARCHAR}
  </update>

找到org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator.java中的getSqlMapElement方法,也只需要保留我们自己想要生成的sql(与JavaMapperGenerator.java类中保留的方法保持一致

    protected XmlElement getSqlMapElement() {
        ---省略部分代码---

        //        addResultMapWithoutBLOBsElement(answer);
//        addResultMapWithBLOBsElement(answer);
//        addExampleWhereClauseElement(answer);
//        addMyBatis3UpdateByExampleWhereClauseElement(answer);
//        addBaseColumnListElement(answer);
//        addBlobColumnListElement(answer);
//        addSelectByExampleWithBLOBsElement(answer);
//        addSelectByExampleWithoutBLOBsElement(answer);
//        addSelectByPrimaryKeyElement(answer);
//        addDeleteByPrimaryKeyElement(answer);
//        addDeleteByExampleElement(answer);
//        addInsertElement(answer);
//        addInsertSelectiveElement(answer);
//        addCountByExampleElement(answer);
//        addUpdateByExampleSelectiveElement(answer);
//        addUpdateByExampleWithBLOBsElement(answer);
//        addUpdateByExampleWithoutBLOBsElement(answer);
//        addUpdateByPrimaryKeySelectiveElement(answer);
//        addUpdateByPrimaryKeyWithBLOBsElement(answer);
//        addUpdateByPrimaryKeyWithoutBLOBsElement(answer);

        // mapper.xml中 -> 生成resultMap 标签内容
        addResultMapWithoutBLOBsElement(answer);

        // mapper.xml中 -> 生成sql 标签内容
        addBaseColumnListElement(answer);

        // mapper.xml中 -> 生成 select标签 id = selectOne
        addSelectByPrimaryKeyElement(answer);

        // mapper.xml中 -> 生成 insert标签 id = insert
        addInsertSelectiveElement(answer);

        // mapper.xml中 -> 生成 update标签 id = update
        addUpdateByPrimaryKeySelectiveElement(answer);

        // mapper.xml中 -> 生成 delete标签 id = delete
        addDeleteByPrimaryKeyElement(answer);

        return answer;
    }

重新生成mapper.xml文件后,生成的sql和mapper方法一一对应着

<select id="selectOne" parameterType="java.lang.String" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </select>
  <insert id="insert" parameterType="com.cloud.dao.po.SysUser">
    insert into t_sys_user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="username != null">
        username,
      </if>
      <if test="password != null">
        password,
      </if>
      <if test="nickname != null">
        nickname,
      </if>
      <if test="depId != null">
        dep_id,
      </if>
      <if test="posId != null">
        pos_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="username != null">
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        #{posId,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="update" parameterType="com.cloud.dao.po.SysUser">
    update t_sys_user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="depId != null">
        dep_id = #{depId,jdbcType=INTEGER},
      </if>
      <if test="posId != null">
        pos_id = #{posId,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
  <delete id="delete" parameterType="java.lang.String">
    delete from t_sys_user
    where id = #{id,jdbcType=VARCHAR}
  </delete>

 结语

到这里基本的改造就完成了,我们只保留了我们需要的sql以及重新定义了方法的命名风格,下一篇扩展自定义sql,扩展流程和上面改造流程基本上是一样的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis Generator 是一个可以自动化生成MyBatis代码的工具,包括 Mapper 接口、Mapper XML 文件以及 POJO 类等。如果你想要生成 Mapper XML 文件,可以按照以下步骤进行操作: 1. 配置 MyBatis Generator 插件:在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> ``` 2. 编写 MyBatis Generator 配置文件:创建一个名为 generatorConfig.xml 的文件,并按照以下格式进行配置: ```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"> <generatorConfiguration> <context id="context1"> <!-- 配置数据库连接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root"> </jdbcConnection> <!-- 配置生成Java 模型类的包名和位置 --> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 配置生成的 Mapper 接口的包名和位置 --> <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 配置生成的 Mapper XML 文件的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 配置要生成的表 --> <table tableName="user" domainObjectName="User" /> </context> </generatorConfiguration> ``` 其中,`jdbcConnection` 标签用于配置数据库连接信息,`javaModelGenerator` 标签用于配置生成Java 模型类的包名和位置, `sqlMapGenerator` 标签用于配置生成的 Mapper 接口的包名和位置,`javaClientGenerator` 标签用于配置生成的 Mapper XML 文件的位置,`table` 标签用于配置要生成的表。 3. 运行 MyBatis Generator:在工程根目录下执行以下命令: ``` mvn mybatis-generator:generate ``` 执行命令后,MyBatis Generator 将自动生成 Mapper XML 文件,并放置在 `target/generated-sources/mybatis-generator` 目录下。 注意:在执行命令之前,需要先将 Maven 的 settings.xml 文件中的本地仓库地址修改为你自己的仓库地址,否则可能会出现找不到 MyBatis Generator 插件的情况。 ### 回答2: MyBatis Generator是一个在Java项目中自动生成MyBatis数据库访问层代码的工具。它能够根据数据库表结构自动生成包含增删改查等基本方法的Mapper接口和对应的XML映射文件。 生成Mapper接口和XML映射文件的过程非常简单。首先需要配置MyBatis Generator生成规则,配置文件中包括数据库连接信息以及要生成的表名等。其次,可以使用命令行或者Maven插件来执行生成命令,工具会连接数据库读取表信息,并据此生成对应的Mapper接口和XML映射文件。 生成的Mapper接口中包含了常见的数据库操作方法,如插入insert、删除delete、更新update和查询select。这些方法会在对应的XML映射文件中被实现,通过SQL语句与数据库进行交互。可以根据需要自定义SQL语句,也可以使用MyBatis提供的动态SQL特性来灵活地构建查询条件。 生成的XML映射文件中,会将Mapper接口中定义的方法与对应的SQL语句进行映射。映射时需要指定SQL语句的类型,如insert、delete、update或select,并在对应的标签中编写具体的SQL语句。可以使用占位符来引用Mapper接口方法中的参数,从而实现动态SQL的拼接。 总之,使用MyBatis Generator可以方便地自动生成Mapper接口和XML映射文件,减少了手动编写代码的工作量,提高了开发效率。同时,生成的代码结构清晰,易于维护和扩展。 ### 回答3: MyBatis Generator是一个用于自动生成持久层代码的工具,它可以根据数据库表结构自动生成代码,包括mapper.xml文件中的方法MyBatis Generator生成mapper.xml文件中的方法需要指定数据表的信息,比如表名、列名、数据类型等。通常情况下,我们需要先创建一个配置文件,指定数据库的连接信息和要生成代码的目标文件路径等。 在配置文件中,可以通过配置表名的规则、列名的规则以及其他定制化的配置项,来指定生成代码的方式和风格。配置完成后,执行生成器程序,它会根据配置文件中的规则和信息自动读取数据库表结构,并生成对应的mapper.xml文件。 生成的mapper.xml文件会包含CRUD操作的基础方法,比如插入、删除、更新、查询等,这些方法的具体实现会根据数据库表结构自动生成生成方法会根据表结构的主键、索引等信息生成对应的条件查询方法,方便根据特定的条件进行查询操作。 此外,MyBatis Generator还可以生成动态SQL查询的方法,可以根据不同的查询条件生成不同的查询语句,方便根据不同的需求进行灵活的查询。 总而言之,通过配置文件和执行生成器程序,可以使用MyBatis Generator自动化生成mapper.xml文件中的方法,从而减少手工编写重复繁琐的代码工作,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值