使用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配置如下:
生成的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 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 list = springCacheExpandMapper.selectByExample(example);
System.out.println(list);
}
打印的SQL如下:
如上图所示,criteria对象的方法虽然很多,但其实都很好记,完全可以望文生义,方法名无非就是and表字段条件
推荐使用mybatis的Examle、criteria作为条件查询,虽然大家也能写出通用的条件查询方法,但是你写一两次过过瘾就行了,重复造这些单表增删改查的轮子,有意思吗?!
补充:
updateByPrimaryKeySelective方法有bug不建议使用,如下:
update spring_cache_relevance
name = #{name,jdbcType=VARCHAR},
relevance_text = #{relevanceText,jdbcType=VARCHAR},
where id = #{id,jdbcType=VARCHAR}
暂时未知晓如何配置generatorConfig.xml能去掉updateByPrimaryKeySelective但保留updateByPrimaryKey,知道的朋友请留言。
updateByExample也是使用if test="name != null"这种判断,所以在generatorConfig.xml中配置enableUpdateByExample="false",不生成updateByExample
示例代码下载:https://pan.baidu.com/s/1n51sNZIkfASpNwuauk4A8g