精华内容
下载资源
问答
  • resultMap用法以及关联结果集映射

    万次阅读 多人点赞 2018-08-05 11:05:48
    如果sql查询到字段pojo属性名不一致,则需要使用resultMap将字段名属性名对应起来,进行手动配置封装,将结果映射到pojo中 resultMap resultMap可以实现将查询结果映射为复杂类型pojo,比如在查询结果...

    resultType

    resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。
    如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中

    resultMap

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

    先在Mapper文件中,配置基本的sql语句

    <!-- 查询所有的订单数据 -->
        <!-- resultMap:填入配置的resultMap标签的id值 -->
        <select id="queryOrderAll" resultMap="orderResultMap">
            SELECT id, user_id,
            number,
            createtime, note FROM `order`
        </select>

    配置resultMap标签,映射不同的字段和属性名

    <!-- 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>

    结果就可以封装到pojo类型中

    使用resultMap进行关联查询

    一对一查询

    一对一数据模型:订单用户
    一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
    这里写图片描述

    • 改造pojo类
      在订单类中添加User属性,User属性是一个引用类型,用于存储关联查询的用户信息,因为关联关系是一对一,所以只需要添加单个属性即可
      这里写图片描述

    • 配置Mapper.xml配置文件
      OrderMapper.xml
      先使用id和result属性,映射order类的结果集,然后在使用association映射关联对象User的结果集

    <resultMap type="order" id="orderUserResultMap">
        <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" />
    
        <!-- association :配置一对一属性 -->
        <!-- property:order里面的User属性名 -->
            <!-- javaType:属性类型 -->
        <association property="user" javaType="user">
            <!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
            <id property="id" column="user_id" />
            <result property="username" column="username" />
            <result property="address" column="address" />
        </association>
    
    </resultMap>
    
    <!-- 一对一关联,查询订单,订单内部包含用户属性 -->
    <select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
        SELECT
        o.id,
        o.user_id,
        o.number,
        o.createtime,
        o.note,
        u.username,
        u.address
        FROM
        `order` o
        LEFT JOIN `user` u ON o.user_id = u.id
    </select>
    • 测试
    @Test
    public void testQueryOrderUserResultMap() {
        // mybatis和spring整合,整合之后,交给spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 创建Mapper接口的动态代理对象,整合之后,交给spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
        // 使用userMapper执行根据条件查询用户,结果封装到Order类中
        List<Order> list = userMapper.queryOrderUserResultMap();
        for (Order o : list) {
            System.out.println(o);
        }
        // mybatis和spring整合,整合之后,交给spring管理
        sqlSession.close();
    }
    • 结果
      这里写图片描述
    一对多查询

    查询所有用户信息及相关订单。

    • 修改pojo类,在pojo类添加订单集合属性
      这里写图片描述

    • 修改UserMapper.xml配置文件
      先使用id和result配置映射User类的结果,然后使用一对多关系的collection标签配置Order结果

    <resultMap type="user" id="userOrderResultMap">
        <id property="id" column="id" />
        <result property="username" column="username" />
        <result property="birthday" column="birthday" />
        <result property="sex" column="sex" />
        <result property="address" column="address" />
    
        <!-- 配置一对多的关系
            property:填写pojo类中集合类类属性的名称
            javaType:填写集合类型的名称 
        -->
        <collection property="orders" javaType="list" ofType="order">
            <!-- 配置主键,是关联Order的唯一标识 -->
            <id property="id" column="oid" />
            <result property="number" column="number" />
            <result property="createtime" column="createtime" />
            <result property="note" column="note" />
        </collection>
    </resultMap>
    
    <!-- 一对多关联,查询订单同时查询该用户下的订单 -->
    <select id="queryUserOrder" resultMap="userOrderResultMap">
        SELECT
        u.id,
        u.username,
        u.birthday,
        u.sex,
        u.address,
        o.id oid,
        o.number,
        o.createtime,
        o.note
        FROM
        `user` u
        LEFT JOIN `order` o ON u.id = o.user_id
    </select>
    • 测试结果
      这里写图片描述
    展开全文
  • 对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型数据模型在关系数据库中不匹配问题。 Dapper是由Stack OverFlow团队开发开源,轻量级ORM.相比于其他ORM框架,Dapper速度非常快。 ...
  • 解决数据库的结果集对象与javaBean中的属性名不匹配问题 第一种:可以通过数据库sql语句的 as 为查询结果重新起列名 第二种:查询官方的文档,采用resultMap标签替换resultType标签 在mybatis中的映射文件中进行...

    解决数据库的结果集对象与javaBean中的属性名不匹配问题
    第一种:可以通过数据库sql语句的 as 为查询结果重新起列名
    第二种:查询官方的文档,采用resultMap标签替换resultType标签
    在这里插入图片描述
    在mybatis中的映射文件中进行如下配置

        <!--
           亟待解决的问题:结果集(表)中的列名和对象中的属性名称不匹配
           解决方案:使用resultMap元素
           resultMap元素:结果集对象的映射
            id 属性: 当前Mapper文件中的resulyMap的唯一名称
            type属性: 把结果集中的每一行数据封装成什么类型的对象
    
            子元素:
            id元素:功能和result一模一样,如果是主键建议使用id元素,提升性能
            result元素:匹配对象中的哪一个属性对应表中的哪一个列
    
    
        -->
    
        <resultMap id="BaseResultMap" type="User">
    
            <!--此处数据库的值与User中的一样,所以我吧coiumn 与property的值写一样-->
            <!--实际使用中可以去修改数据库列名,然后修改coiumn的值与修改的数据库列名相同-->
            <result column="id" property="id"></result>
            <result column="name" property="name"></result>
            <result column="salary" property="salary"></result>
        </resultMap>
    

    调用resultMap标签

       <select id="listAll"  resultMap="BaseResultMap">
            SELECT  id,name,salary FROM t_User
        </select>
    
    展开全文
  • 008MyBatis结果集映射

    2020-07-27 16:57:57
    数据库查询结果集有三种映射方式: 1、ResultMap结果集映射; 2、构造器映射; 3、自动映射; 1、ResultMap结果集映射 1.1Mapper.xml中: 利用resultMap元素配置,必须为resultMap元素指定idtype属性 id属性作用:...

    数据库查询结果集有三种映射方式:
    1、ResultMap结果集映射;
    2、构造器映射;
    3、自动映射;

    1、ResultMap结果集映射

    1.1Mapper.xml中:

    利用resultMap元素配置,必须为resultMap元素指定id和type属性
    id属性作用:与sql语句连接
    type属性作用:指定结果集映射对象

    resultMap一般有两个子元素
    id子元素:定义对象的标识属性
    result子元素:定义对象的一般属性
    他们俩都有如下属性
    *column:指定列名(数据库中)
    *property:指定对应的属性名(Java程序中)

    javaType:指定java类型,一般无需指定,MyBatis会自动推断
    jdbcType:指定数据列的jdbc类型,一般无需指定,MyBatis会自动推断
    typeHandler:类型处理器,一般无需指定,MyBatis内置了大量的类型吃利器,自定类型处理器可能需要指定(也可以在mybatis-config.xml中指定)

        <resultMap id="rm" type="User">
            <id column="uesr_id" property="userId" />
            <result column="user_age" property="userAge" />
            <result column="user_name" property="userName"/>
            <result column="user_datetime" property="userDate" />
        </resultMap>
    

    1.2注解中:

    原理差不多,需要注意的是定义对象的标识属性的方式,是在@Result中指定id=true。

     @Select("select * from user where user_id between #{s} and #{e} ")
    	//注意注解名是 @Results不是ResultMap
       @Results({
         @Result(column = "user_id",property = "userId",id = true),
         @Result(column = "user_name",property = "userName"),
         @Result(column = "user_datetime",property = "userDate"),
         @Result(column = "user_age",property = "userAge")
         HashSet<User> queryUser2(@Param("s") int startId, @Param("e") int endId);
       })
    

    在xml配置中的id和result元素有的属性,@Result注解中都有,除此之外,@Result额外有one和many两个属性,关联映射中会用到,这里不展开。

    2、构造器映射:

    如果结果集封装对象中有无参的构造器,那么会默认调用这个无参构造器创建对象,然后通过set,get方法对对象的属性进行操作(所以如果写了有参数的构造器,一定要记得写无参数的构造器,否则很有可能会报错:可以看这篇文章:MyBatis数据库列名和封装结果集对象的属性名不同名并且没有配置结果集映射也能正确完成数据库和结果集对象之间的映射)。
    除此之外,我们也可以指定用哪个构造器创建结果集映射对象,而且可以利用这个来进行结果集映射,而不用一一地用列名和属性名进行对应。

    2.1Mapper.xml中:

    利用resultMap的子元素constructor元素:
    在constructor下有两个子元素:idArg,arg
    他们俩都有如下属性
    column
    javaType:构造器参数对应的java类型
    jdbcType
    typeHadler
    name:指定构造器参数名
    select:引用另一个select元素的id,后面再介绍关联映射的时候回想详细介绍
    resultMap:引用另一个resultMap元素的id,后面再介绍关联映射的时候回想详细介绍

    <resultMap id="rm" type="User">
            <constructor>
                <idArg column="user_id" javaType="int"/>
                <arg column="user_name" javaType="String"/>
            </constructor>
            <result column="user_age" property="userAge" />
            <result column="user_datetime" property="userDate" />
        </resultMap>
    

    当然,因为没有指定name属性,所以这些数据与构造器关联的方式是按顺的,也就是构造器参数顺序必须与constructor元素中idArg /arg 的顺序对应。
    如果需要使用name指定构造器参数,那么必须为构造器参数指定@Param注解或者用java8的-parameters进行编译,否则java不会记住方法参数。

    2.2注解中:

    原理差不多,需要注意的是定义对象的标识属性的方式,是在@ConstructorArgs中指定id=true。另外javaType不是字符串而是指定class

     @Select("select * from user where user_id between #{s} and #{e} ")
       @ConstructorArgs({
               @Arg(column="user_name",name = "name",javaType=String.class),
               @Arg(column="user_id",name = "id",javaType=Integer.class,id = true)
       })
       @Results({
               @Result(column = "user_age",property = "userAge"),
               @Result(column = "user_datetime",property = "userDate")
       })
       HashSet<User> queryUser2(@Param("s") int startId, @Param("e") int endId);
    

    当然xml能指定的属性,注解中都可

    3、自动映射(同名映射/驼峰映射)

    MyBatis支持三种自动映射策略:
    NONE:不使用自动映射
    PARTIAL:部分自动映射,只自动映射没有定义嵌套结果集的结果集。(默认)
    FULL:完全自动映射。
    在配置xml文件中的setting的autoMappingBehavior配置,一般无需更改。

        <settings>
            <setting name="autoMappingBehavior" value="NONE"/>
        </settings>
    

    自动映射规则:若数据库中的列名和java程序中的属性一致那么MyBatis会自动映射。
    当然,MyBatis绝对不止这么聪明,他还能进行驼峰映射,例如:
    数据库列名的 user_id 会自动与java程序属性的 userId进行映射。
    不过这个功能要在mybatis-config.xml中配置。

        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    
    展开全文
  • resultMap结果集映射

    2018-09-06 18:05:00
    resultMap结果集是用来定义sql查询的结果java对象的映射关系。它主要解决2大问题: 1)可以解决POJO属性名表结构的字段名不一致问题(甚至是 不是标准的驼峰命名法) 2)可以完成高级查询,例如:一对一,一对多...

    resultMap结果集是用来定义sql查询的结果与java对象的映射关系。它主要解决2大问题:

    1)可以解决POJO属性名和表结构的字段名不一致问题(甚至是 不是标准的驼峰命名法)

    2)可以完成高级查询,例如:一对一,一对多,多对多

    其中还有一个比较重要的属性:autoMapping自动映射  默认为true。

    注意:1.如果true,并且列名称和字段名称一致,是可以完成映射。

              2.如果为true,名称不一致,但是符合驼峰命名,但必须开启驼峰命名匹配。

    下面简单介绍一个案列:

    接口:UserMapper.java

    package com.inter;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Param;
    
    import com.pojo.User;
    
    public interface UserMapper {
        
    //    查询数据
        public List<User> selectAll();
        
    }

    Mybatis配置文件:Mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
        
      <configuration>
          <!-- 加载外部配置文件 -->
          <properties resource="jdbc.properties"></properties>
          
    /* <settings> <!--开启驼峰命名法--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> */
    <!-- 起别名 --> <typeAliases> <typeAlias alias="User" type="com.pojo.User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 指定mapper的配置文件 --> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>

    映射文件:UserMapper.xml

    <?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">
     <mapper namespace="com.inter.UserMapper">
     
        
       <resultMap type="User" id="userResult" autoMapping="true">
               <id property="id" column="id"/>
       </resultMap>
       
       <!-- 查询所有的数据 -->
       <select id="selectAll" resultMap="userResult">
               select * from tb_user
       </select>
       
     </mapper>

    实体类:User.java

    package com.pojo;
    
    public class User {
        private int id;
        private String name;
        private String age;
        private String sex;
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
        }
        
    }

    测试类:

    package com.test;
    
    import static org.junit.Assert.*;
    
    import java.io.InputStream;
    import java.util.List;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.inter.UserMapper;
    import com.pojo.User;
    
    public class TestMybatisoneTest {
    
         private UserMapper userMapper;
        
         InputStream inputStream;
         SqlSessionFactory sqlSessionFactory;
         SqlSession sqlSession;
        
        
        @Before
        public void setUp() throws Exception {
            
                String resource = "mybatis-config.xml";     
                 
                inputStream = Resources.getResourceAsStream(resource);
                 
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                 
                sqlSession = sqlSessionFactory.openSession();
                
    //            动态代理实现
                userMapper = sqlSession.getMapper(UserMapper.class);
        }
    
        @Test
        public void test4(){
           
            List<User> list = userMapper.selectAll();
            for (User user : list) {
                System.out.println(user+"   ");
            }
        }
    }

     

    转载于:https://www.cnblogs.com/lichangyun/p/9600076.html

    展开全文
  • 文章目录11.4.1 高级结果映射查询博客信息SQL复杂对象模型ResultMapresultMap元素子元素说明resultMap元素属性 11.4.1 高级结果映射 在有些时候,项目中需要用一条SQL查询一对多或者多对一的对象时。例如,查询...
  • 同时免除了几乎所有 JDBC 代码以及设置参数获取结果集的工作,并且可以通过简单 XML 或注解来配置和映射原始类型、接口 Java POJO为数据库中记录。今天我们要讨论,就是MyBatis中Mapper接口参数是如何...
  • MyBatis 避免了几乎所有 JDBC 代码手动设置参数以及获取结果集。 MyBatis可以使用简单XML或注解用于配置原始映射,将接口JavaPOJO(Plain Old Java Objects,普通Java对象映射成数据库中记录. ...
  • 相比Hibernate, Mybatis 的结果集映射不局限于PO, Mybatis可以将结果集映射为任意java 对象. 笔者之前博客中, 多次使用resultType, 这里就不赘述了. 这里主要介绍resultType resultMap 适用场景, 以及...
  • ResultMap结果集是用来定义SQL查询结果java对象映射关系,当字段名属性名不一致时候,可以使用resultMap,resultType跟resultMap不能同时存在。 实体类字段如下: public class User { private int ...
  • 如果sql查询到字段pojo属性名不一致,则需要使用resultMap将字段名属性名对应起来,进行手动配置封装,将结果映射到pojo中 resultMap resultMap可以实现将查询结果映射为复杂类型pojo,比如在查询结果...
  • MyBatis 避免了几乎所有 JDBC 代码手动设置参数以及获取结果集。MyBatis 可以使用简单 XML 或注解来配置和映射原生信息,将接口 Java POJOs(Plain Old Java Objects,普通 Java对象)映射成数据库中...
  • MyBatis 免除了几乎所有 JDBC 代码以及设置参数获取结果集的工作。它可以通过简单 XML 或注解来配置和映射原始类型、接口 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中记录。 2、...
  • 一、resultType1:使用resultType...3:只要查询出来列名pojo中属性有一个一致,就会创建pojo对象使用时一般是:输出为简单类型是,查询出来的结果集只有一列,可以使用简单类型进行输出映射;输出为pojo对象...
  • MyBatis 去掉了几乎所有JDBC代码参数手工设置以及对结果集的检索封装。MyBatis可以使用简单XML或注解进行配置原始映射,以将接口JavaPOJO (Plain Old Java Objects,普通Java对象映射成数据库中...
  • ORM 框架相比,既解决了 Java 对象与输入参数和结果集的映射,又能够让用户方便的手写使用 SQL 语句。本文主要介绍了 iBATIS 框架的体系结构运行流程,以及 iBATIS 如何完成 SQL 语句的解析与 Java 对象与数据...
  • myBatis 通过SQL Map将Java对象映射成SQL语句,将结果集再转化成Java对象,与其他ORM框架相比,既解决了Java对象与输入参数和结果集的映射,又能够让用户方便地手写使用SQL语句。  ...
  • SQL映射文件的几个顶级元素 Mapper----namespace 命名空间 namespace和子元素的id联合...resultMap–用来描述数据库的结果集和对象的对应关系 sql–可以重用的SQL块,也可以被其他语句引用 insert–映射插入语句
  • iBATIS 通过 SQL Map 将 Java 对象映射成 SQL 语句结果集再转化成 Java 对象,与其他 ORM 框架相比,既解决了 Java 对象与输入参数和结果集的映射,又能够让用户方便的手写使用 SQL 语句。本文主要介绍了 iBATIS...
  • 深入分析 iBATIS 框架之系统架构与映射原理iBATIS 通过 SQL Map 将 Java 对象映射成 SQL 语句结果集再转化成 Java 对象,与其他 ORM 框架相比,既解决了 Java 对象与输入参数和结果集的映射,又能够让用户方便的...
  • iBATIS 通过 SQL Map 将 Java 对象映射成 SQL 语句结果集再转化成 Java 对象,与其他 ORM 框架相比,既解决了 Java 对象与输入参数和结果集的映射,又能够让用户方便的手写使用 SQL 语句。本文主要介绍了 iBATIS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 766
精华内容 306
关键字:

结果集和对象的映射与对象与对象的映射