MyBatis使用resultMap如何解决列名和属性名不一致

目录
  • 使用resultMap如何解决列名和属性名不一致
    • OrderMapper.xml配置
    • 单元测试
  • 实体属性名与表字段名不匹配问题
    • 问题
    • 解决方案一
    • 解决方案二

使用resultMap如何解决列名和属性名不一致

resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

需求:查询订单表orders的所有数据

SELECT id,user_id,number,createtime,note FROM orders,这里的数据库表user_id与pojo的Order对象中的userId不一致

orders表:

Order对象:

OrderMapper.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.sea.crm.mapper.OrderMapper">
	<!-- 使用as 给列取别名解决类名和属性名不一致的情况 -->
	<!--<select id="queryAll" resultType="Order"> SELECT id,user_id as userId,number,createtime,note
		FROM orders </select> -->
	<!-- 使用resultMap解决列名和属性名不一致的情况 -->
	<!-- 配置一个resultMap映射列和属性 -->
	<resultMap type="Order" id="orderMap">
		<!-- id:设置ResultMap的id -->
		<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
		<!-- property:主键在pojo中的属性名 -->
		<!-- column:主键在数据库中的列名 -->
		<id column="id" property="id" />
		<!-- 映射其他普通列 -->
		<result column="user_id" property="userId" />
		<result property="number" column="number" />
		<result property="createtime" column="createtime" />
</resultMap>
	<!-- 方法的返回值可以使用 -->
	<select id="queryAll" resultMap="orderMap">
		SELECT id,user_id ,number,createtime,note FROM orders
	</select>
</mapper>

单元测试

public class OrderMapperTest {

		SqlSessionFactory factory = null;
		private OrderMapper orderMapper = null;
		@Before
		public void testInit() {
			// 1. 创建SqlSessionFactoryBuilder对象
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			// 2. 加载SqlMapConfig.xml配置文件
			// /20181013_mybatis/config/SqlMapConfig.xml
			InputStream in = MyBatisTest.class.getResourceAsStream("/SqlMapConfig.xml");
			// 3. 创建SqlSessionFactory对象
			factory = builder.build(in);
		}
        @Test
		public void testqueryAll() {
			SqlSession session = factory.openSession();
			OrderMapper orderMapper = session.getMapper(OrderMapper.class);
			List<Order> orders = orderMapper.queryAll();
			System.out.println(orders);
		}
	}

实体属性名与表字段名不匹配问题

问题

    <select id="getUser" parameterType="String"
        resultType="User">
        select * from user where username=#{username}
    </select>
  • 这是映射文件的配置,myBatis在查询出结果之后,会帮我们把查询结果一一对应地填充到User对象中
  • 但是,它怎么知道如何去对应查询出来的字段和属性呢?只有在实体的属性名和表的字段名相同时,才能自动一一对应。
  • 那么,如果属性名和表的字段名不一样怎么办?有两种解决方案

现有实体类Order:

数据库表orders:

解决方案一

    <select id="getOrder" parameterType="int"
        resultType="Order">
        select order_id  id,order_name orderName from orders where order_id=#{id}
    </select>

查询的时候使用别名,就可以解决

解决方案二

    <!-- 配置一个映射关系 -->
    <resultMap type="Order" id="orderResultMap">
        <id property="id" column="order_id"/>
        <result property="orderName" column="order_name"/>
    </resultMap>
    <!-- 查询结果集引用配好的映射关系 -->
    <select id="getOrder" parameterType="int"
        resultMap="orderResultMap">
        select order_id ,order_name from orders where order_id=#{id}
    </select>
  • resultMap中,id标签专门为主键服务,当然,全部都用result
  • property为实体类属性
  • column为表的列名

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决MyBatis中为类配置别名,列名与属性名不对应的问题

    在传参与接收返回结果的时候,咱们一直是使用的全限定名.但是MyBatis自己在使用很多类型的时候(如Integer,Boolean)却可以直接使用别名.那么,咱们自己的写的类能不能使用别名呢?可以.需要配置. mybatis配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//

  • Mybatis中ResultMap解决属性名和数据库字段名不一致问题

    目录 前言 1. 字段名不一致 解决方法: 第一种方式: 起别名 第二种方式: 结果集映射 resultMap 2. 多对一处理 3. 一对多处理 小结 前言 我们Pojo类的属性名和数据库中的字段名不一致的现象时有发生,简单的情况我们可以开启驼峰命名法解决大小写问题,但是遇到其它非大小写问题,我们就不得不使用Mybatis中的结果集映射resultMap. 1. 字段名不一致 数据库中的字段 我们项目中实体类的字段 public class User { private int id; pri

  • Mybatis中强大的resultMap功能介绍

    前言 在Mybatis中,有一个强大的功能元素resultMap.当我们希望将JDBC ResultSets中的数据,转化为合理的Java对象时,你就能感受到它的非凡之处.正如其官方所述的那样: resultMap元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长

  • MyBatis使用resultMap如何解决列名和属性名不一致

    目录 使用resultMap如何解决列名和属性名不一致 OrderMapper.xml配置 单元测试 实体属性名与表字段名不匹配问题 问题 解决方案一 解决方案二 使用resultMap如何解决列名和属性名不一致 resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中. 需

  • mybatis 解决从列名到属性名的自动映射失败问题

    问题背景 从数据库中取出数据映射到实体类时,实体类中只有部分属性映射成功,其余属性值皆为null. 问题描述 如下图AreaDao.xml文件中描述了queryArea()方法从数据库获取Area对象的各个属性值的查询过程,最后执行查询结果显示只有属性priority被成功地赋值 AreaDao.xml <select id="queryArea" resultType="com.imooc.wechatpro.model.Area"> SELECT a

  • Mybatis中resultMap的Colum和property属性详解

    目录 resultMap的Colum和property属性 1: resultMap标签 2:使用情况 2.1 简单查询 2.2 一对一 2.3 一对多 resultMap对column和property的理解 select元素有很多属性(这里说用的比较多的) 什么时候我们知道使用resultMap,什么时候又使用resultType呢? 最后说下 resultMap的Colum和property属性 1: resultMap标签 当我们的数据库字段与实体类的属性不一致时,就需要使用该标签进行一

  • MyBatis中resultMap和resultType的区别详解

    总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功.(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系.(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些

  • MyBatis元素resultMap介绍及使用详解

    1.resultMap resultMap 元素是 MyBatis 中最重要最强大的元素. 解决类属性名和数据库中表字段名不一致问题 ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了. 具体效果sql查出来的结果,其中数据库表字段名和类属性名不一致的时候,此属性值为null 解决方式: 方式1:对sql中某个字段在操作的时候起别名,来跟类的属性名一致 方式2:resultMap,将类属性映射到表字段 <!--结果集映射--> <

  • 解决@RequestBody部分属性丢失的问题

    目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现 postman接口请求展示 结论 springboot @RequestBody注入属性为空 对象属性为 我的解决办法 @RequestBody部分属性丢失 问题描述 JavaBean实现 public class VerifyNewFriendApplyReq implements Serializable { /** * 申请ID */ private Long applyId; /** *

  • MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题

    在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突问题,感兴趣的朋友一起学习吧. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, or

  • MyBatis查询时属性名和字段名不一致问题的解决方法

    问题 当我们数据库中的字段和实体类中的字段不一致的时候,查询会出问题 数据库字段是 pwd id name pwd 1 张三 123456 2 李四 123456 3 王五 123456 4 赵六 123456 实体类字段是 password public class User { private int id; private String name; private String password; } 查出来结果发现, password 是 null User{id=1, name='张三

随机推荐