【MyBatis框架】mapper配置檔案-關於動態sql
1.什麼是動態sql
mybatis核心 對sql語句進行靈活操作,通過表示式進行判斷,對sql進行靈活拼接、組裝。
2.需求
使用者資訊綜合查詢列表和使用者資訊查詢列表總數這兩個statement的定義使用動態sql。
對查詢條件進行判斷,如果輸入引數不為空才進行查詢條件拼接。
3.mapper.xml
原查詢語句配置:
<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper"> <!-- 使用者資訊綜合查詢 #{UserCustom.sex}取出包裝物件中性別值 ${UserCustom.username}取得pojo包裝物件中使用者名稱稱 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select> <!-- 使用者資訊綜合查詢總數 --> <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int"> select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select> ...... </mapper>
修改後的查詢語句配置:
<!-- 使用者資訊綜合查詢 #{UserCustom.sex}取出包裝物件中性別值 ${UserCustom.username}取得pojo包裝物件中使用者名稱稱 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user <!-- where標籤可以自動去掉第一個and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username like '%${userCustom.username}%' </if> </if> </where> </select> <!-- 使用者資訊綜合查詢總數 --> <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int"> select count(*) from user <!-- where標籤可以自動去掉第一個and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username like '%${userCustom.username}%' </if> </if> </where> </select>
4.測試程式碼
//使用者資訊綜合查詢 @Test public void testFindUserList() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立UserMapper代理物件 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //建立包裝物件,設定查詢條件 UserQueryVo userQueryVo=new UserQueryVo(); UserCustom userCustom=new UserCustom(); //由於這裡使用動態sql,如果這裡不設定某個值,條件不會拼接在sql中 //userCustom.setSex("男"); userCustom.setUsername("張三"); userQueryVo.setUserCustom(userCustom); //呼叫userMapper的方法 List<UserCustom> users=userMapper.findUserList(userQueryVo); for (int i = 0; i < users.size(); i++) { UserCustom user=(UserCustom)users.get(i); System.out.println(user.getId()+":"+user.getUsername()); } }
測試結果:
1:張三
4:張三丰
輸出日誌:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 31761534.
DEBUG [main] - Setting autocommit to false on JDBC Connection [[email protected]]
DEBUG [main] - ==> Preparing: select * from user WHERE user.username like '%張三%'
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 2
發現sql語句為select * from user WHERE user.username like '%張三%' ,並沒有將sex拼接進去,說明我們的動態sql設定成功
相應的,把userCustom.setUsername("張三");也註釋掉,發現輸出日誌:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 24027753.
DEBUG [main] - Setting autocommit to false on JDBC Connection [[email protected]]
DEBUG [main] - ==> Preparing: select * from user
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 5
發現sql語句為select * from user,並沒有將sex和username拼接進去,說明我們的動態sql設定成功
5.sql片段
5.1需求
將上邊實現的動態sql判斷程式碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。
方便程式設計師進行開發。
5.2定義sql片段
<mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
<!-- 定義sql片段
id:sql片段的唯一標識
在sql片段中不要加入where
經驗:一般我們定義sql片段是為了可重用性,是基於單表來定義sql片段,
這樣的話這個sql片段可重用性才高-->
<sql id="query_user_where">
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex=#{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=''">
and user.username like '%${userCustom.username}%'
</if>
</if>
</sql>
......
</mapper>
5.3引用sql片段
在mapper.xml中定義的statement中引用sql片段:
<!-- 使用者資訊綜合查詢
#{UserCustom.sex}取出包裝物件中性別值
${UserCustom.username}取得pojo包裝物件中使用者名稱稱
-->
<select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
resultType="cn.edu.hpu.mybatis.PO.UserCustom">
select * from user
<!-- where標籤可以自動去掉第一個and -->
<where>
<!-- 應用sql片段的id,如果refid指定的id不再本mapper檔案中,需要前邊加namespace -->
<include refid="query_user_where"></include>
<!-- 在這裡還可能要引用其他的sql片段 -->
</where>
</select>
<!-- 使用者資訊綜合查詢總數 -->
<select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
select count(*) from user
<!-- where標籤可以自動去掉第一個and -->
<where>
<!-- 應用sql片段的id,如果refid指定的id不再本mapper檔案中,需要前邊加namespace -->
<include refid="query_user_where"></include>
<!-- 在這裡還可能要引用其他的sql片段 -->
</where>
</select>
測試:
//使用者資訊綜合查詢
@Test
public void testFindUserList() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
//建立UserMapper代理物件
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//建立包裝物件,設定查詢條件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
//由於這裡使用動態sql,如果這裡不設定某個值,條件不會拼接在sql中
userCustom.setSex("男");
userCustom.setUsername("張三");
userQueryVo.setUserCustom(userCustom);
//呼叫userMapper的方法
List<UserCustom> users=userMapper.findUserList(userQueryVo);
for (int i = 0; i < users.size(); i++) {
UserCustom user=(UserCustom)users.get(i);
System.out.println(user.getId()+":"+user.getUsername());
}
}
測試結果:
1:張三
4:張三丰
輸出日誌:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 17689439.
DEBUG [main] - Setting autocommit to false on JDBC Connection [[email protected]]
DEBUG [main] - ==> Preparing: select * from user
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 5
說明sql片段引用成功
小結:
sql片段方便程式設計師進行開發
相關推薦
【MyBatis框架】mapper配置檔案-關於動態sql
動態sql 1.什麼是動態sql mybatis核心 對sql語句進行靈活操作,通過表示式進行判斷,對sql進行靈活拼接、組裝。 2.需求 使用者資訊綜合查詢列表和使用者資訊查詢列表總數這兩個statement的定義使用動態sql。 對查詢條件進行判斷,如果輸入引數不為空才
【MyBatis框架】mapper配置檔案-foreach標籤
foreach標籤下面介紹一下一個mapper配置檔案中的foreach標籤(注意,要跟著前面的總結來看,這裡使用的例子是結合前面的工程寫的,大部分程式碼沒有再贅述)foreach的作用是向sql傳遞陣列或List,mybatis使用foreach解析1.1需求在使用者查詢
【MyBatis框架】SqlMapConfigl配置檔案之常用的setting設定
個人資訊 就職: 聚項資訊科技有限公司 職位:中級Java開發工程師 負責:上汽系統開發與維護 院校:河南理工大學 專業:軟體工程12級 郵箱:[email protected] Q Q :10101000101001010111 1101111010
mybatis框架的mapper.xml檔案中sql的使用方法:
1.<!-- 根據id查詢 --> <select id="getFileInfo" parameterType="java.lang.String" resultMap="testFileBean">select * from test_tb_info where 1=1 <i
【SSM-MyBatis框架】Mapper.xml配置檔案(mybatis的核心)
Mapper.xml對映檔案中定義了操作資料庫的sql,每一個sql是一個statement,對映檔案是myBatis的核心。 1.輸入對映(ParameterType) 通過parameterType指定輸入引數的型別,型別可以是簡單型別,pojo,包裝型
【設計模式】反射+配置檔案
之前在學習設計模式的時候,對於抽象工廠中的反射+配置檔案的使用一直都是一知半解的,但是在機房重構七層登入的運用以及報錯,讓自己對於反射 的使用有了更深刻的認識。 反射就像是
【異常總結】mapper.xml檔案parameterType值導致的服務啟動失敗
錯誤日誌: 2018-10-24 15:09:25.796 ERROR [main] o.s.boot.SpringApplication:845- Application run failed org.springframework.beans.factory
【MyBatis框架】mybatis和spring整合
spring和mybatis整合 1.整合思路 需要spring通過單例方式管理SqlSessionFactory。 spring和mybatis整合生成代理物件,使用SqlSessionFactory建立SqlSession。(spring和mybatis整合自動完成)
Mybatis框架中mapper配置和foreach標籤的使用
foreach標籤下面介紹一下一個mapper配置檔案中的foreach標籤(注意,要跟著前面的總結來看,這裡使用的例子是結合前面的工程寫的,大部分程式碼沒有再贅述)foreach的作用是向sql傳遞陣列或List,mybatis使用foreach解析1.1需求在使用者查詢列
【Web開發】Hibernate配置檔案hibernate.cfg.xml解釋
參考書籍:輕量級JavaEE企業應用實戰(第5版) 所用jar包(在hibernate 官網上下載的jar包中的lib資料夾下): 用了user library來進行管理: 關於連線池: 連線池用於節省使用者申請訪問資料庫時的一系列連線操作,在伺
【MyBatis框架】Mybatis開發dao方法第一部分
下面來討論mybatis開發Dao的方法 先來說一下基本架構流程中使用到的幾個類 1.SqlSession使用範圍 1.1SqlSessionFactoryBuilder 通過SqlSessionFactoryBuilder建立會話工廠SqlSessionFactory
【Mybatis框架】查詢快取(二級快取)
繼上一篇部落格,我們講述了mybatis的一級快取,接下來,我們來學習一下mybatis的二級快取 部落格連結地址: http://blog.csdn.net/liweizhong1
【Mybatis框架】查詢快取(一級快取)
做java的各位程式設計師們,估計SSH和SSM是我們的基礎必備框架。也就是說我們都已經至少接觸過了這兩套常見的整合框架。當我們用SSH的時候,相信很多人都接觸過Hibernate的
mybatis逆向工程mapper配置檔案中mysql自增id 的配置
//在插入前id 自增 <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >
l mybatis 框架下 ogg4j配置檔案
log4j.rootLogger=Debug,Console,DebugFile log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.o
【Spring實戰】----Spring配置檔案的解析
一、背景知識Spring的核心的核心就是bean的配置及管理,至Spring最新發布的版本4.3.2已經有三種方式可以配置bean:1)在XML中進行顯示配置2)在Java中進行顯示配置3)隱式的bean發現機制和自動裝配上述三種配置不展開說明,而且目前用的較多的是第3種(當
【Mybatis框架】輸入對映-pojo包裝型別
下面說說關於mapper.xml檔案中的輸入對映 我們看一下之前為User配置的mapper檔案UserMapper.xml:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-
Mybatis框架中Mapper檔案傳值引數獲取。【Mybatis】
Mybatis框架中,Mapper檔案引數獲取一般有以下幾種: 1、引數個數為1個(string或者int) dao層方法為以下兩種: /** * 單個int型 */ public Lis
Mybatis框架中Mapper文件傳值參數獲取。【Mybatis】
ram keyword ddr gem cli view ati copyto one Mybatis框架中,Mapper文件參數獲取一般有以下幾種: 1、參數個數為1個(string或者int) dao層方法為以下兩種: [java] view plain
【MyBatis Generator】程式碼自動生成工具 generatorConfig.xml配置檔案詳解
MyBatis Generator官網地址:http://www.mybatis.org/generator/index.html MyBaris Generator中文地址:http://mbg.cndocs.ml/ 在MBG中,最主要也最重要的,就是generatorConfig.xml