最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的MyBatis框架中對數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)SQL查詢的教程

 更新時(shí)間:2016年04月06日 15:13:47   作者:紅燒獅子頭  
這篇文章主要介紹了Java的MyBatis框架中對數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)SQL查詢的教程,講解了MyBatis中一些控制查詢流程的常用語句,需要的朋友可以參考下

其實(shí)MyBatis具有的一個(gè)強(qiáng)大的特性之一通常是它的動(dòng)態(tài) SQL 能力。 如果你有使用 JDBC 或其他 相似框架的經(jīng)驗(yàn),你就明白要?jiǎng)討B(tài)的串聯(lián) SQL 字符串在一起是十分糾結(jié)的,確保不能忘了空格或在列表的最后省略逗號。Mybatis中的動(dòng)態(tài) SQL 可以徹底處理這種痛苦。對于動(dòng)態(tài)SQL,最通俗簡單的方法就是我們自己在硬編碼的時(shí)候賦予各種動(dòng)態(tài)行為的判斷,而在Mybatis中,用一種強(qiáng)大的動(dòng)態(tài) SQL 語 言來改進(jìn)這種情形,這種語言可以被用在任意映射的 SQL 語句中。動(dòng)態(tài) SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本處理器相似。MyBatis 采用功能強(qiáng)大的基于 OGNL 的表達(dá)式來消除其他元素。
我們常用的幾個(gè)節(jié)點(diǎn)元素有if,choose(when, otherwise),trim(where, if),foreach。真正使用下來我感覺有點(diǎn)像XSLT(文章后面會(huì)順帶提一下~)的用法。
(1)if 的用法

在ViisitMapper的分頁配置中,如果pageIndex>-1 and pageSize>-1的時(shí)候就加入相應(yīng)的分頁SQL,否則就不添加(默認(rèn)取全部),如下:

<select id="getListByPagenate" parameterType="PagenateArgs"
  resultType="Visitor">
  select * from (
  <include refid="getListSql" /> <include refid="orderBySql"/>
  ) t <!-- #{}表示參數(shù)化輸出,${}表示直接輸出不進(jìn)行任何轉(zhuǎn)義操作,自己進(jìn)行轉(zhuǎn)移 -->
  <if test="pageStart>-1 and pageSize>-1">
    limit #{pageStart}, #{pageSize}
  </if>
</select>
<sql id="getListSql">
  select * from Visitor where
  status>0
</sql>
<sql id="orderBySql">
  order by ${orderFieldStr} ${orderDirectionStr}
</sql>

  因?yàn)槲覀兊膮?shù)pageIndex與pageSize都是int值所以可以這樣直接判斷,如果是對象實(shí)例我們可以利用null判斷來進(jìn)行一些動(dòng)態(tài)邏輯的控制,具體實(shí)際開發(fā)中就要看業(yè)務(wù)需求了。這里我認(rèn)為要注意的是別十分順手的吧and寫成&&,這個(gè)在配置中不會(huì)被識(shí)別~。

(2)choose (when, otherwise)的用法

  choose when 主要在多個(gè)條件的情況下只滿足其中一個(gè)條件的應(yīng)用場景中使用,例如這里就構(gòu)建一個(gè)query條件,分別傳遞id,name與createTime。假設(shè)我們查詢Visitor表時(shí),如果VisitorId有值則,使用Id查詢,如果VisitorName有值則采用VisitName查詢,如下,還是在david.mybatis.demo.IVisitorOperation接口類中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)方法。在VisitorMapper中添加相應(yīng)的的select節(jié)點(diǎn)配置:

package david.mybatis.demo;

import java.util.List;

import david.mybatis.model.BasicQueryArgs;
import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;
import david.mybatis.model.VisitorWithRn;

public interface IVisitorOperation {
  /*
   * 添加訪問者
   */
  public int add(Visitor visitor);
  
  /*
   * 刪除訪問者
   */
  public int delete(int id);
  
  /*
   * 更新訪問者
   */
  public int update(Visitor visitor);
  
  /*
   * 查詢訪問者
   */
  public Visitor query(int id);
  
  /*
   * 查詢List
   */
  public List<Visitor> getList();
  
  /*
   * 分頁查詢List
   */
  public List<Visitor> getListByPagenate(PagenateArgs args);
  
  /*
   * 分頁查詢List(包含Rownum)
   */
  public List<VisitorWithRn> getListByPagenateWithRn(PagenateArgs args);
  
  /*
   * 基礎(chǔ)查詢
   */
  public Visitor basicQuery(int id);
  
  /*
   * 動(dòng)態(tài)條件查詢(choose,when)實(shí)例
   */
  public List<Visitor> getListChooseWhenDemo(BasicQueryArgs args);
  
  /*
   * 動(dòng)態(tài)條件查詢(where,if)實(shí)例
   */
  public List<Visitor> getListWhereDemo(BasicQueryArgs args);
  
  /*
   * 動(dòng)態(tài)查詢(foreach)實(shí)例
   */
  public List<Visitor> getListForeachDemo(List<Integer> ids);
  
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="david.mybatis.demo.IVisitorOperation">  
  <resultMap type="Visitor" id="visitorRs">
    <id column="Id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
  </resultMap>
  <sql id="getListSqlConditions">
    select * from Visitor
  </sql>
  <!-- 滿足其中一個(gè)條件時(shí)候用choose when操作 -->
  <select id="getListChooseWhenDemo" resultMap="visitorRs"
    parameterType="BasicQueryArgs">
    <include refid="getListSqlConditions" />
    <where>
      <if test="queryStatus>0">
        status=#{queryStatus}
      </if>
      <choose>
        <when test="queryId!=0">
          and id=#{queryId}
        </when>
        <when test="queryName!=null">
          and name like #{queryName}
        </when>
        <otherwise>
          and createTime>= #{queryTime}
        </otherwise>
      </choose>
    </where>
  </select>
</mapper>

(3)where if (trim)的用法

where關(guān)鍵詞的好處是在于,如果有相應(yīng)的過濾條件的話,它知道在適當(dāng)?shù)臅r(shí)候插入where關(guān)鍵詞。而且它也知道在何時(shí)該去掉相應(yīng)的AND與OR的連接符,主要應(yīng)對如下情景

<select id="findActiveBlogLike"
   resultType="Blog">
 SELECT * FROM BLOG
 WHERE
 <if test="state != null">
  state = #{state}
 </if>
 <if test="title != null">
  AND title like #{title}
 </if>
 <if test="author != null and author.name != null">
  AND author_name like #{author.name}
 </if>
</select>

不會(huì)因?yàn)樗袟l件不滿足變?yōu)?/p>

<select id="findActiveBlogLike"
   resultType="Blog">
 SELECT * FROM BLOG
 WHERE
</select>

或者因?yàn)闆]有滿足第一個(gè)條件,單單滿足后面的條件變成

<select id="findActiveBlogLike"
   resultType="Blog">
  SELECT * FROM BLOG
  WHERE
  AND title like ‘someTitle'
</select>

所以針對這種我們可以在建立choose when條件示例,同樣在IVisitorOperation接口類中加入相應(yīng)的方法public List<Visitor> getListWhereDemo(BasicQueryArgs args),把VisitorMapper配置文件中的相對應(yīng)配置加上去如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="david.mybatis.demo.IVisitorOperation">  
  <sql id="getListSqlConditions">
    select * from Visitor
  </sql>
  <!-- 滿足條件的都加上去操作 -->
  <select id="getListWhereDemo" resultMap="visitorRs"
    parameterType="BasicQueryArgs">
    <include refid="getListSqlConditions" />
    
    <where> 
      <if test="queryStatus>0"> 
        status>0 
      </if> 
      <if test="queryId>0"> 
        and id=#{queryId} 
      </if> 
      <if test="queryName!=null"> 
        and name like=#{queryName} 
      </if> 
      <if test="queryTime!=null"> 
        and createTime>=#{queryTime} 
      </if>
    </where>
    <!--
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
      <if test="queryStatus>0">
        status>0
      </if>
      <if test="queryId>0">
        and id=#{queryId}
      </if>
      <if test="queryName!=null">
        and name like=#{queryName}
      </if>
      <if test="queryTime!=null">
        and createTime>=#{queryTime}
      </if>
    </trim>
    -->
  </select>
</mapper>

(4)foreach的用法

在常用的動(dòng)態(tài)SQL中我們有個(gè)業(yè)務(wù)場景是要where id in 一大串的ID,像這種情況我們就可以用到foreach啦,不必自己辛辛苦苦去拼接Id字符串啦。同樣的步驟還是在IVisitorOperation接口類中加入相應(yīng)的方法public List<Visitor> getListForeachDemo(List<Integer> ids),然后再對應(yīng)的Mapper文件中配置上相應(yīng)的節(jié)點(diǎn)元素信息,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="david.mybatis.demo.IVisitorOperation">  
  <sql id="getListSqlConditions">
    select * from Visitor
  </sql>
  <!-- Foreach循環(huán)條件 -->
  <select id="getListForeachDemo" resultMap="visitorRs">
    <include refid="getListSqlConditions"/>
    where status>0 and id in 
    <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
      ${item}
    </foreach>
  </select>
</mapper>

最后你只需要在DemoRun中建立相應(yīng)的測試方法,Mybatis里面的動(dòng)態(tài)SQL也就完成啦,下面測試用的DemoRun方法

/*
   * 動(dòng)態(tài)查詢foreach實(shí)例
   */
  public static void getListForeachDemo(List<Integer> ids) {
    SqlSession session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    List<Visitor> ls = vOperation.getListForeachDemo(ids);
    for (Visitor visitor : ls) {
      System.out.println(visitor);
    }
  }
  
  /*
   * 動(dòng)態(tài)查詢where if實(shí)例
   */
  public static void getListWhereCondition(int id, String name, Date createTime) {
    name = name == "" ? null : name;
    SqlSession session = MybatisUtils.getSqlSession();
    BasicQueryArgs args = new BasicQueryArgs(id, name, createTime);
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    List<Visitor> ls = vOperation.getListWhereDemo(args);
    if (ls.size() == 0)
      System.out.println("查無匹配!");
    else {
      for (Visitor visitor : ls) {
        System.out.println(visitor);
      }
    }
  }

  /*
   * 動(dòng)態(tài)查詢choose when實(shí)例
   */
  public static void getListChooseWhenDemo(int id, String name, Date createTime) {
    name = name == "" ? null : name;
    SqlSession session = MybatisUtils.getSqlSession();
    BasicQueryArgs args = new BasicQueryArgs(id, name, createTime);
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    List<Visitor> ls = vOperation.getListChooseWhenDemo(args);
    if (ls.size() == 0)
      System.out.println("查無匹配!");
    else {
      for (Visitor visitor : ls) {
        System.out.println(visitor);
      }
    }
  }

201646151131782.png (795×440)   
PS:關(guān)于OGNL
OGNL 是 Object-Graph Navigation Language 的縮寫,從語言角度來說:它是一個(gè)功能強(qiáng)大的表達(dá)式語言,用來獲取和設(shè)置 java 對象的屬性 , 它旨在提供一個(gè)更高抽象度語法來對 java 對象圖進(jìn)行導(dǎo)航,OGNL 在許多的地方都有應(yīng)用,例如:
作為 GUI 元素(textfield,combobox, 等)到模型對象的綁定語言。
數(shù)據(jù)庫表到 Swing 的 TableModel 的數(shù)據(jù)源語言。
web 組件和后臺(tái) Model 對象的綁定語言 (WebOGNL,Tapestry,WebWork,WebObjects) 。
作為 Jakarata Commons BeanUtils 或者 JSTL 的表達(dá)式語言的一個(gè)更具表達(dá)力的替代語言。
另外,java 中很多可以做的事情,也可以使用 OGNL 來完成,例如:列表映射和選擇。 對于開發(fā)者來說,使用 OGNL,可以用簡潔的語法來完成對 java 對象的導(dǎo)航。通常來說: 通過一個(gè)“路徑”來完成對象信息的導(dǎo)航,這個(gè)“路徑”可以是到 java bean 的某個(gè)屬性,或者集合中的某個(gè)索引的對象,等等,而不是直接使用 get 或者 set 方法來完成。

相關(guān)文章

  • Netty分布式pipeline傳播inbound事件源碼分析

    Netty分布式pipeline傳播inbound事件源碼分析

    這篇文章主要為大家介紹了Netty分布式pipeline傳播inbound事件的源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • java list隨機(jī)抽取元素的案例

    java list隨機(jī)抽取元素的案例

    這篇文章主要介紹了java list隨機(jī)抽取元素的案例,具有很好的參考,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • springboot+websocket實(shí)現(xiàn)并發(fā)搶紅包功能

    springboot+websocket實(shí)現(xiàn)并發(fā)搶紅包功能

    本文主要介紹了springboot+websocket實(shí)現(xiàn)并發(fā)搶紅包功能,主要包含了4種步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • log4j配置失效日志中打印Debug信息問題

    log4j配置失效日志中打印Debug信息問題

    這篇文章主要介紹了log4j配置失效日志中打印Debug信息問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java IO流深入理解

    Java IO流深入理解

    這篇文章主要介紹了java IO流的深入理解,下面和小編來一起學(xué)習(xí)一下吧,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容
    2021-07-07
  • MyBatis 使用權(quán)威指南

    MyBatis 使用權(quán)威指南

    MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級映射的優(yōu)秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集,本文給大家介紹MyBatis 使用指南,一起看看吧
    2017-03-03
  • 向Spring IOC 容器動(dòng)態(tài)注冊bean實(shí)現(xiàn)方式

    向Spring IOC 容器動(dòng)態(tài)注冊bean實(shí)現(xiàn)方式

    這篇文章主要為大家介紹了向Spring IOC 容器動(dòng)態(tài)注冊bean實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • javabean servlet jsp實(shí)現(xiàn)分頁功能代碼解析

    javabean servlet jsp實(shí)現(xiàn)分頁功能代碼解析

    這篇文章主要為大家詳細(xì)解析了javabean servlet jsp實(shí)現(xiàn)分頁功能代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java實(shí)現(xiàn)文件夾中內(nèi)容定時(shí)刪除

    Java實(shí)現(xiàn)文件夾中內(nèi)容定時(shí)刪除

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件夾中內(nèi)容定時(shí)刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java?NIO實(shí)現(xiàn)簡單聊天程序

    java?NIO實(shí)現(xiàn)簡單聊天程序

    這篇文章主要為大家詳細(xì)介紹了java?NIO實(shí)現(xiàn)簡單聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

禄丰县| 巨鹿县| 辉南县| 商南县| 明水县| 大足县| 罗江县| 额济纳旗| 汝南县| 巴南区| 托里县| 开封市| 兴义市| 德钦县| 英德市| 大田县| 二连浩特市| 花莲市| 偏关县| 信宜市| 融水| 洛扎县| 井冈山市| 曲阳县| 兰溪市| 射阳县| 唐河县| 仪陇县| 开平市| 巫溪县| 同江市| 涿鹿县| 北辰区| 彭阳县| 闽清县| 永新县| 孟连| 鄂伦春自治旗| 利津县| 东丽区| 金坛市|