MyBatis中輸入映射和輸出映射

MyBatis中輸入映射和輸出映射

一、parameterType(輸入類型)

1、 #{}與${}
(1)#{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個佔位符即?。

<!-- 根據id查詢用戶信息 -->
	<select id="findUserById" parameterType="int" resultType="user">
		select * from user where id = #{id}
	</select>
使用佔位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行java類型和jdbc類型的轉換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。

(2)${}和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:

<!-- 根據名稱模糊查詢用戶信息 -->
	<select id="selectUserByName" parameterType="string" resultType="user">
	   select * from user where username like '%${value}%'
	</select>
2、傳遞簡單類型
參考寫過的代碼,不在贅述。

3、傳遞pojo對象
(1)Mybatis使用ognl表達式解析對象字段的值,如下例子

<!—傳遞pojo對象綜合查詢用戶信息 -->
	<select id="findUserByUser" parameterType="user" resultType="user">
	   select * from user where id=#{id} and username like '%${username}%'
	</select>
其中,{}中間的是user對象中的名稱。

(2)接口函數

public List<User> findUserByUser(User user) throws Exception;
(3)測試函數

	Public void testFindUserByUser()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper接口實例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//構造查詢條件user對象
		User user = new User();
		user.setId(1);
		user.setUsername("管理員");
		//傳遞user對象查詢用戶列表
		List<User>list = userMapper.findUserByUser(user);
		//關閉session
		session.close();
	}
4、傳遞pojo包裝對象
(1)需求:完成用戶信息的綜合查詢,需要傳入查詢條件很複雜(可能包括用戶信息、其它信息,比如商品、訂單的)。
(2)針對上邊需求,建議使用自定義的包裝類型的pojo。在包裝類型的pojo中將複雜的查詢條件包裝進去。
① User.java實體類

package cn.at.mybatis.po;

import java.util.Date;

public class User {

	private int id;
	private String username;// 用戶姓名
	private String sex;// 性別
	private Date birthday;// 生日
	private String address;// 地址
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", sex=" + sex
				+ ", birthday=" + birthday + ", address=" + address + "]";
	}
	
}
② UserCustom.java擴展類

package cn.at.mybatis.po;

//用戶的擴展類
public class UserCustom extends User{

	//可以用來拓展用戶的信息
}
③ UserQueryVo.java包裝類

package cn.at.mybatis.po;
//用戶的包裝類
public class UserQueryVo {

	//在這裏包裝所需要的查詢條件
	
	//用戶查詢條件
	private UserCustom userCustom;

	public UserCustom getUserCustom() {
		return userCustom;
	}

	public void setUserCustom(UserCustom userCustom) {
		this.userCustom = userCustom;
	}
	
	
	//可以包裝其他的查詢條件(訂單、商品)
}
(3)在UserMapper.xml中定義用戶信息綜合查詢(查詢條件複雜,通過高級查詢進行復雜關聯查詢)

	<!-- 用戶信息綜合查詢
		#{userCustom.sex}:取出pojo包裝對象中性別值
		${userCustom.username}:取出pojo包裝對象中用戶名稱值
	 -->
	<select id="findUserList" parameterType="cn.at.mybatis.po.UserQueryVo" resultType="cn.at.mybatis.po.UserCustom">
		SELECT * FROM user WHERE sex=#{userCustom.sex} AND username LIKE "%${userCustom.username}%"
	</select>
(4)UserMapper.java中接口函數

	//用戶綜合信息查詢
	public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
(5)測試函數

	//Mapper代理方式 用戶綜合信息查詢
	@Test
	public void testFindUserList() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//創建UserMapper對象,mybatis自動生成代理對象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//創建包裝對象,設置查詢條件
		UserQueryVo userQueryVo = new UserQueryVo();
		UserCustom userCustom = new UserCustom();
		userCustom.setSex("1");
		userCustom.setUsername("小明");
		userQueryVo.setUserCustom(userCustom);
		
		//調用UserMapper的方法
		List<UserCustom> list = userMapper.findUserList(userQueryVo);
		System.out.println("Mapper代理方式 用戶綜合信息查詢====》"+list);
	}


二、resultType(輸出類型)

1、輸出簡單類型

實例如下:

(1)UserMapper.xml文件

	<!-- 獲取用戶列表總數 -->
	<select id="findUserCount" parameterType="user" resultType="int">
	   select count(*) from user
	</select>
(2)UserMapper接口

public int findUserCount(User user) throws Exception;
(3)調用函數

	Public void testFindUserCount() throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲取mapper接口實例
		UserMapper userMapper = session.getMapper(UserMapper.class);
	
		User user = new User();
		user.setUsername("luoyepiaoxue2014");

		int count = userMapper.findUserCount(user);
		
		//關閉session
		session.close();
	}
(4)總結:查詢出來的結果集只有一行且一列,可以使用簡單類型進行輸出映射。


2、輸出pojo對象
實例如下:
(1)UserMapper.xml

	<!-- 根據id查詢用戶信息 -->
	<select id="findUserById" parameterType="int" resultType="user">
		select * from user where id = #{id}
	</select>
(2)UserMapper接口:

public User findUserById(int id) throws Exception;
(3)調用函數
	Public void testFindUserById() throws Exception {
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper接口實例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//通過mapper接口調用statement
		User user = userMapper.findUserById(1);
		System.out.println(user);
		//關閉session
		session.close();
	}
(4)總結:使用session調用selectOne查詢單條記錄。


3、輸出pojo列表
實例如下:
(1)UserMapper.xml

<!-- 根據名稱模糊查詢用戶信息 -->
	<select id="findUserByUsername" parameterType="string" resultType="user">
	   select * from user where username like '%${value}%'
	</select>
(2)UserMapper接口:

public List<User> findUserByUsername(String username) throws Exception;
(3)調用函數

	Public void testFindUserByUsername()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper接口實例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//如果使用佔位符號則必須人爲在傳參數中加%
		//List<User> list = userMapper.selectUserByName("%luoyepiaoxue2014%");
		//如果使用${}原始符號則不用人爲在參數中加%
		List<User> list = userMapper.findUserByUsername("luoyepiaoxue2014");
		//關閉session
		session.close();
	}
(4)總結:使用session的selectList方法獲取pojo列表。


4、resultType總結:
輸出pojo對象和輸出pojo列表在sql中定義的resultType是一樣的。
返回單個pojo對象要保證sql查詢出來的結果集爲單條,內部使用session.selectOne方法調用,mapper接口使用pojo對象作爲方法返回值。

返回pojo列表表示查詢出來的結果集可能爲多條,內部使用session.selectList方法,mapper接口使用List<pojo>對象作爲方法返回值。


三、resultMap(輸出類型)

1、 resultType可以指定pojo將查詢結果映射爲pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關係 ,resultMap實質上還需要將查詢結果映射到pojo對象中。
resultMap可以實現將查詢結果映射爲複雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
2、定義reusltMap

	<!-- 定義一個resultMap
		SELECT id id_,username username_ FROM user 和 User類中的屬性做一個映射
		
		type: 指的是resultMap 最終所映射的java對象類型,可以使用別名
		id: 對resultMap的一個唯一標識
	 -->
	 <resultMap type="user" id="userResultMap">
	 	<!-- id標識查詢結果集中的唯一標識
	 		column:查詢出來的列名
	 		property:type所指定的pojo中的屬性名
	 		最終resultMap對column和property做一個映射關係(對應關係)
	 	 -->
	 	<id column="id_" property="id"/>
	 	<!-- 
	 		result:對普通列的定義
	 		column:查詢出來的列名
	 		property:type所指定的pojo中的屬性名
	 		最終resultMap對column和property做一個映射關係(對應關係)
	 	 -->
	 	<result column="username_" property="username"/>
	 </resultMap>
3、使用resultMap作爲statement的輸出映射類型

	<!-- 使用resultMap進行輸出映射 
		resultMap:指定定義的userResultMap的id,如果這個resultMap在其他的mapper文件中,那麼需要在前面加上namespace
	-->
	<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
		SELECT id id_,username username_ FROM user WHERE id=#{id}
	</select>
4、UserMapper.java接口函數

	//更加用戶id查詢用戶信息,使用resultMap輸出
	public User findUserByIdResultMap(int id) throws Exception;
5、測試函數

	//Mapper代理方式通過id進行查詢  使用resultMap方式
	@Test
	public void testFindUserByIdResultMap() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//創建UserMapper對象,mybatis自動生成代理對象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//調用UserMapper的方法
		User user = userMapper.findUserByIdResultMap(29);
		System.out.println("Mapper代理方式通過id進行查詢  使用resultMap方式====》"+user);
	}


By luoyepiaoxue2014
微博地址:  http://weibo.com/luoyepiaoxue2014  點擊打開鏈接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章