对象关系映射

Mybatis-利用resultMap 输出复杂pojo

∥☆過路亽.° 提交于 2019-12-01 23:23:54
个:复杂的sql语句查询的数据集的字段和 pojo的字段不相同,需要用到resultMap做一个对应。 ---------------- mybatis 中使用 resultMap 完成高级输出结果映射。 1.1.1 resultMap 使用方法 如果查询出来的列名和 pojo 的属性名不一致,通过定义一个 resultMap 对列名和 pojo 属性名之间作一个映射关系。 1 、定义 resultMap 2 、使用 resultMap 作为 statement 的输出映射类型 1.1.2 将下边的 sql 使用 User 完成映射 SELECT id id_,username username_ FROM USER WHERE id=#{value} User 类中属性名和上边查询列名不一致。 ================== 1.1 resultMap resultType 可以指定 pojo 将查询结果映射为 pojo ,但需要 pojo 的属性名和 sql 查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap 实质上还需要将查询结果映射到 pojo 对象中。 resultMap 可以实现将查询结果映射为复杂类型的 pojo ,比如在查询结果映射对象中包括 pojo 和

Mybatis映射器之ResultMap解析

我是研究僧i 提交于 2019-12-01 23:21:50
Mybatis映射器之ResultMap解析 在 Mybatis映射器之select解析 这篇文章最后我们只是简单的介绍了一下ResultMap的使用,而ResultMap功能非常多,他也包含了很多子元素,本篇我们将详细的介绍下。 1. Result Maps概述 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。 你已经见过简单映射语句的示例了,但没有明确的 resultMap。比如: < select id= "selectUsers" resultType= "map" > select id, username, hashedPassword from some_table where id = #{id} </ select > 上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。你的程序更可能会使用

Mybatis中输出映射resultType与resultMap的区别

纵然是瞬间 提交于 2019-12-01 23:08:15
一、resultType 使用resultType进行输出映射,只有查询出来的列名和pojo(实体bean)中的属性名一致,该列才可以映射成功。 如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。 不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。 在mapper.java指定的方法返回值类型不一样: 1).输出单个pojo对象,方法返回值是单个对象类型 2).输出pojo对象list,方法返回值是List 输出pojo对象可以改用HashMap输出类型,将输出的字段名称作为map的key,value为字段值。如果是集合,那就是list里面套了HashMap。 二、.resultMap 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。 总结: 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。 来源: CSDN 作者: ∈best 链接: https://blog.csdn

mybatis中映射文件的resultType和resultMap

时间秒杀一切 提交于 2019-12-01 23:06:45
最近项目中要用到mybatis,在google上当了个案例看了下。加入连接数据库等配置。由于实体对象属性太多,测试案例中没有一一完全写出来。 在对象的映射文件中 <select id="getMotoTransLogList" resultMap="MotoTransLogList"> SELECT * FROM MOTO_TRANS_LOG </select> 参考案例中resultMap这里为resultType。结果页面上读取不到数据,开始没考虑到数据库查询结果返回和实体对象的映射关系。问题最终解决为从新定义一个resultMap,列出我需要的字段和对象属性。 在使用mybatis通过id查询时mybatis自动映射数据库字段和实体类,当数据库字段与实体类的属性不一致时,mybatis就不能映射了,那么可以通过下面的配置映射: 配置一个返回的Map: <!-- 当实体类属性跟数据库字段不一致时映射结果集 --> <resultMap type="Person" id="result_person"> <result property="name" column="t_name"/> </resultMap> 查询的时候resultType改为resultMap <select id="selectOne" parameterType="int" resultMap=

ResultMap与ResultSet

守給你的承諾、 提交于 2019-12-01 23:01:58
MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。 在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程。 从SQL查询结果到领域模型实体  通过JDBC查询得到ResultSet对象 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值 根据ResultMap标签的type属性通过反射实例化领域模型 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回 一、resultMap 1、属性说明 id属性 ,resultMap标签的标识。 type属性 ,返回值的全限定类名,或类型别名。 autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法。 2、基本作用:建立SQL查询结果字段与实体属性的映射关系 示例1

深入了解MyBatis返回值

半城伤御伤魂 提交于 2019-12-01 23:00:49
深入了解MyBatis返回值 想了解返回值,我们需要了解 resultType , resultMap 以及接口方法中定义的返回值。 我们先看 resultType 和 resultMap resultType和resultMap 大家应该都知道在MyBatis的 <select> 标签中有两种设置返回值的方式,分别是 resultMap 和 resultType 。 处理 resultMap 和 resultType 的代码如下: private void setStatementResultMap ( String resultMap, Class<?> resultType, ResultSetType resultSetType, MappedStatement.Builder statementBuilder) { resultMap = applyCurrentNamespace(resultMap, true ); List<ResultMap> resultMaps = new ArrayList<ResultMap>(); if (resultMap != null ) { String[] resultMapNames = resultMap.split( "," ); for (String resultMapName : resultMapNames) {

[笔记]SSM映射关系之resultMap和resultType

戏子无情 提交于 2019-12-01 23:00:11
博主对SSM的复杂映射关系一直以来都不怎么熟练,所以今天仔细梳理一遍。 resultType和resultMap 用resultType来接收结果的前提是你必须要有一个pojo类。而且pojo中必须包括所有查询出的列名才行。 创建pojo的原则是继承包括查询字段较多的po类。 关于pojo的类别经常使用别名来简化开 <package name="包名"/> 如果进行了上面这样设置,那么所有放在该包下的pojo都可以不用定义了,直接使用类名就可以了 resultMap可以实现延迟加载,resultType无法实现延迟加载。另外牵涉到了association。 association用于映射关联查询单个对象的信息 <collection> 是用来处理一对多映射的标签 多对多参照模板,主要是思路要清晰。 <resultMap type="mybatis.po.User" id="UserAndItemsResultMap"> <!-- 用户信息 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <

ResultType和ResultMap的区别

久未见 提交于 2019-12-01 22:38:23
ResultType和ResultMap都是执行查询语句时返回的结果集 ResultType ResultType相对与ResultMap而言更简单一点。只有满足ORM(Object Relational Mapping,对象关系映射)时,即数据库表中的字段名和实体类中的属性完全一致时,才能使用,否则会出现数据不显示的情况。如图所示,由于实体类Order的属性和表tb_order的字段不一致,导致页面数据不显示。 Order表 映射文件 数据库表的字段 浏览器页面 ResultMap ResultMap和ResultType的功能类似,但是ResultMap更强大一点,ResultMap可以实现将查询结果映射为复杂类型的pojo。 如上图的ResultType显示的结果,用ResultMap就可以解决。 映射文件 浏览器页面 说明: ResultMap标签的id属性是唯一的,和select标签的resultMap一致。 type属性是pojo(普通的JavaBean对象)的包名加类名,用来封装信息。如果mybatis里面配置了别名包,也就是给包起别名,那么type里面直接写类名就可以了。 mybatis配置文件 ResultMap中的id标签是用来描述表中的主键的对应关系,column用来描述数据库表中的主键字段名,property用来描述pojo中的属性名。

mybaties中resultMap和resultType的区别

被刻印的时光 ゝ 提交于 2019-12-01 22:38:07
总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。下面介绍几个常用的映射关系: 单表查询: resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。 订单查询关联用户的resultMap 将整个查询的结果映射到cn.itcast.mybatis.po.Orders中 <resultMap type="cn.itcast.mybatis.po.Orders" id=

hibernate中关于bag映射(转载)

天大地大妈咪最大 提交于 2019-12-01 19:45:15
Bag是一个java集合存储元素无需关心顺序,但允许列表中的重复元素。Bag是在列表中的对象的随机分组。 Collection集合被映射在该映射表中的<bag>元件和与java.util.ArrayList中初始化。 定义RDBMS表: 考虑一个情况,我们需要员工记录存储在EMPLOYEE表,将有以下结构: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id)); 此外,假设每个员工都可以有一个或多个与他/她相关的证书。我们将存储证书的相关信息在一个单独的表,该表具有以下结构: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id)); 将有一个对多(one-to-many)在EMPLOYEE和证书对象之间。 定义POJO类: