Mybatis输入映射和输出映射

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

 输入参数映射

 parameterType(输入类型)

传递简单类型:
如:
	<select id="queryUserById" parameterType="Integer" resultType="User">
		select * from t_user where id = #{id}
	</select>
如上中parameterType为输入类型、resultType为输出类型,sql语句中记得用占位符#{}(防sql注入功能并且默认加'`'飘字符)或者${}(相反)进行sql拼接。
传递pojo对象

Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

补充:什么叫ognl表达式? OGNL表达式是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换。

ognl表达式的使用?

首先看一个代码:

User.xml中

	<update id="updateUser" parameterType="com.firtDay.sqlMapconFig.User">
		UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}
	</update>

User.java中
	public Integer id;
	private String _name;
	private int _money;

测试类
	//更新数据
	@Test
	public void testDemo5(){
		SqlSession openSession = sqlSessionFactory.openSession();
		User user = new User();
		user.setId(1);
		user.set_name("魏杰");
		user.set_money(1000);
		int update = openSession.update("updateUser", user);
		openSession.commit();
		openSession.close();
	}
数据库

运行测试类:
我们可以看到数据更改成功,因为我们的传入的参数类型为user对象,那么我们怎么获取需要更新的数据呢,就通过ognl表达式可以去解析user对象中的成员变量,而我们的User.xml中
UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}

中的#{_money}和#{id}和我们对象的成员变量中的名称相同,因此才会更改成功,倘若我们把_money改成money再执行就会报错:org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'money' in 'class com.firtDay.sqlMapconFig.User'
表示找到参数值。

 传递pojo包装对象

开发中通过可以使用pojo传递查询条件。

查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

包装对象:Pojo类中的一个属性是另外一个pojo。

 

需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。

Mapper接口
public interface mapper {
	User queryUserById(Integer id);
	User queryUserByIdQueryVo(QueryVo vo);
	Integer queryUserCount();
	User queryUserByName(User user);
	List<User> queryUserByIds(QueryVo vo);
	List<User> queryUserByIds(List<Integer> ids);
	List<User> queryUserByIds(Integer[] ids);
	List<OrderDemo> queryOrders();//一对一
	List<UserDemo> queryOrdersDemo();//一对多
}


编写QueryVo
public class QueryVo implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private User user;
	private List<Integer> ids;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public List<Integer> getIds() {
		return ids;
	}
	public void setIds(List<Integer> ids) {
		this.ids = ids;
	}
	
}
xml中传递参数类型设置
<select id="queryUserByIds" resultType="User" parameterType="QueryVo">

测试类
	@Test
	public void testDemo2(){
		SqlSession openSession = sqlSessionFactory.openSession();
		mapper m = openSession.getMapper(mapper.class);
		User user = new User();
		user.setId(3);
//		知识点一
		QueryVo vo = new QueryVo();
		vo.setUser(user);
		user = m.queryUserByIdQueryVo(vo);
		System.out.println(user);
		System.out.println("----------------");
		user = m.queryUserById(user.getId());
		System.out.println(user);
		System.out.println("---------------------------");
		Integer queryUserCount = m.queryUserCount();
		System.out.println(queryUserCount);
		openSession.close();
	}

resultType(输出类型)

简单参数类型、输出pojo对象、输出pojo列表(List,resultType仍然为user)

resultMap

       resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

       如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

       resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

如果mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。

需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来

代码演示:

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">

	<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
	<!-- id:设置ResultMap的id -->
	<resultMap type="order" id="orderResultMap">
		<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
		<!-- property:主键在pojo中的属性名 -->
		<!-- column:主键在数据库中的列名 -->
		<id property="id" column="id" />

		<!-- 定义普通属性 -->
		<result property="userId" column="user_id" />
		<result property="number" column="number" />
		<result property="createtime" column="createtime" />
		<result property="note" column="note" />
	</resultMap>

	<!-- 查询所有的订单数据 -->
	<select id="queryOrderAll" resultMap="orderResultMap">
		SELECT id, user_id,
		number,
		createtime, note FROM `order`
	</select>

</mapper>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值