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;

测试类
	//更新数据@Testpublic 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">

测试类

	@Testpublic 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树结构练习——排序二叉树的中序遍历

题目描述 在树结构中&#xff0c;有一种特殊的二叉树叫做排序二叉树&#xff0c;直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树&#xff08;如果存在的话&#xff09;的关键值小于该节点的关键值 (3).任意一个节点的右子树&#xff08;如果存在的…

陈硕知乎专栏

https://www.zhihu.com/people/giantchen/answers

Mybatis动态sql的使用

通过mybatis提供的各种标签方法实现动态拼接sql。 为什么用if标签? UserMapper.xml配置sql&#xff0c;如下&#xff1a; <!-- 根据条件查询用户 --> <select id"queryUserByWhere" parameterType"user" resultType"user">SELEC…

面向对象设计之CRC卡片

1.什么是 CRC card&#xff1f; CRC (Class-Responsibility-Collaborator) Card是目前比较流行的面向对象分析建模方法。在CRC建模中&#xff0c;用户、设计者、开发人员都有参与&#xff0c;完成对整个面向对象工程的设计。 CRC卡是一个标准索引卡集合&#xff0c;包括三个部分…

川藏线徒搭

http://www.mafengwo.cn/i/6296156.html

删数问题

Problem Description 键盘输入一个高精度的正整数n&#xff08;≤100位&#xff09;&#xff0c;去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s&#xff0c;寻找一种方案&#xff0c;使得剩下的数字组成的新数最小。Input 输入有多组…

面试70问 经典回答

http://group.cnblogs.com/topic/37628.html

Mybatis整合spring

整合思路 1、SqlSessionFactory对象应该放到spring容器中作为单例存在。 2、传统dao的开发方式中&#xff0c;应该从spring容器中获得sqlsession对象。 3、Mapper代理形式中&#xff0c;应该从spring容器中直接获得mapper的代理对象。 4、数据库的连接以及数据库连接池事务…

最少拦截系统

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹…

云计算的理解

原文&#xff1a;http://www.chinacloud.cn/show.aspx?id15917&cid17 老叟发现&#xff0c;即使是一些搞计算机的人&#xff0c;也不了解“云”是什么。于是&#xff0c;俺卖车之余就写了一篇科普&#xff1a; 到底什么是云(云计算) 有很多关于云的介绍。然而&#xff0c;…

什么是Springmvc以及如果编写第一个入门程序

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图&#xff1a; Springmvc处理流程 入门程序 创建web工程 springMVC是表现层框架&#xff0c;需要搭建web工程开发。 如下图创建动态web工程&#xff1a; 输入…

迷瘴

Problem Description 通过悬崖的yifenfei&#xff0c;又面临着幽谷的考验—— 幽谷周围瘴气弥漫&#xff0c;静的可怕&#xff0c;隐约可见地上堆满了骷髅。由于此处长年不见天日&#xff0c;导致空气中布满了毒素&#xff0c;一旦吸入体内&#xff0c;便会全身溃烂而死。幸好y…

驳斥《沙盒用于数据防泄密是重大技术原理性失误》

http://blog.ifeng.com/article/30786929.html 最近网上出现了一篇名为《沙盒用于数据防泄密是重大技术原理性失误》的文章&#xff0c;经作者鉴定&#xff0c;是某不良公司攻击技术领先的竞争对手苏州深信达公司的软文。该公司为何主动公开攻击竞争对手&#xff0c;可能和最近…

windows驱动开发学习

序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高…

Springmvc架构详解

框架结构 框架结构如下图&#xff1a; 架构流程 1、 用户发送请求至前端控制器DispatcherServlet 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器根据请求url找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一…

区间覆盖问题

用i来表示x坐标轴上坐标为[i-1&#xff0c;i]的长度为1的区间&#xff0c;并给出n&#xff08;1≤n≤200&#xff09;个不同的整数&#xff0c;表示n个这样的区间。 现在要求画m条线段覆盖住所有的区间&#xff0c;条件是&#xff1a;每条线段可以任意长&#xff0c;但是要求所…

Windows驱动开发如何入门

http://blog.csdn.net/charlessimonyi/article/details/50904854 http://blog.csdn.net/charlessimonyi/article/details/50904956

springmvc整合mybatis之准备阶段与文件配置

文章出处&#xff1a;课程资料 web.xml等配置文件的解释&#xff1a;打开博客 为了更好的学习 springmvc和mybatis整合开发的方法&#xff0c;需要将springmvc和mybatis进行整合。 整合目标&#xff1a;控制层采用springmvc、持久层使用mybatis实现。 步骤详解&#xff1a; …

悼念512汶川大地震遇难同胞

Problem Description 时间&#xff1a;2008年5月16日&#xff08;震后第4天&#xff09; 地点&#xff1a;汶川县牛脑寨人物&#xff1a;羌族老奶奶【转载整理】牛脑寨是一个全村600多人的羌族寨子&#xff0c;震后几天&#xff0c;这里依然能常常听到隆隆的声音&#xff0c;那…

Win10下VS2015(WDK10)驱动开发环境配置

1、 概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了&#xff0c;而是必须首先安装微软集成开发环境VisualStudio&#xff0c;然后再从微软官网下载集成的WDK开发包、或者离线安装包&#xff0c;但是安装后Visual Studio就集驱动程序开发&#xff0c;编译&…