1. 程式人生 > >【MyBatis框架】mapper配置檔案-關於動態sql

【MyBatis框架】mapper配置檔案-關於動態sql

動態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