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表:

MyBatis使用resultMap如何解决列名和属性名不一致_第1张图片

Order对象:

MyBatis使用resultMap如何解决列名和属性名不一致_第2张图片

OrderMapper.xml配置

其中注释掉了另一种使用数据库别名解决列名和属性名不一致的问题



	
	
	
	
	
		
		
		
		
		
		
		
		
		

	
	

单元测试

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 orders = orderMapper.queryAll();
			System.out.println(orders);
		}
	}

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

问题

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

现有实体类Order:

这里写图片描述

数据库表orders:

这里写图片描述

解决方案一

    

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

解决方案二

    
    
        
        
    
    
    
  • resultMap中,id标签专门为主键服务,当然,全部都用result
  • property为实体类属性
  • column为表的列名

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

你可能感兴趣的:(MyBatis使用resultMap如何解决列名和属性名不一致)