MyBatis在注解上使用动态SQL方式(@select使用if)

Shams ·
更新时间:2024-11-01
· 1794 次阅读

目录

MyBatis在注解上使用动态SQL

1、用script标签包围

2、用Provider去实现SQL拼接

3、说明

MyBatis xml注释SQL的注意事项

注意事项

MyBatis在注解上使用动态SQL 1、用script标签包围

然后像xml语法一样书写

@Select({"<script>",                 "SELECT * FROM tbl_order",                 "WHERE 1=1",                 "<when test='title!=null'>",                 "AND mydate = #{mydate}",                 "</when>",                 "</script>"}) 2、用Provider去实现SQL拼接

例如:

public class OrderProvider {     private final String TBL_ORDER = "tbl_order";      public String queryOrderByParam(OrderPara param) {         SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);         String room = param.getRoom();         if (StringUtils.hasText(room)) {             sql.WHERE("room LIKE #{room}");         }         Date myDate = param.getMyDate();         if (myDate != null) {             sql.WHERE("mydate LIKE #{mydate}");         }         return sql.toString();     } } public interface OrderDAO {         @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam")     List<Order> queryOrderByParam(OrderParam param);  }

注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。

复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

3、说明

如果XML元素嵌入在<script>XML元素中,则可以在注释值中为动态SQL使用XML元素:

@Select("<script>SELECT ...</script>")

但是使用<include>元素会触发SQL Mapper配置解析异常,由以下原因引起:

org.apache.ibatis.builder.BuilderException: Unknown element in SQL statement. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags

如果nodeHandlers在课堂中检查方法org.apache.ibatis.builder.BuilderException,将注意到支持的元素有:

trim

where

set

foreach

if

choose

when

otherwise

bind

然而,包括基于注释的查询中的片段是不可能的。

MyBatis xml注释SQL的注意事项

说明:在mybatis 的sql里不是不能写注释,而是注释不能有#{},mybatis仍旧会把#{}算成一个带注入的参数

如代码段2所示,mysql数据库更换为oracle数据库时,#{date}需要明确jdbcType,而该代码段中仅将适用于mysql的sql注释,依旧会报同样的错,最好是将注释的sql删除。

 <select id="slectSlagsteelRatioByDate" resultType="java.lang.Double"> --         select slagsteel_ratio FROM process_history WHERE r furnace_num = #{furnaceNum} --         ORDER BY real_time DESC limit 0,1 select slagsteel_ratio FROM(  select slagsteel_ratio FROM process_history WHERE real_time &lt;= #{date,jdbcType=TIMESTAMP}  ORDER BY real_time DESC ) WHERE ROWNUM = 1 </select> 注意事项

1、where语句等用到大于小于等符号时候,需要使用 <![CDATA[ > ]]>或者 <![CDATA[ < ]]>进行识别。

2、如果sql文中有动态sql文标签,比如sql文,此时wwww为传递的参数,不需用#{wwww }取值,直接使用即可。

3、如果超过一个参数,需要在接口方法的每个参数定义时候使用@Param注解。

4、order by语句可以使用动态sql

ORDER BY eeee ORDER BY rrrrrr

5、SELECT

           CASE            WHEN  条件1 THEN 字段1

WHEN 条件2 THEN 字段2

           ELSE    字段3            END   FROM.....

只要满足一个WHEN,后面的WHEN就不会执行了,跳出CASE WHEN 语句

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



注解 SQL IF mybatis select

需要 登录 后方可回复, 如果你还没有账号请 注册新账号