Mybatis的ResultMap的使用

合集下载

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用法在使用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的使用方式

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结果映射标签的用法_解释说明

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子元素用法

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子元素可以清晰地定义查询结果集映射规则,提高代码可维护性。

resultmap collection用法

resultmap collection用法

ResultMap Collection用法引言在MyBatis中,ResultMap是一种用于将查询结果映射到对象的重要机制。

ResultMap可以配置多种映射方式,包括使用collection元素实现对象间的关联关系映射。

本文将深入探讨ResultMap collection的用法,详细介绍collection 的配置方式和常见应用场景。

什么是ResultMap Collection在MyBatis中,ResultMap是一种用于将查询结果映射到对象的机制。

ResultMap 定义了对象属性与查询结果列的对应关系。

ResultMap collection则是通过配置实现对象之间的关联关系映射。

通过collection元素,可以将查询结果中的多行记录映射到Java对象的集合中。

ResultMap Collection的配置方式在ResultMap中配置collection,需要使用collection元素。

以下是collection 元素的配置示例:<!-- 配置ResultMap --><resultMap id="userMap" type="User"><id property="id" column="uid"/><result property="name" column="uname"/><collection property="articles" ofType="Article"><id property="id" column="aid"/><result property="title" column="atitle"/><result property="content" column="acontent"/></collection></resultMap>在上述示例中,User对象具有一个articles属性,用于存放多个Article对象。

resultmap 字段顺序

resultmap 字段顺序

在写文章之前,先对“resultmap 字段顺序”这个主题进行全面评估,探讨其深度和广度,以便撰写一篇高质量、有价值的文章。

resultmap 是MyBatis中用于映射查询结果的一个重要部分。

在resultmap中,我们可以定义查询结果集中每一列数据应该映射到的实体对象的属性上。

而“字段顺序”指的是在resultmap中,定义列和属性映射关系的顺序。

resultmap 字段顺序的设置对于查询结果的映射是非常重要和关键的。

在撰写本文时,我将按照从简到繁、由浅入深的方式来探讨resultmap 字段顺序的重要性和影响。

我会介绍resultmap的基本概念和作用,然后详细讨论字段顺序对查询结果映射的影响,最后会提出一些实际应用中的经验和建议。

1. resultmap 的基本概念和作用resultmap是MyBatis中用来映射查询结果的一个重要配置项。

它可以定义如何将查询结果映射到Java对象的属性上,从而方便我们对查询结果进行处理和操作。

在resultmap中,我们可以通过<result>标签来定义列和属性的映射关系,还可以通过<association>和<collection>等标签来处理复杂类型的映射关系。

resultmap在MyBatis中扮演着非常重要的角色,它直接影响着查询结果的映射质量和效率。

2. 字段顺序对查询结果映射的影响在resultmap中,<result>标签的顺序决定了查询结果中列的顺序,而属性在Java对象中的顺序则由属性定义的顺序决定。

字段顺序就成了影响查询结果映射的关键因素之一。

如果resultmap中<result>标签的顺序和实体类中属性的顺序不一致,就会导致查询结果的错位映射。

这可能会导致数据异常甚至程序崩溃,所以合理设置字段顺序是非常重要的。

3. 实际应用中的经验和建议在实际应用中,我们应该根据查询结果集的列顺序来设置resultmap 的字段顺序,以保证查询结果能够正确映射到Java对象的属性上。

result map语句写法

result map语句写法

结果图(result map)是MyBatis中的一个重要概念,用于映射查询结果到实体类等目标对象。

正确的result map语句写法可以帮助我们更好地利用MyBatis框架进行数据操作,并减少开发中可能出现的问题。

本文将针对result map语句的写法进行详细介绍,以便读者更好地掌握该知识点。

一、result map语句的基本格式在MyBatis中,result map语句可以通过<resultMap>元素来定义,其基本格式如下所示:```xml<resultMap id="resultMapName" type="实体类的全限定名"><id property="id" column="id" jdbcType="INTEGER"/><result property="name" column="name"jdbcType="VARCHAR"/><!-- 其他映射关系 --></resultMap>```其中,id属性用于指定result map的唯一标识,type属性用于指定映射的目标对象类型。

在<resultMap>元素内部,可以通过<id>和<result>元素分别定义主键和普通字段的映射关系。

property属性用于指定目标对象的属性名,column属性用于指定查询结果集中的列名,jdbcType属性用于指定数据库中列的数据类型。

二、result map语句的详细用法1. 映射主键字段在<resultMap>元素内部,可以通过<id>元素来映射主键字段,其格式如下所示:```xml<id property="id" column="id" jdbcType="INTEGER"/>```2. 映射普通字段在<resultMap>元素内部,可以通过<result>元素来映射普通字段,其格式如下所示:```xml<result property="name" column="name"jdbcType="VARCHAR"/>```3. 映射复杂类型字段在<resultMap>元素内部,可以通过<association>和<collection>元素来映射复杂类型字段,其格式如下所示:```xml<association property="author" resultMap="authorResultMap"/> <collection property=ments" ofType=ment" resultMap=mentResultMap"/>```4. 映射存储过程参数在<resultMap>元素内部,可以通过<parameterMap>元素来映射存储过程参数,其格式如下所示:```xml<parameterMap id="parameterMapName"class=.example.Param"><parameter property="param1" jdbcType="VARCHAR" mode="IN"/><parameter property="param2" jdbcType="INTEGER" mode="OUT"/></parameterMap>```5. 映射联合查询结果集在<resultMap>元素内部,可以通过<discriminator>元素来映射联合查询结果集,其格式如下所示:```xml<discriminator javaType="int" column="post_type"><case value="1" resultMap="blogResultMap"/><case value="2" resultMap="newsResultMap"/></discriminator>```6. 映射结果集到嵌套对象在<resultMap>元素内部,可以通过<constructor>元素来映射结果集到嵌套对象,其格式如下所示:```xml<constructor><idArg column="id" javaType="int"/><arg column="name" javaType="String"/></constructor>```三、result map语句的实际应用1. 在select语句中使用result map在MyBatis的select语句中,可以通过resultMap属性引用已定义的result map,以实现查询结果的映射。

mybatis的mapper.xml中resultMap标签的使用详解

mybatis的mapper.xml中resultMap标签的使用详解

mybatis的mapper.xml中resultMap标签的使⽤详解1.前⾔ 最近博主在做⼀个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线⽅式,a_username,然后在写mapper.xml⾥⾯的sql语句的时候,⼀直出现查询语句查询的值为null的情况。

或者是resultMap标签和驼峰规则不太明⽩的同学,可以看这⾥。

于是顺便梳理⼀下。

2.关于resultMap2.1.什么是resultMap? 在mybatis中有⼀个resultMap标签,它是为了映射select查询出来结果的集合,其主要作⽤是将实体类中的字段与数据库表中的字段进⾏关联映射。

注意当实体类中的字段与数据库表中的字段相同时,可以将resultMap标签中的关联关系忽略不写。

当实体类中的字段与数据库表中的字段不相同时,就需要在resultMap标签中将实体类字段与数据库字段⼀⼀进⾏关联映射,或者开启驼峰规则,让它⾃动转换。

3.举例说明3.1.数据库与实体类之间名称相同数据库这么写:然后对应写的实体类:在mapper中的查询⽅式:可以看到,是最常规的sql查询写法,这样就能正常的查询到数据库的数据。

当然这个时候开不开启驼峰规则都可以,⽐如在mybatis的配置⽂件中声明开启,也是⼀样的效果。

这是为什么呢?顺便说⼏个关于实体类、数据库、json格式的知识。

数据库字段、索引对⼤⼩写是不敏感的,驼峰标识⽆意义;也就是你开不开启实际上都⼀样。

json 的规范格式是带有下划线的;⽐如:{“id”:”1234”“user_name”:”Lilan”;}数据库字段和 bean 之间字段转换,主流 orm ⼯具都有映射转换⽀持,⽐如上图mybatis中开启的驼峰规则;json 和 bean 之间字段转换,可以使⽤注解 @JsonProperty,⽐如写实体类的时候:@JsonProperty("user_name") private String userName;3.2.数据库与实体类之间不相同⽐如常见的写法: 数据库使⽤下划线,与之映射的实体类中采⽤驼峰原则。

mybatis多层嵌套resultMap及返回自定义参数详解

mybatis多层嵌套resultMap及返回自定义参数详解

mybatis多层嵌套resultMap及返回⾃定义参数详解1.两层嵌套,⼀个list中加另外⼀个listdata:[{a:123,b:456,c:[{d:7,e:8}]}]xml⽂件定义的sqlselect * from zhy z LEFT JOIN wl w on z.id = w.zidresultMap可以定义:<resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy⾃动⽣成的BaseResultMap"><collection property="c" resultMap="wl⾃动⽣成的BaseResultMap"/></resultMap>如果测试表zhy与wl表中存在重复名称的字段可以使⽤columnPrefix注意w_select z.*,w.b as w_b,w.c as w_c from zhy z LEFT JOIN wl w on z.id = w.zid<resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy⾃动⽣成的BaseResultMap"><collection property="c" resultMap="wl⾃动⽣成的BaseResultMap" columnPrefix="w_"/></resultMap>如果接收的实体是⾃定义的实体并且还有默认参数当resultMap返回的实体中存在默认值的时候,发现外层的zhy是可以赋值成功的,但是内层的wl却没有,这个时候需要将⾃动⽣成的BaseResultMap复制⼀份重新定义接收实体类/*** ⽐如这样实体接收中存在默认赋值** @author zhy*/@EqualsAndHashCode(callSuper = true)@Datapublic class WlVo extends Wl {/*** 默认赋值false*/private boolean select = false;}将type改为⾃定义的之后在引⽤<resultMap id="wlBaseResultMap" type="com.yasugongshang.db.vo.WlVo"><id column="id" jdbcType="BIGINT" property="id" /><result column="a" jdbcType="BIGINT" property="a" /></resultMap><resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy⾃动⽣成的BaseResultMap"><collection property="c" resultMap="wlBaseResultMap" columnPrefix="w_"/></resultMap>2.三层嵌套,⼀个list中加另外⼀个list,内list中还存在listdata:[{a:123,b:456,c:[{d:7,e:8,f:[str]}]}]这时候只需要在内层wlBaseResultMap中再增加⼀个collection即可需要注意的是这个时候columnPrefix可能会导致数据为空<resultMap id="wlBaseResultMap" type="com.yasugongshang.db.vo.WlVo"><id column="id" jdbcType="BIGINT" property="id" /><result column="a" jdbcType="BIGINT" property="a" /><collection property="f" ofType="string"><id column="f" jdbcType="VARCHAR"/></collection></resultMap>补充知识:Mybatis中查询返回多个对象使⽤resultType使⽤Map类型代替resultMap查询resultType直接使⽤Type,Dao层返回对象为List嵌套的⼀个Map数据结构List<Map<String,Object>> selectAll();<select id="selectAll" resultType="Map">//查询语句</select>其中Map的key值为查询的属性,Object为查询的值.注:使⽤map类型⽆法转换成驼峰命名,建议还是使⽤resultMap类型以上这篇mybatis多层嵌套resultMap及返回⾃定义参数详解就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

Mybatis之@ResultMap,@Results,@Result注解的使用

Mybatis之@ResultMap,@Results,@Result注解的使用

Mybatis之@ResultMap,@Results,@Result注解的使⽤⽬录Mybatis注解@Results、@Result、@ResultMap问题⽅法⼀⽅法⼆mybatis注释使⽤resultMap对应的注释,及对应注解Results、Result、One、Many的使⽤1.@Results注解2.@Resutl注解3.@One注解(⼀对⼀)4.@Many注解(多对⼀)Mybatis注解@Results、@Result、@ResultMap问题在使⽤mybatis时发现,mybatis能⾃动匹配实体名和数据库字段名相同的字段。

当有实体名与数据库的字段名不同时该如何解决??数据库的表对应的列名:springboot项⽬中建的实体类为:public class MapModel {private Long key;private String value;//省略getter、setter⽅法}⽅法⼀给查询字段另起名对应实体类的名称:@Select("SELECT province_id as key , province_name as value FROM `j_position`")public List<MapModel> provinceName();⽅法⼆使⽤@Results、@Result、@ResultMap注解:@Select("SELECT province_id, province_name FROM `j_position`")@Results(id="resultMap1" ,value = {@Result(property = "key",column = "province_id"),@Result(property = "value",column ="province_name")})public List<MapModel> provinceName();其中定义的id="resultMap1"可以使⽤@ResultMap("resultMap1)@Select("SELECT province_id, province_name FROM `j_position` where province_name=#{name}")public List<MapModel> provinceName(String name);推荐使⽤⽅法⼆!mybatis注释使⽤resultMap对应的注释,及对应注解Results、Result、One、Many的使⽤有⼀部分建⽴在我上⼀个博客,mybatis注释使⽤(单表查询),如果那⾥看不懂了,建议看下我上⼀个博客(⾥⾯所有的配置⽂件,接⼝,数据库的创建都有说明)<resultMap>对应的注解:1.@Results注解代替的是标签<resultMap >该注解中可以使⽤单个@Result注解,也可以使⽤@Result集合@Results({@Result(),@Result()})或@Results(@Result())注意:使⽤注解是若报出org.apache.ibatis.binding.BindingException:Invalid bound statement (not found):接⼝全类名.⽅法名可能是使⽤@Results注解时忘记使⽤@Select注解2.@Resutl注解代替了 <id>标签和<result>标签@Result 中属性介绍:column数据库的列名Property需要装配的属性名one需要使⽤的@One注解(@Result(one=@One)()))many需要使⽤的@Many注解(@Result(many=@many)()))3.@One注解(⼀对⼀)代替了<assocation>标签,是多表查询的关键,在注解中⽤来指定⼦查询返回单⼀对象。

myBatis查询结果显示多表内的字段——通过resultMap映射自定义结果

myBatis查询结果显示多表内的字段——通过resultMap映射自定义结果

myBatis查询结果显⽰多表内的字段——通过resultMap映射⾃定义结果问:查询完成后,结果列只能展⽰单表内的字段,⽐如⽤户表表中只记录⾓⾊编号,没有⾓⾊名称。

结果列要如何展⽰在另⼀个表内的字段——⾓⾊名称呢?答:通过resultMap映射⾃定义结果显⽰该字段。

1.resultMap的节点与属性值 id属性:唯⼀标识,次id值⽤于select元素resultMap属性的引⽤ type属性:表⽰该resultMap的映射结果类型,⼀般来说resultMap的type与select节点中的parameterType类型⼀致 result⼦节点:⽤于表⽰⼀些简单的属性 (1)column属性:表⽰从数据库中查询的字段名 (2)property:表⽰查询出来的字段对应的值赋给实体对象的哪个属性2.使⽤⽅法 (1)SQL映射⽂件<select id="getUserListByUser" parameterType="User" resultMap="userAndRole">select u.*,r.roleNamefrom smbms_user u,smbms_role rwhere erRole = r.idand userName like concat('%',#{userName},'%')and userRole = #{userRole}</select><resultMap type="User" id="userAndRole"><result property="userRole" column="roleName"/></resultMap> (2)UserMapper接⼝public List<User> getUserListByUser(User user); (3)User.javapublic class User {private Integer id; //⽤户编号private String userCode; //⽤户编码private String userName; //⽤户名private String userPassword; //密码private Integer gender; //性别private Date birthday; //⽣⽇private String phone; //电话private String address; //地址private String userRole; //⾓⾊id//配合resultMap显⽰另⼀个表内的字段:⾓⾊名称//添加getter与setter⽅法private String userRoleName; //private Integer createdBy; //创建⼈private Date creationDate; //创建⽇期private Integer modifyBy; //修改⼈private Date modifyDate; //修改⽇期//⽤户对应⾓⾊,可以通过⽤户访问到⾓⾊的所有信息,复杂映射private Role role;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserCode() {return userCode;}public void setUserCode(String userCode) {erCode = userCode;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserPassword() {return userPassword;}public void setUserPassword(String userPassword) {erPassword = userPassword;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getUserRole() {return userRole;}public void setUserRole(String userRole) {erRole = userRole;}public Integer getCreatedBy() {return createdBy;}public void setCreatedBy(Integer createdBy) {this.createdBy = createdBy;}public Date getCreationDate() {return creationDate;}public void setCreationDate(Date creationDate) {this.creationDate = creationDate;}public Integer getModifyBy() {return modifyBy;}public void setModifyBy(Integer modifyBy) {this.modifyBy = modifyBy;}public Date getModifyDate() {return modifyDate;}public void setModifyDate(Date modifyDate) {this.modifyDate = modifyDate;}public String getUserRoleName() {return userRoleName;}public void setUserRoleName(String userRoleName) { erRoleName = userRoleName;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}} (4)UserService.java@Testpublic void testGetUserListByUser(){SqlSession session = null;List<User> userList = null;try {session = MybatisUtil.createSqlSession();User user1 = new User();user1.setUserName("⽤户");user1.setUserRole("1");userList=session.getMapper(UserMapper.class).getUserListByUser(user1);mit();} catch (Exception e) {e.printStackTrace();if (session != null) {session.rollback();}} finally {if (session != null) {session.close();}}for(User user : userList){log.debug("user =====> "+user.getUserName()+"\t"+user.getUserRoleName());}}3.步骤总结 (1)⾸先在User类加⼊userRoleName属性,加⼊该属性的getter与setter⽅法 (2)修改UserMapper接⼝中的对应查询⽅法 (3)修改UserMapper.xml中<select>中的resultType属性为resultMap,注意其值为resultMap节点的id属性值 (4)注意resultMap中的property属性值与column属性值 (5)若要使⽤⾃动映射,则实体对象的属性名要与数据库字段名⼀致,否则就⾃定义结果映射(如本例)。

mybatis中resultmap的association 用法

mybatis中resultmap的association 用法

mybatis中resultmap的association用法在MyBatis中,`<resultMap>`元素用于配置结果映射规则,`<association>`元素是其中的一部分,用于处理关联关系,即在一个对象中包含另一个对象的情况。

以下是`<association>`的用法示例:假设有两个实体类:`Author`和`Book`,其中`Author`包含一个`List<Book>`类型的属性表示作者写的书籍。

###1.数据库表设计:```sqlCREATE TABLE author(id INT PRIMARY KEY,name VARCHAR(255));CREATE TABLE book(id INT PRIMARY KEY,title VARCHAR(255),author_id INT,FOREIGN KEY(author_id)REFERENCES author(id));```###2.Java实体类:```javapublic class Author{private int id;private String name;private List<Book>books;//省略getter和setter}public class Book{private int id;private String title;//省略getter和setter}```###3.MyBatis XML配置:```xml<resultMap id="authorResultMap"type="Author"><id property="id"column="id"/><result property="name"column="name"/><!--使用<association>处理关联关系--><association property="books"javaType="List"resultMap="bookResultMap"/> </resultMap><resultMap id="bookResultMap"type="Book"><id property="id"column="id"/><result property="title"column="title"/></resultMap><select id="selectAuthorWithBooks"resultMap="authorResultMap">SELECTauthor.id,,book.id AS book_id,book.titleFROMauthorLEFT JOINbook ON author.id=book.author_idWHEREauthor.id=#{id}</select>```在上述示例中,`<association>`元素用于处理`Author`实体类中的`books`属性,指定了关联的`resultMap`为`bookResultMap`,表示将查询的结果映射为`List<Book>`。

resultmap的用法

resultmap的用法

ResultMap是MyBatis框架中的一个重要元素,用于将查询结果映射到Java对象中。

它能够自动将数据库表中的数据映射到Java对象,无需手动封装数据。

在MyBatis中,ResultMap的用法如下:1. 在Mapper.xml文件中定义ResultMap,用于描述结果集的映射规则。

通常会定义一个ResultMap的id,以及与该ResultMap相关的SQL查询语句。

2. 在Java代码中使用ResultMap,通过MyBatis的SqlSession对象获取ResultMap的实例,然后调用其方法将查询结果映射到Java 对象。

具体来说,ResultMap的用法包括以下几个方面:1. 定义ResultMap:在Mapper.xml文件中,使用<resultMap>标签定义ResultMap,指定结果集的映射规则。

例如,可以使用<result>标签指定列名和Java对象属性之间的映射关系。

2. 配置SQL查询语句:在<resultMap>标签中,使用<select>标签配置相关的SQL查询语句。

这个查询语句应该与ResultMap的id 相关联,以便MyBatis能够正确地执行查询操作。

3. 获取ResultMap实例:在Java代码中,使用SqlSession对象获取ResultMap的实例。

例如,可以使用SqlSession的getMapper()方法获取Mapper接口的实例,然后调用该实例的相应方法获取ResultMap的实例。

4. 将查询结果映射到Java对象:在Java代码中,使用ResultMap 的实例将查询结果映射到Java对象。

例如,可以使用ResultMap的selectOne()方法执行查询操作,并将查询结果映射到Java对象中。

总之,ResultMap是MyBatis框架中一个重要的元素,能够将数据库表中的数据自动映射到Java对象中,无需手动封装数据。

resultmap的作用和语法

resultmap的作用和语法

resultmap的作用和语法
resultmap是MyBatis框架中的一个重要的元素,它用于映射查询结果到Java对象中,从而使开发人员可以更方便地操作数据。

使用resultmap可以避免手动编写大量的转换代码,同时也可以提高代码的可读性和可维护性。

resultmap的语法比较简单,主要是通过定义不同的映射规则来实现数据的转换。

在定义resultmap时,需要指定一个唯一的标识符和映射的Java对象类型,然后通过定义不同的<result>节点来指定每个属性的映射规则。

在<result>节点中,可以指定属性名称、列名称、Java类型、JDBC类型等信息,以便确保数据能够正确地转换。

除了<result>节点之外,resultmap还支持<id>节点、
<association>节点、<collection>节点等,这些节点可以用来定义主键映射、关联对象映射、集合对象映射等,从而实现更复杂的数据处理。

在使用resultmap时,还可以通过<constructor>节点来指定对象的构造函数以及参数的映射规则,从而更灵活地实现数据转换。

总之,resultmap是MyBatis框架中非常重要的一个元素,它可以帮助开发人员更方便地操作数据,提高代码的可读性和可维护性。

掌握resultmap的语法和应用技巧,对于MyBatis开发人员来说是非常必要的。

- 1 -。

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

本篇文章通过一个实际工作中遇到的例子开始吧:工程使用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 的属性都会被加载了。

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

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

比如:。

相关文档
最新文档