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  点击打开链接


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