MyBatis使用resultMap如何解决列名和属性名不一致
作者:蓝海晴川
这篇文章主要介绍了MyBatis使用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标签专门为主键服务,当然,全部都用resultproperty
为实体类属性column
为表的列名
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。