Do not go gentle into that good night
开发环境:
Eclipse 4.3
jdk1.7.0_72
apache-maven-3.0.4
apache-tomcat-7.0.53
spring-mvc-4.0
spring-beans-4.0
mybatis-3.2.8
在我的理解中Mybaits是一个不算是ORM的model层框架,因为其对sql操作的灵活性导致在大型开发中对其的使用率超过了Hibernate,话是这样说,但作为菜鸟的我其实也没经历过太多大型项目,只是一点个人使用的感觉,下面是一些关于Mybaits的material,第一个是官网API,第二个是某大牛的系列博文,其中对于本文主题动态语法方面也有介绍,希望能帮到大家;
【Mybaits Reference Material】
####Mybaits3 like模糊查询匹配字符串
在mysql中可以使用 like '%conditionString%' 来进行条件相关的模糊查询; 但在Mybaits的mapper文件中因为需要用到转义,所以写法有些不同;另外文末的material中提到的空格问题我在使用过程中没有遇到;
xml代码:
<if test="tradeDate!=null">
AND TRADE_DATE like #{tradeDate,jdbcType=TIMESTAMP} '%'
</if>
这个是Mybatis的写法,在iBatis中还稍有不同,因为之前的项目中也有遇到过,故一并列举一下; 有兴趣的朋友可以研究一下;
iBatis.xml代码
<isNotEmpty property="serviceContent" prepend="and">
mmc.servicecontent like '%$serviceContent$%'
</isNotEmpty>
不知道这个写法是否和具体环境有关,iBatis的写法在我本文的环境中无法起效;
####Mybatis中if标签对于字符串使用双等号进行比较
Mybatis有个特别实用的功能,即动态查询条件的拼接; 可以在<select > 标签中使用<if test="condition"></if> 进行where查询条件的拼接; 虽然方便,但因为对其语法不熟悉,所以在实际使用中还是遇到了很多问题;
在查询相关material的时候,发现网上大部分文章都是使用"!="进行的判断,包括官方文档也是这样写的,但我这里需要使用的是双等号;
本例用到的是需要对传入的字段进行判断,如果符合查询条件即执行<if>块中的语句;
xml代码;
<if test="returnCode == '000000'">
AND COU.RETURN_CODE = 000000
</if>
这里表示当接入字段returnCode内容为000000时,执行<if>块中语句; 需要注意的是,这里的单引号不能省略,我在具体使用的时候因为没有写单引号导致这条语句没有经过判断被直接执行了,这点让我很困惑,暂时还没找到原因;
另外,在文末的material中有提到这里需要将字符串使用toString()进行处理,否则会报异常,但因为我在使用中并未遇到这样的问题,这里就没有使用;
####Mybaits中处理<>号 因为在mapper.xml文件中写sql,这导致了无法使用<>来进行一些数据的比较判断,故此在使用这类条件的时候需要对其进行一下转义;
xml代码;
<if test="offerDate!=null">
AND T.OFFER_DATE >= #{offerDate,jdbcType=TIMESTAMP}
AND T.OFFER_DATE <= #{offerDateEnd,jdbcType=TIMESTAMP}
</if>
这里的> / <
就是在xml中对于<>的转义,英语渣的我最开始死活没记住它们的代表意义,后来一查发现非常好记:
> → greater than → [>] → 大于号
;
< → less than → [<] → 小于号
;
####Mybatis中使用注解@Param传递多个查询条件
Mybaits的查询条件默认情况下只有两种,一种是一个map集合,另一种是一个固定的java类型,二者任选其一;
在我之前的使用中,当查询条件为多个的时候一般使用一个map集合,用条件name作为key,具体值作为value来进行查询;
前两天在查看同事代码时发现了这种使用方式,可以在Mapper.java的方法中使用@Param注解来完成多个查询条件的传递;
interface代码:
public List<TIndRepayment> selectByAppIdStage(@Param( "appId") Long appId, @Param( "repayStage")Integer repayStage);
可以看到,这个方法通过注解传递了两个参数作为查询条件,即appId 和repayStage;
xml代码:
<select id="selectByAppIdStage" resultMap="BaseResultMap" useCache="false" flushCache="true">
select
<include refid="Base_Column_List" />
from t_ind_repayment
where APP_ID = ${appId}
AND REPAY_STAGE = ${repayStage}
</select>
这里的userCache和flushCache是缓存配置,可以不管; 可以看到下面的where语句中,直接获取到了appId和repayStage作为条件进行查询;
这些就是我这两天来遇到的,有关于Mybaits的语法的一些问题; 以后在使用中还会遇到更多的问题,都会抽时间整理成类似博文,希望能对大家有所帮助;同时小弟资历尚浅,学有不足,文章中有纰漏的地方还希望多多指出;
下面是上面案例用到的material,文首列出的不在这里重复;
【Reference Material】
- http://blog.163.com/mr_liuyong/blog/static/1234243762012828540904/
- http://blog.csdn.net/dchjmichael/article/details/8860039
- http://blog.csdn.net/zheng0518/article/details/10449549
- http://my.oschina.net/u/1014212/blog/120652
【End】