MyBatis学习笔记-03.MyBatis中五种成功映射数据库字段与实体类属性不一致的解决方案

在Mybatis中,当根据某字段查询数据库信息时,如果数据库字段名与实体类属性名称不一致,查询时,会出现赋值不上的情况,值为Null。本次将给出五种方案,其中方案三、四为推荐。


例如:根据学号sno查询学生信息

1.数据库表student字段名称以及类型:


2.数据库表内容:


3.实体类:实体类内 学号为s_no  不对应数据库表内 sno


4.测试程序(方案一、二、三、四):


  
  
  1. package com.yuan.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import com.yuan.model.Student;
  10. public class MybatisTest {
  11. public static void main(String[] args) {
  12. SqlSession sqlSession = null;
  13. try {
  14. //1.加载核心配置文件
  15. //路径相对于src下
  16. InputStream is = Resources.getResourceAsStream( "mybatis-config.xml");
  17. //2.创建sqlSession工厂相当于connection
  18. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  19. //3.创建sqlsession 相当于处理语句对象
  20. sqlSession = sqlSessionFactory.openSession();
  21. //4.执行语句获取结果
  22. List<Student> stu = sqlSession.selectList(Student.class.getName()+ ".queryList");
  23. System.out.println(stu);
  24. } catch (IOException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. } finally{
  28. //5.关闭资源
  29. if(sqlSession!= null){
  30. sqlSession.close();
  31. }
  32. }
  33. }
  34. }

方案五的测序程序需将List的泛型从Student,改为Map<String,Object>



解决方案一、采用sql语句 as 别名 的形式:为查询语句的显示列定义别名,让这个别名与实体类的属性名相同完成自动封装

在StudentMapper.xml中(as可省略)



 缺点:

1.如果列数过多会导致语句难以阅读

2.如果查询语句的定义多个,会导致重复代码增多,多次定义显示列增加了工作量

可采用方案三解决此问题

解决方案二、采用实体类set方法名符合对应数据库字段名

在Student.java实体类中,因为Mybatis映射的原理就是通过返回的数据库字段名找实体类的setXxx方法进行对应注入


同样也查询成功


解决方案三、利用XxxMapper.xml的sql标签(同解决方案一原理相同,将方案一提取封装,简化操作)【推荐】

在StudentMapper.xml中


解决方案四、使用resultMap 手动配置一个数据结果的封装规则【推荐】

在StudentMapper.xml中使用resultMap标签:

type 用于指定将数据的返回结果封装到哪个实体类中

id 这个封装规则的唯一标识,用于被查询标签中的resultMap所引用


结果:


resultMap 用于指定某个自定义的封装规则,MyBatis会根据这个自定义的封装规则进行数据封装
优点:这个自定义的封装规则可以被重复使用,省去多次定义别名的问题
缺点:需要额外定义一套封装规则的resultMap

解决方案五、使用resultType属性并指定返回结果为一个map集合(这类方案仅是返回数据库数据,并未将其封装到实体类中)

这时MyBatis会将显示列作为Map即可key显示列对应的值为Map集合的value,将每条记录封装到不同的Map集合中,最后将Map集合添加到List集合中进行返回每一个Map集合对应着一条记录


结果


优点:简单方便快捷
缺点:破坏了ORM的映射关系
文章来源
https://blog.csdn.net/YuanMxy/article/details/79675302
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值