如何实现基于注解mybatis动态拼写sql语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现基于注解mybatis动态拼写sql语句相关的知识,希望对你有一定的参考价值。
您好,在spring中配置<!-- 通过扫描的模式,扫描目录在com.mrorder.dao目录下,所有的mapper都继承SqlMapper接口的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder.dao"/>
<property name="markerInterface" value="com.mrorder.dao.SqlMapper"/>
</bean>
自己写dao层方法的接口
public interface OrderMapper extends SqlMapper
@Select("select * from tbl_order where room like #room and mydate like #mydate")
public List<Order> getbyroom(OrderPara op);
这样整个语句是写死的,必须有2个参数,在这种模式下,如何能实现根据room和mydate是否为空来动态的拼写sql语句
比如当mydate=""
Select("select * from tbl_order where room like #room ")
public List<Order> getbyroom(OrderPara op);
如果用xml来配置语句的话,可以用<when test="title != null">
and mydate= #mydate
</when>
如果是用@Select 这种 改如何做呢?
利用自定义注解,通过反射,拼出SQL语句。 参考技术A 在spring中配置
<,-- 通过扫描的模式,扫描目录在com.mrorder.dao目录下,所有的mapper都继承SqlMapper接口的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder.dao"/>
<property name="markerInterface" value="com.mrorder.dao.SqlMapper"/>
</bean>
自己写dao层方法的接口
public interface OrderMapper extends SqlMapper
@Select("select * from tbl_order where room like #room and mydate like #mydate")
public List<Order> getbyroom(OrderPara op);
这样整个语句是写死的,必须有2个参数,在这种模式下,如何能实现根据room和mydate是否为空来动态的拼写sql语句
比如当mydate=""
Select("select * from tbl_order where room like #room ")
public List<Order> getbyroom(OrderPara op);
如果用xml来配置语句的话,可以用<when test="title ,= null">
and mydate= #mydate
</when>
如果是用@Select 这种 改如何做呢?
利用自定义注解,通过反射,拼出SQL语句。 参考技术B and c.id=#id
and b.id=#oid
and a.pay_time BETWEEN #startDate AND #endDate
service层参数nullmybatis执行sql语句候拼接指定if标签sql语句
Mybatis之通用mapper使用注解的方式写动态sql-小结
使用注解的方式直接在语句中拼写动态SQL语句
注意事项:
@Select("<script> SELECT DISTINCT project_id FROM `project_partner` WHERE belong=1 AND project_id " + "IN " + "<foreach item=‘item‘ index=‘index‘ collection=‘ids‘ open=‘(‘ close=‘)‘ separator=‘,‘ >" + "#{item}" + "</foreach>" + "</script>") List<Integer> findAllId(@Param("ids") List<Integer> item); /** * 等价于上者 * 小结: * 如果加上 @Param 注解,(可以不指定parameterType),并且注解值等同于 collection 中的值 * 如果不加上 @Param 注解,需要指定 collection 的类型,是 list、map、array 的三种类型中的一种 * 并且使用动态sql的话需要加上 <script> 的闭合标签,并且如果其中出现 < 或 > 符号,需要进行转义,否则会出错: * Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成 * @Select( "<script> SELECT DISTINCT project_id FROM `project_partner` WHERE belong=1 AND project_id " + * "IN " + * "<foreach item=‘item‘ index=‘index‘ collection=‘list‘ open=‘(‘ close=‘)‘ separator=‘,‘ >" + * "#{item}" + * "</foreach>" + * "</script>") * List<Integer> findAllId(List<Integer> item); */
至此,小结结束!
以上是关于如何实现基于注解mybatis动态拼写sql语句的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis之通用mapper使用注解的方式写动态sql-小结