mybatis无脑增删改查法

使用mybatis generator 生成mapper、po以后最好不要修改这些自动生成的文件。尤其是在开发阶段,每次表字段改动,重新生成mapper、po的时候,还要把新增的SQL从旧文件拷出来粘贴到新文件中,非常麻烦。若不改动generator生成的文件,我们自己写的SQL应该写到那里去呢?

首先看下生成的mapper.xml

上图中SpringCache.xml的namespace为SpringCache.java的全名。

事实上mybatis的mapper.xml和mapper.java要建立映射关系只要满足以下条件:

    1、XxMapper.xml和XxMapper.java文件名相同。

    2、编译之后生成的XxMapper.xml、XxMapper.class在同一个文件夹中

    3、XxMapper.xml的namespace(命名空间)为XxMapper.java的全名

由此想到,可以同一个目录中新建一个拓展的xml:XxExpandMapper.xml和一个拓展的java:XxExpandMapper.java,将xml中的namespace指定为java的全名,这样就建立xml和java的映射关系了。

如下图:

xml和java映射上了,那么java中的方法和xml中的SQL如何映射呢?

映射规则如下:

    1、xml中SQL语句的id就是java方法名。

    2、xml中SQL语句的resultType、resultMap就是java方法的返回值类型(返回多条则是List中元素的类型)

    3、java方法的参数在SQL中用#{},${}获取。其中${}存在SQL注入风险。

在上图的,我们自定义的SQL写在了SpringCacheExpandMapper.xml中,调用SpringCacheExpandMapper来测试。结果如下:

 

补充:

  

如上图:可以使用子类SpringCacheExpandMapper调用父类的selectByPrimaryKey方法,不必注入SpringCacheMapper。

 

如上图:拓展的xml可以通过extends继承基础xml的resultMap等

 

如上图:include可以通过refid引用其他xml中定义好的SQL片段。

 

总结:新建拓展的java和xml,通过namespace把Java和xml映射上,把自定义的SQL写到这些文件中,生成的文件不要动。

 

还没完,Part 2

mybatis generator默认会生成一些条件查询的方法,不建议禁用。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">
<generatorConfiguration>
  <context id="testTables" targetRuntime="MyBatis3">
    <!--序列化bean,方便做缓存、远程调用-->
    <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
    <commentGenerator>
      <property name="suppressAllComments" value="true" />
    </commentGenerator>
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
      connectionURL="jdbc:mysql://改成你的:3306/cpq?useUnicode=false&characterEncoding=utf8&useSSL=false&serverTimezone=GMT" userId="root"
      password="改成你的">
    </jdbcConnection>
    <javaTypeResolver>
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
    <javaModelGenerator targetPackage="com.mybatis.wunao.springcacherelevance.model"
      targetProject="src/main/java">
      <property name="enableSubPackages" value="false" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
    <sqlMapGenerator targetPackage="com.mybatis.wunao.springcacherelevance.mapper"
      targetProject="src/main/java">
      <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>
    <javaClientGenerator targetPackage="com.mybatis.wunao.springcacherelevance.mapper"
      targetProject="src/main/java" type="XMLMAPPER">
      <property name="enableSubPackages" value="false" />
    </javaClientGenerator>
    <table tableName="spring_cache_relevance"
         enableUpdateByExample="false"> <!--不生成updateByExample-->
      <property name="useActualColumnNames" value="false"/>
    </table>
  </context>
</generatorConfiguration>

 

生成的mapper.java如下:

 

public interface SpringCacheMapper {
    long countByExample(SpringCacheExample example);

    int deleteByExample(SpringCacheExample example);

    int deleteByPrimaryKey(String id);

    int insert(SpringCache record);

    int insertSelective(SpringCache record);

    List<SpringCache> selectByExample(SpringCacheExample example);

    SpringCache selectByPrimaryKey(String id);

    int updateByPrimaryKeySelective(SpringCache record);

    int updateByPrimaryKey(SpringCache record);
}

 

简单使用下mybatis generator的条件查询,具体用法请自行百度、Google。

 

 

//简单展示Example、Criteria
@Test
public void test2() {
   SpringCacheExample example = new SpringCacheExample();
   SpringCacheExample.Criteria criteria = example.createCriteria();
   // date倒序排列
     example.setOrderByClause("date DESC");
   Integer num = 100;
   //num小于100
   if (num != null){
      criteria.andNumLessThan( num);
   }
   List<SpringCache> list = springCacheExpandMapper.selectByExample(example);
   System.out.println(list);
}

打印的SQL如下:

 

如上图所示,criteria对象的方法虽然很多,但其实都很好记,完全可以望文生义,方法名无非就是and表字段条件

推荐使用mybatis的Examle、criteria作为条件查询,虽然大家也能写出通用的条件查询方法,但是你写一两次过过瘾就行了,重复造这些单表增删改查的轮子,有意思吗?!

补充:

    updateByPrimaryKeySelective方法有bug不建议使用,如下:

  <update id="updateByPrimaryKeySelective" parameterType="com.mybatis.wunao.springcacherelevance.model.SpringCacheRelevance">
    update spring_cache_relevance
    <set>
      <!-- Selective方法表示为null则不更新、插入。有bug,更符合业务场景的写法是test="name != null and name != ''"-->
      <if test="name != null">
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="relevanceText != null">
        relevance_text = #{relevanceText,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
 

暂时未知晓如何配置generatorConfig.xml能去掉updateByPrimaryKeySelective但保留updateByPrimaryKey,知道的朋友请留言。

updateByExample也是使用if test="name != null"这种判断,所以在generatorConfig.xml中配置enableUpdateByExample="false",不生成updateByExample

示例代码下载:https://pan.baidu.com/s/1n51sNZIkfASpNwuauk4A8g

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值