Mybatis的ResultMap的使用

本篇文章通过一个实际工作中遇到的例子开始吧:工程使用Spring+Mybatis+Mysql 开发。

具体的业务逻辑很重,对象之间一层一层的嵌套。

和数据库表对应的是大量的model 类,而和前端交互的是Vo 类。

现在需要做一个需求,有两种方式来实现:∙ 使用现有的Service 接口,或者自己在编写一些用到的接口,手动使用Java 代码来分别调用Service 接口来查出各个model ,然后在业务层将model 转换为vo ,最后返回给前端json 串。

∙ 为需求相关的页面定义自己的vo ,在vo 中只定义前端用到的字段。

而不是像第一种方式一样vo 中一层一层的嵌套model 。

然后使用sql 语句进行表关联,查询用到的字段。

组装为vo 直接返回例子到此结束,我想这两种完成方法大部分Java程序员都遇到过。

两种方式都行得通,但是在项目的技术选型(Spring+Mybatis+Mysql )下面,哪种跟好呢? 我的个人经验是如果业务逻辑不是太复杂,两种无所谓。

但是如果业务逻辑太复杂,vo 各种嵌套model 和vo 的话,我非常强烈的推荐第二种。

(其实第二中可能hibernate 更加适合,但是在此处不考虑),在笔者的这次需求中,使用第一中方式查询速度为5s ,而改为第二种方式之后查询速度为60ms 。

提升的太快了。

PS:上面的数字仅供参考,没太多实际意义,因为这个与具体代码的编写有关。

好了,言归正传。

我们来说说第二种中的使用的Mybatis 的ResultMap 的使用。

resultMap 元素是 MyBatis 中最重要最强大的元素。

它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。

事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。

ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

你已经看到简单映射语句的示例了,但没有明确的 resultMap 。

比如:基于JavaBean 的规范,上面这个类有 3 个属性:id,username 和hashedPassword。

这些在select 语句中会精确匹配到列名。

这样的一个JavaBean 可以被映射到结果集,就像映射到HashMap 一样简单。

如果世界总是这么简单就好了。

高级结果映射MyBatis 创建的一个想法:数据库不用永远是你想要的或需要它们是什么样的。

而我们最喜欢的数据库最好是第三范式或BCNF 模式,但它们有时不是。

如果可能有一个单独的数据库映射,所有应用程序都可以使用它,这是非常好的,但有时也不是。

结果映射就是MyBatis 提供处理这个问题的答案。

比如,我们如何映射下面这个语句?resultMap 元素有很多子元素和一个值得讨论的结构。

下面是resultMap 元素的概念视图resultMap∙constructor - 类在实例化时,用来注入结果到构造方法中∙idArg - ID 参数;标记结果作为ID 可以帮助提高整体效能∙arg - 注入到构造方法的一个普通结果id–一个ID 结果;标记结果作为ID 可以帮助提高整体效能result–注入到字段或JavaBean 属性的普通结果association–一个复杂的类型关联;许多结果将包成这种类型∙嵌入结果映射–结果映射自身的关联,或者参考一个collection–复杂类型的集∙嵌入结果映射–结果映射自身的集,或者参考一个discriminator–使用结果值来决定使用哪个结果映射∙case–基于某些值的结果映射嵌入结果映射–这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。

ResultMap Attributes这些是结果映射最基本内容。

id 和result 都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。

这两者之间的唯一不同是id 表示的结果将是当比较对象实例时用到的标识属性。

这帮助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射) 。

每个都有一些属性:Id and Result AttributesId and Result Attributes对于大多数数据传输对象(Data Transfer Object,DTO)类型,属性可以起作用,而且像你绝大多数的领域模型, 指令也许是你想使用一成不变的类的地方。

通常包含引用或查询数据的表很少或基本不变的话对一成不变的类来说是合适的。

构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。

MyBatis 也支持私有属性和私有JavaBeans 属性来达到这个目的,但是一些人更青睐构造方法注入。

构造方法元素支持这个。

看看下面这个构造方法:关联元素处理“有一个”类型的关系。

比如,在我们的示例中,一个博客有一个用户。

关联映射就工作于这种结果之上。

你指定了目标属性,来获取值的列,属性的 java 类型(很多情况下MyBatis 可以自己算出来) ,如果需要的话还有 jdbc 类型,如果你想覆盖或获取的结果值还需要类型控制器。

关联中不同的是你需要告诉 MyBatis 如何加载关联。

MyBatis 在这方面会有两种不同的方式:∙嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型。

∙ 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。

首先,然让我们来查看这个元素的属性。

所有的你都会看到,它和普通的只由 select 和我们有两个查询语句:一个来加载博客,另外一个来加载作者,而且博客的结果映射描述了“selectAuthor”语句应该被用来加载它的author 属性。

其他所有的属性将会被自动加载,假设它们的列和属性名相匹配。

这种方式很简单, 但是对于大型数据集合和列表将不会表现很好。

问题就是我们熟知的“N+1 查询问题”。

概括地讲,N+1 查询问题可以是这样引起的:∙你执行了一个单独的SQL 语句来获取结果列表(就是“+1”)。

∙对返回的每条记录,你执行了一个查询语句来为每个加载细节(就是“N”)。

这个问题会导致成百上千的SQL 语句被执行。

这通常不是期望的。

在上面你已经看到了一个非常复杂的嵌套关联的示例。

下面这个是一个非常简单的示例来说明它如何工作。

代替了执行一个分离的语句,我们联合博客表和作者表在一起,就像:在上面的示例中你可以看到博客的作者关联代表着“authorResult”结果映射来加载作者实例。

非常重要: 在嵌套据诶过映射中 id 元素扮演了非常重要的角色。

应应该通常指定一个或多个属性,它们可以用来唯一标识结果。

实际上就是如果你离开她了,但是有一个严重的性能问题时MyBatis 仍然可以工作。

选择的属性越少越好,它们可以唯一地标识结果。

主键就是一个显而易见的选择(尽管是联合主键)。

现在,上面的示例用了外部的结果映射元素来映射关联。

这使得 Author 结果映射可以重用。

然而,如果你不需要重用它的话,或者你仅仅引用你所有的结果映射合到一个单独描述的结果映射中。

你可以嵌套结果映射。

这里给出使用这种方式的相同示例:集合元素的作用几乎和关联是相同的。

实际上,它们也很相似,文档的异同是多余的。

所以我们更多关注于它们的不同。

我们来继续上面的示例,一个博客只有一个作者。

但是博客有很多文章。

在博客类中, 这可以由下面这样的写法来表示:读作: “在Post 类型的ArrayList 中的posts 的集合。

”javaType 属性是不需要的,因为MyBatis 在很多情况下会为你算出来。

所以你可以缩短写法:集合的嵌套结果至此,你可以猜测集合的嵌套结果是如何来工作的,因为它和关联完全相同,除了它应用了一个“ofType”属性First, let's look at the SQL:同样,要记得id 元素的重要性,如果你不记得了,请阅读上面的关联部分。

同样, 如果你引用更长的形式允许你的结果映射的更多重用, 你可以使用下面这个替代的映射:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联) 数据类型的结果集。

鉴别器元素就是被设计来处理这个情况的, 还有包括类的继承层次结构。

鉴别器非常容易理解,因为它的表现很像Java 语言中的switch 语句。

定义鉴别器指定了column 和javaType 属性。

列是MyBatis 查找比较值的地方。

JavaType 是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。

比如:现在vehicleResult 和carResult 的属性都会被加载了。

尽管曾经有些人会发现这个外部映射定义会多少有一些令人厌烦之处。

因此还有另外一种语法来做简洁的映射风格。

比如:。

合集下载

resultmap的使用方式

resultmap的使用方式

resultmap的使用方式全文共四篇示例,供读者参考第一篇示例:ResultMap是MyBatis中的一个重要概念,它是用来映射查询结果到Java对象的,可以帮助我们更加方便地操作数据库。

ResultMap的使用方式非常简单,只需要在MyBatis的映射文件中定义一个ResultMap节点,然后在查询语句中引用这个ResultMap 即可。

下面我们来看一个简单的例子,假设我们有一个User类,对应数据库中的user表:```javapublic class User {private Long id;private String name;private Integer age;// 省略getter和setter方法}```在查询语句中引用这个ResultMap:```xml<select id="getUserById" resultMap="userMap">SELECT * FROM user WHERE id = #{id}</select>```这样,当我们执行查询语句getUserById时,MyBatis会自动将查询结果映射到User对象中,并返回一个User对象。

除了直接将查询结果映射到对象属性上,ResultMap还支持级联映射、自定义映射等功能,可以满足各种不同的需求。

第二篇示例:ResultMap是MyBatis框架中非常重要的一个功能,它能够将数据库查询结果映射为Java对象,提供了一种便捷的方式来对查询结果进行处理。

在实际开发中,我们常常需要将数据库查询结果映射为Java对象,然后进行进一步的处理和展示。

而ResultMap就是帮助我们完成这个转换过程的重要组件。

ResultMap是通过<resultMap>标签来定义的,可以在MyBatis 的映射文件中进行声明。

通常情况下,我们会在<resultMap>标签中定义<result>标签,用来指定查询结果的列名与Java对象的属性之间的映射关系。

MyBatis的关联映射,resultMap元素之collection子元素,实现多对多关。。。

MyBatis的关联映射,resultMap元素之collection子元素,实现多对多关。。。

MyBatis的关联映射,resultMap元素之collection⼦元素,实现多对多关。

MyBatis映射⽂件中的<resultMap>元素中,包含⼀个<collection>⼦元素,MyBatis通过它来处理多对多关联关系。

<collection>⼦元素的⼤部分属性与<association>⼦元素相同,但其还包含⼀个特殊属性——ofType。

ofType属性与javaType属性对应,它⽤于指定实体对象中集合类属性所包含的元素类型。

本⽂是、两篇⽂章的延续,如有配置上的问题,请参考上两篇⽂章。

情景:在实际项⽬开发中,多对多的关联关系是⾮常觉的。

以订单和商品为例,⼀个订单可以包含多种商品,⽽⼀种商品⼜可以属于多个订单,订单和商品就属于多对多的关联关系。

⼀、创建数据结构及插⼊数据(MySQL),注意:请先选择数据库# 创建⼀个名称为tb_product的表CREATE TABLE tb_product(id INT(32) PRIMARY KEY AUTO_INCREMENT,name VARCHAR(32),price DOUBLE);# 插⼊3条数据INSERT INTO tb_product VALUES ('1','Java基础⼊门','44.5');INSERT INTO tb_product VALUES ('2','Java Web程序开发⼊门','38.5');INSERT INTO tb_product VALUES ('3','SSM框架整合实战','50');# 创建⼀个名称为tb_ordersitem 的中间表CREATE TABLE tb_ordersitem(id INT(32) PRIMARY KEY AUTO_INCREMENT,orders_id INT(32),product_id INT(32),FOREIGN KEY(orders_id) REFERENCES tb_orders(id),FOREIGN KEY(product_id) REFERENCES tb_product(id));# 插⼊5条数据INSERT INTO tb_ordersitem VALUES ('1','1','1');INSERT INTO tb_ordersitem VALUES ('2','1','3');INSERT INTO tb_ordersitem VALUES ('3','3','1');INSERT INTO tb_ordersitem VALUES ('4','3','2');INSERT INTO tb_ordersitem VALUES ('5','3','3');⼆、创建实体类Product,并修改Orders实体类package com.itheima.po;import java.util.List;/*** 商品持久化类*/public class Product {private Integer id; //商品idprivate String name; //商品名称private Double price;//商品单价private List<Orders> orders; //与订单的关联属性public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public List<Orders> getOrders() {return orders;}public void setOrders(List<Orders> orders) {this.orders = orders;}@Overridepublic String toString() {return "Product [id=" + id + ", name=" + name+ ", price=" + price + "]";}}package com.itheima.po;import java.util.List;/*** 订单持久化类*/public class Orders {private Integer id; //订单idprivate String number;//订单编号//关联商品集合信息private List<Product> productList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public List<Product> getProductList() {return productList;}public void setProductList(List<Product> productList) {this.productList = productList;}@Overridepublic String toString() {return "Orders [id=" + id + ", number=" + number + ", productList=" + productList + "]";}}三、创建映射⽂件ProductMapper.xml、OrdersMapper.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.mapper.ProductMapper"><select id="findProductById" parameterType="Integer"resultType="Product">SELECT * from tb_product where id IN(SELECT product_id FROM tb_ordersitem WHERE orders_id = #{id})</select></mapper><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.mapper.OrdersMapper"><!-- 多对多嵌套查询:通过执⾏另外⼀条SQL映射语句来返回预期的特殊类型 --><select id="findOrdersWithPorduct" parameterType="Integer"resultMap="OrdersWithProductResult">select * from tb_orders WHERE id=#{id}</select><resultMap type="Orders" id="OrdersWithProductResult"><id property="id" column="id"/><result property="number" column="number"/><collection property="productList" column="id" ofType="Product"select="com.itheima.mapper.ProductMapper.findProductById"></collection></resultMap><!-- 多对多嵌套结果查询:查询某订单及其关联的商品详情 --><select id="findOrdersWithPorduct2" parameterType="Integer"resultMap="OrdersWithPorductResult2">select o.*,p.id as pid,,p.pricefrom tb_orders o,tb_product p,tb_ordersitem oiWHERE oi.orders_id=o.idand oi.product_id=p.idand o.id=#{id}</select><!-- ⾃定义⼿动映射类型 --><resultMap type="Orders" id="OrdersWithPorductResult2"><id property="id" column="id"/><result property="number" column="number"/><!-- 多对多关联映射:collection --><collection property="productList" ofType="Product"><id property="id" column="pid"/><result property="name" column="name"/><result property="price" column="price"/></collection></resultMap></mapper>四、修改MyBatis配置⽂件(mybatis-config.xml),加⼊如下内容:<mapper resource="com/itheima/mapper/OrdersMapper.xml"/><mapper resource="com/itheima/mapper/ProductMapper.xml"/>五、修改测试程序MybatisAssociatedTest.java,加⼊如下内容:可以将findOrdersWithPorduct修改为findOrdersWithPorduct2,其输出仍然是⼀样的。

xml文件中resultmap的用法

xml文件中resultmap的用法

文章标题:深度解析XML文件中ResultMap的用法在开发中,XML文件是一种常见的数据交换格式,而MyBatis框架中的ResultMap是对查询结果集的映射。

本文将深入探讨XML文件中ResultMap的用法,并结合具体实例进行讲解。

1. ResultMap的基本概念在MyBatis中,ResultMap是对象关系映射(ORM)中的重要组成部分。

它定义了如何将数据库查询结果映射到Java对象上。

ResultMap主要由id、type、result、association、collection等属性构成,通过这些属性的配置,可以实现复杂的结果映射。

2. ResultMap的用法在XML中定义ResultMap时,需要指定id和type属性,分别表示ResultMap的唯一标识和映射的Java类型。

而result、association、collection等属性则用于配置结果映射的细节。

在实际使用中,可以通过ResultMap的配置,实现一对一、一对多等复杂的映射关系。

3. 实例分析假设有一个学生表和课程表,学生表中包含学生的基本信息,课程表中包含学生选修的课程信息。

通过ResultMap的配置,可以将学生表和课程表的查询结果映射到Java对象上,实现对学生及其选修课程的全面查询和展示。

4. 结合实际案例在实际开发中,我们经常会遇到复杂的查询需求,通过ResultMap的配置,可以灵活实现对多表关联查询的结果映射。

这样既可以减少开发人员的工作量,又可以提高程序的性能和可维护性。

总结回顾通过对XML文件中ResultMap的深入探讨,我们了解了ResultMap 的基本概念、用法和实例分析。

我们也明白了ResultMap在实际开发中的重要性和应用场景。

通过合适的ResultMap配置,可以实现复杂查询结果的灵活映射,为程序的性能和可维护性提供了保障。

个人观点在实际开发中,我认为XML文件中ResultMap的用法是非常重要的。

mybatis中resultMap标签的使用教程

mybatis中resultMap标签的使用教程

mybatis中resultMap标签的使用教程```xml<resultMap id="resultMapId" type="resultType"><!--定义映射规则--></resultMap>```其中,id属性用于定义该映射规则的唯一标识,type属性用于指定映射结果的类型。

```xml<id property="propertyName" column="columnName" /><result property="propertyName" column="columnName" />```其中,property属性用于指定映射到对象的属性名,column属性用于指定数据库查询结果中的列名。

1.关联对象映射```xml<association property="propertyName"resultMap="associationResultMapId" />```其中,property属性用于指定关联对象的属性名,resultMap属性用于指定关联对象的映射规则。

2.集合映射```xml<collection property="propertyName" ofType="elementType" resultMap="collectionResultMapId" />```其中,property属性用于指定集合属性的属性名,ofType属性用于指定集合元素的类型,resultMap属性用于指定集合元素的映射规则。

3.自动映射```xml<resultMap id="resultMapId" type="resultType"autoMapping="true"><!--定义映射规则--></resultMap>```自动映射的原则是通过数据库查询结果的列名和对象的属性名进行匹配,如果名称一致则进行映射,否则忽略该列。

详解MyBatisresultType与resultMap中的几种返回类型

详解MyBatisresultType与resultMap中的几种返回类型

详解MyBatisresultType与resultMap中的⼏种返回类型⽬录⼀、返回集合1.返回JavaBean集合2.返回Map集合⼆、返回Map1.⼀条记录2.多条记录,需要指定Map的Key和Value的类型三、返回resultMap⾃定义结果集封装1.⾃定义JavaBean的封装2.关联查询的封装,⼀对⼀,JavaBean属性包含JavaBean3.关联查询的封装,⼀对多,JavaBean属性包含JavaBean的集合4.鉴别器discriminator⼀、返回集合1.返回JavaBean集合public List<MyUser> selectMyUserByNameLike(String name);<!-- resultType 集合内的元素类型 --><select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">select * from myuser where name like #{name}</select>测试⽅法public static void main(String[] args) {SqlSession session = null;try {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);session = sqlSessionFactory.openSession();MyUserMapper mapper = session.getMapper(MyUserMapper.class);List<MyUser> myUsers = mapper.selectMyUserByNameLike("%a%");System.out.println(myUsers);} catch (IOException e) {e.printStackTrace();} finally {if (session != null) {session.close();}}}2.返回 Map 集合<!--public List<Map<String,Object>> getMyUser()--><select id="getMyUser" resultType="map">select * from myuser</select>⼆、返回 Map1.⼀条记录public Map<String,Object> selectMyUserById(Integer id);<select id="selectMyUserById" resultType="map" parameterType="integer">select * from myuser where id = #{id}</select>2.多条记录,需要指定 Map 的 Key 和 Value 的类型// 指定 Map 的 Key 从记录中的 id 列获取@MapKey("id")public Map<String,MyUser> selectMyUserByGtId(Integer id);<!-- resultType Map 中 value 的类型 --><select id="selectMyUserByGtId" resultType="myUser" parameterType="integer">select * from myuser where id > #{id}</select>三、返回 resultMap ⾃定义结果集封装关于⾃动映射封装的配置<settings><!-- ⾃动映射有三种模式,NONE、PARTIAL、FULL。

Mybatis中ResultMap的collection配置一对多使用详解

Mybatis中ResultMap的collection配置一对多使用详解

Mybatis中ResultMap的collection配置⼀对多使⽤详解resultMap可以将查询到的多种数据,映射到⼀个符合要求的对象上。

1.实现操作的基本流程 调⽤Mapper接⼝的⽅法→→Mapper.xml⽂件中对应id的查询语句(接⼝的⽅法名=查询语句的id)→查询语句配置resultMap属性(属性值是其对应ResultMap标签的id)→在resultMap标签中,配置查到的表的字段与对象的属性的关系。

2.主要总结⼀下collection的使⽤ 为了解决⼀对多类型的需求,使⽤collection标签来处理其中的“多”,常表现为在类中的属性为List<> 2.1 resultMap部分: id - 唯⼀标识,不做赘述 type - 映射的⽬标类型 每⼀⾏都是⼀个数据库表中字段与对象属性的映射 column - 数据库表中的字段 property - pojo对象的对应属性 <resultMap id="UserRolesMap" type="er"><id column="u_id" property="userId" jdbcType="INTEGER"/><result column="u_name" property="userName" jdbcType="VARCHAR"/><!--collection部分见下,两种类型就是把collection部分分别填充在该处--!></resultMap> 2.2 collection有两种配置⽅式 1.嵌套数据 2.嵌套查询 两种⽅式的主要区别在于collection,和sql语句处 2.2.1.嵌套数据//collection://在collection标签(即”多“)的次级标签中,直接配置List<>中对象的映射//pojoA中"List<pojoB> pojoBList" 则property处填pojoBList<collection property="pojoA的⼀个集合属性名" ofType="集合中的pojoB对象"/><id column="表的字段(<>括号中的类的属性所对应的)" jdbcType="字段类型(数据库表的)" property="集合中对象的主键属性(javabean)" /><result column="表的字段(可以为任意表中的)" jdbcType="字段类型(数据库表的)" property="集合中的pojo对象的属性" /></collection>// 例⼦//Role对象包括 roleId roleName字段,对应数据库中表的字段是role_id role_name<collection property="roleList" ofType="com.example.server.beans.Role"/><id column="role_id" jdbcType="INTEGER" property="roleId" /><result column="role_Name" jdbcType="VARCHAR" property="roleName" /></collection>//SQl://只有⼀段<select id="它的id" resultMap="其语句查询出的数据从依照那个resultMap来映射">//该处写的sql语句应是:查询出来的数据,包括collection以及resultMap中的各个表字段(即每个column)</select> 2.2.2嵌套查询//collection://不写次级标签,通过select实现嵌套查询//pojoA中"List<pojoB> pojoBList" 则property处填pojoBList//column 是传⼊的参数(⽬前我也未搞懂,可以直接照传⼊属性值对应的表字段填写)<collection property="pojoA的⼀个集合属性名" ofType="com.example.server.beans.PojoB" column="user_id" select="⼀个sql查询的id(sql_id)"/>//SQl://应当有两段://1.是查询resutMap的属性(PojoA的其他属性)的语句,其应将resultType换为resultMapper//2.即为下列查询pojoB<select id = "sql_id" resultType = "com.example.server.beans.PojoB" parameterType = "INTEGER">//该处写的sql语句应是:⽤user_id对应的pojo属性(即mapper接⼝中⽅法的传参)来查询出你所需要的PojoB的字段的语句</select>(嵌套查询的collection 也还有两种,resultMap或者resultType 这⾥只写了后者,前者可在下列代码中的嵌套查询collectionPlanA中见到) 配上⼀个没什么注释的xml⽂件代码--UserMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="erMapper"><!-- 嵌套数据,ResultMap --><select id="getRolesByUserId" resultMap="UserRolesMap">SELECTu.u_id,u.`u_name`,r.r_id,r.`r_name`FROMt_user u,t_role r,t_role_user ruWHEREru.role_id = r.r_idAND er_id = u.u_idAND u.u_id = #{userId}</select><!-- 嵌套数据,association或者collection中⽆select --><resultMap id="UserRolesMap" type="er"><id column="u_id" property="userId" jdbcType="INTEGER"/><result column="u_name" property="userName" jdbcType="VARCHAR"/><!-- <result column="password" property="password" jdbcType="VARCHAR"/>--><collection property="roleList" javaType="java.util.List" ofType="com.example.server.bean.Role" ><id column="r_id" property="roleId" jdbcType="INTEGER"/><id column="r_name" property="roleName" jdbcType="VARCHAR"/></collection></resultMap><!--嵌套查询 ResultMap--><select id="getRolesByUserId_1" resultMap="UserRolesMap_1">SELECT u_id , `u_name`FROM t_userWHERE u_id = #{userId}</select><!--collection嵌套查询--><resultMap id="UserRolesMap_1" type="er"><id column="u_id" property="userId"/><result column="u_name" property="userName"/><!-- collection⼀对多,property是List属性的名字,ofType是List<>中的类型 column是传⼊的参数--><!-- select执⾏的是⼀个语句--><collection property="roleList" ofType="com.example.server.bean.Role" column="u_id" select="findRoleListByUserId"/></resultMap><!-- 嵌套查询collection plan A--> <!-- 嵌套查询RoleList select中的三个属性(id resultMap parameterType)都不能少--> <!--As后是对应pojo中的属性名有resultMap指定映射关系时就不⽤AS去对应属性名了--><select id="findRoleListByUserId" resultMap="getRoleListByUserIdMap" parameterType="INTEGER">SELECT r.r_id , r.r_nameFROM t_role r, t_role_user ruWHERE r.r_id = ru.role_idAND er_id = #{userId}</select><resultMap id="getRoleListByUserIdMap" type="com.example.server.bean.Role"><id column="r_id" property="roleId"/><result column="r_name" property="roleName"/></resultMap><!-- 嵌套查询collection plan B--> <!-- <select id="findRoleListByUserId" resultType="com.example.server.bean.Role" parameterType="INTEGER">--> <!-- SELECT r.r_id AS roleId, r.r_name AS roleName--> <!-- FROM t_role r, t_role_user ru--> <!-- WHERE r.r_id = ru.role_id--> <!-- AND er_id = #{userId}--> <!-- </select>--> 错误欢迎指正,多多学习。

mybatis中resultmap用法

mybatis中resultmap用法MyBatis中的ResultMap用法在使用MyBatis进行数据库操作时,ResultMap是一个非常重要的概念和功能。

通过ResultMap,我们可以将查询结果映射到Java对象中,从而简化代码编写和数据库操作。

本文将以“mybatis中ResultMap用法”为主题,详细介绍ResultMap的使用方法。

1. ResultMap的概念与作用ResultMap是MyBatis中的一个重要组件,它是一个映射关系,用于将查询结果与Java对象进行映射。

通过ResultMap,我们可以定义查询结果的列与Java对象属性的对应关系,从而实现自动映射的功能。

在查询结果与Java对象属性存在不一致情况下,可以通过ResultMap进行手动映射。

2. ResultMap的定义和使用ResultMap是在Mapper XML文件中定义的,通过<resultMap>标签进行定义。

定义一个ResultMap需要指定id属性、type属性和各种<result>标签。

2.1 定义ResultMap的id和type属性ResultMap的id属性用于标识一个ResultMap,是全局唯一的,可以在SQL语句中引用该ResultMap。

type属性表示映射的Java对象类型,可以是Java的原始类型、Java实体类、Java的内部类等。

2.2 使用<result>标签进行映射在ResultMap中,我们使用<result>标签来定义列和属性的映射关系。

一个<result>标签对应一个列和一个属性的映射。

属性包括column 属性和property属性,column属性表示数据库表中的列名,而property 属性表示Java对象的属性名。

2.3 完整的ResultMap定义示例我们通过一个完整的ResultMap定义示例来更好地理解ResultMap的使用方法:<resultMap id="userMap" type="er"><id property="id" column="user_id" /><result property="name" column="user_name" /><result property="age" column="user_age" /></resultMap>在上述代码中:userMap为ResultMap的id;User为Java对象的类型;id为属性映射,property为Java对象的属性名,column为数据库表中的列名;name和age都是<result>标签的属性映射。

resultmap的使用方式

resultmap的使用方式在MyBatis中,ResultMap是用来映射查询结果集的一种重要方式。

通过ResultMap,我们可以将查询结果映射到Java对象的属性上,从而方便地进行数据操作和处理。

下面我将从多个角度介绍ResultMap的使用方式。

1. 定义ResultMap:在MyBatis的映射文件(通常是XML文件)中,我们可以使用<resultMap>元素来定义ResultMap。

在<resultMap>中,我们需要指定一个唯一的id来标识该ResultMap,然后使用<result>元素来指定查询结果集中的列与Java对象的属性之间的映射关系。

2. 使用ResultMap进行映射:一旦定义了ResultMap,我们就可以在SQL语句中使用它来进行结果集的映射。

在SQL语句中,我们可以使用<resultMap>元素的id来引用定义好的ResultMap,从而告诉MyBatis如何将查询结果映射到Java对象。

3. 嵌套ResultMap:有时候,查询结果可能涉及到多个实体类之间的关联关系,这时可以使用嵌套ResultMap来处理这种复杂的映射关系。

通过嵌套ResultMap,我们可以将多个ResultMap组合起来,实现多表查询结果的映射。

4. 自动映射:除了手动定义ResultMap外,MyBatis还提供了自动映射的功能。

在一些简单的情况下,MyBatis可以根据查询结果的列名和Java对象的属性名进行自动映射,从而简化了我们的开发工作。

5. 高级映射:除了基本的映射功能外,ResultMap还支持一些高级的映射特性,比如使用<constructor>元素来进行构造函数映射,使用<discriminator>元素来进行条件映射等,这些功能可以帮助我们更加灵活地处理复杂的映射需求。

总的来说,ResultMap是MyBatis中非常重要的一个功能,它为我们提供了灵活、强大的结果集映射能力,能够帮助我们更好地处理各种复杂的查询结果映射需求。

mybatis结果映射标签的用法_解释说明

mybatis结果映射标签的用法解释说明1. 引言1.1 概述在使用MyBatis进行数据库操作时,结果映射标签是非常重要的一部分。

通过定义这些标签,我们可以灵活地将查询结果映射到Java对象中,从而方便地对数据进行处理和操作。

MyBatis提供了一系列的结果映射标签,包括result和resultMap等。

本文将对这些标签的用法及其意义进行详细解释说明。

1.2 文章结构本文将按照以下结构来进行讲解:- 引言:对本文的主题和目的进行概述。

- mybatis结果映射标签的用法:简要介绍结果映射标签的基本概念和作用。

- 结果映射标签的详细说明:具体介绍result和resultMap两个核心标签的使用方法和属性含义。

- 示例与案例解析:通过实际示例来演示如何使用结果映射标签,并进行深入分析。

- 结论:总结本文所介绍的观点和用法,并对mybatis结果映射标签使用的意义和优势进行评价和展望。

1.3 目的本文旨在全面介绍MyBatis中结果映射标签的用法,并通过实例与案例解析,帮助读者更好地理解和应用这些标签。

同时,通过评价和展望,揭示这些标签在开发过程中的意义和优势,为读者提供更好的使用指南。

在阅读本文之后,读者将能够灵活运用结果映射标签,提高数据处理效率,并有效地减少代码冗余,提升软件开发质量。

2. mybatis结果映射标签的用法:2.1 简介:mybatis是一种流行的Java持久化框架,它使用了一种称为结果映射的技术来将数据库查询结果映射到Java对象上。

结果映射是通过在mybatis配置文件中使用特定的标签来实现的。

2.2 结果集映射:在mybatis中,我们可以使用resultType属性或resultMap标签对查询结果进行简单或复杂的映射。

resultType属性用于指定返回类型为简单类型或简单类型集合时使用,而resultMap标签则适用于更复杂的情况。

2.3 属性映射:在mybatis的结果映射标签中,我们可以定义各种属性来指定如何将数据库列映射到Java对象的属性上。

resultmap子元素用法

resultmap子元素用法
在MyBatis中,可以通过resultMap来指定查询结果的映射关系。

resultMap是一个映射规则的集合,在其中指定了查询结果集中列名到Java属性的映射关系。

在resultMap中,需要使用result子元素来声明映射关系。

resultMap子元素具体用法如下:
1. id属性:resultMap元素中必须包含id属性,该属性用于为resultMap指定一个唯一的ID。

2. type属性:type属性用于指定目标类型,即查询结果集中需要映射到的Java类型。

3. column属性:column属性用于指定查询结果集中的列名,它需要与数据库表中的列名一致。

4. property属性:property属性用于指定Java类型中的属性名,它需要与Java类型中的属性名一致。

5. jdbcType属性:jdbcType属性用于指定数据库表中该列的数据类型。

6. resultMap属性:resultMap属性用于指定需要嵌套使用的resultMap的ID。

7. notNullColumn属性:notNullColumn属性用于指定哪些列为非空列。

使用resultMap子元素可以清晰地定义查询结果集映射规则,提高代码可维护性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档