Java的MyBatis框架中對數據庫停止靜態SQL查詢的教程。本站提示廣大學習愛好者:(Java的MyBatis框架中對數據庫停止靜態SQL查詢的教程)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的MyBatis框架中對數據庫停止靜態SQL查詢的教程正文
其實MyBatis具有的一個壯大的特征之一平日是它的靜態 SQL 才能。 假如你有應用 JDBC 或其他 類似框架的經歷,你就明確要靜態的串連 SQL 字符串在一路是非常糾結的,確保不克不及忘了空格或在列表的最初省略逗號。Mybatis中的靜態 SQL 可以完全處置這類苦楚。關於靜態SQL,最淺顯簡略的辦法就是我們本身在硬編碼的時刻付與各類靜態行動的斷定,而在Mybatis中,用一種壯大的靜態 SQL 語 言來改良這類情況,這類說話可以被用在隨意率性映照的 SQL 語句中。靜態 SQL 元素和應用 JSTL 或其他類似的基於 XML 的文本處置器類似。MyBatis 采取功效壯大的基於 OGNL 的表達式來清除其他元素。
我們經常使用的幾個節點元素有if,choose(when, otherwise),trim(where, if),foreach。真正應用上去我感到有點像XSLT(文章前面會順帶提一下~)的用法。
(1)if 的用法
在ViisitMapper的分頁設置裝備擺設中,假如pageIndex>-1 and pageSize>-1的時刻就參加響應的分頁SQL,不然就不添加(默許取全體),以下:
<select id="getListByPagenate" parameterType="PagenateArgs" resultType="Visitor"> select * from ( <include refid="getListSql" /> <include refid="orderBySql"/> ) t <!-- #{}表現參數化輸入,${}表現直接輸入不停止任何本義操作,本身停止轉移 --> <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>
由於我們的參數pageIndex與pageSize都是int值所以可以如許直接斷定,假如是對象實例我們可以應用null斷定來停止一些靜態邏輯的掌握,詳細現實開辟中就要看營業需求了。這裡我以為要留意的是別非常隨手的吧and寫成&&,這個在設置裝備擺設中不會被辨認~。
(2)choose (when, otherwise)的用法
choose when 重要在多個前提的情形下只知足個中一個前提的運用場景中應用,例如這裡就構建一個query前提,分離傳遞id,name與createTime。假定我們查詢Visitor表時,假如VisitorId有值則,應用Id查詢,假如VisitorName有值則采取VisitName查詢,以下,照樣在david.mybatis.demo.IVisitorOperation接口類中添加List<Visitor> getListChooseWhenDemo(BasicQueryArgs args)辦法。在VisitorMapper中添加響應的的select節點設置裝備擺設:
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); /* * 基本查詢 */ public Visitor basicQuery(int id); /* * 靜態前提查詢(choose,when)實例 */ public List<Visitor> getListChooseWhenDemo(BasicQueryArgs args); /* * 靜態前提查詢(where,if)實例 */ public List<Visitor> getListWhereDemo(BasicQueryArgs args); /* * 靜態查詢(foreach)實例 */ 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> <!-- 知足個中一個前提時刻用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症結詞的利益是在於,假如有響應的過濾前提的話,它曉得在恰當的時刻拔出where症結詞。並且它也曉得在什麼時候該去失落響應的AND與OR的銜接符,重要應對以下情形
<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>
不會由於一切前提不知足變成
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE </select>
或許由於沒有知足第一個前提,單單知足前面的前提釀成
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE AND title like ‘someTitle' </select>
所以針對這類我們可以在樹立choose when前提示例,異樣在IVisitorOperation接口類中參加響應的辦法public List<Visitor> getListWhereDemo(BasicQueryArgs args),把VisitorMapper設置裝備擺設文件中的絕對應設置裝備擺設加上去以下:
<?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的用法
在經常使用的靜態SQL中我們有個營業場景是要where id in 一年夜串的ID,像這類情形我們便可以用到foreach啦,不用本身辛辛勞苦去拼接Id字符串啦。異樣的步調照樣在IVisitorOperation接口類中參加響應的辦法public List<Visitor> getListForeachDemo(List<Integer> ids),然後再對應的Mapper文件中設置裝備擺設上響應的節點元素信息,以下:
<?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輪回前提 --> <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中樹立響應的測試辦法,Mybatis外面的靜態SQL也就完成啦,上面測試用的DemoRun辦法
/* * 靜態查詢foreach實例 */ 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); } } /* * 靜態查詢where if實例 */ 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); } } } /* * 靜態查詢choose when實例 */ 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); } } }
PS:關於OGNL
OGNL 是 Object-Graph Navigation Language 的縮寫,從說話角度來講:它是一個功效壯大的表達式說話,用來獲得和設置 java 對象的屬性 , 它旨在供給一個更高籠統度語法來對 java 對象圖停止導航,OGNL 在很多的處所都有運用,例如:
作為 GUI 元素(textfield,combobox, 等)到模子對象的綁定說話。
數據庫表到 Swing 的 TableModel 的數據源說話。
web 組件和後台 Model 對象的綁定說話 (WebOGNL,Tapestry,WebWork,WebObjects) 。
作為 Jakarata Commons BeanUtils 或許 JSTL 的表達式說話的一個更具表達力的替換說話。
別的,java 中許多可以做的工作,也能夠應用 OGNL 來完成,例如:列表映照和選擇。 關於開辟者來講,應用 OGNL,可以用簡練的語法來完成對 java 對象的導航。平日來講: 經由過程一個“途徑”來完成對象信息的導航,這個“途徑”可所以到 java bean 的某個屬性,或許聚集中的某個索引的對象,等等,而不是直接應用 get 或許 set 辦法來完成。