广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis使用resultMap如何解决列名和属性名不一致
  • 690
分享到

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

2024-04-02 19:04:59 690人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

使用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为表的列名

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

--结束END--

本文标题: MyBatis使用resultMap如何解决列名和属性名不一致

本文链接: https://www.lsjlt.com/news/163080.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作