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

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

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

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

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

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

2.数据库表内容:

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

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

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

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

package com.yuan.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.yuan.model.Student;


public class MybatisTest {
	public static void main(String[] args) {
		SqlSession sqlSession = null;
		try {
			//1.加载核心配置文件
			//路径相对于src下
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			//2.创建sqlSession工厂相当于connection
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
			//3.创建sqlsession 相当于处理语句对象
			sqlSession = sqlSessionFactory.openSession();
			//4.执行语句获取结果
			List stu = sqlSession.selectList(Student.class.getName()+".queryList");
			System.out.println(stu);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			//5.关闭资源
			if(sqlSession!=null){
				sqlSession.close();
			}
		}
	}
}

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

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


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

在StudentMapper.xml中(as可省略)

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

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

 缺点:

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

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

可采用方案三解决此问题

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

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

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

同样也查询成功

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

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

在StudentMapper.xml中

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

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

在StudentMapper.xml中使用resultMap标签:

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

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

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

结果:

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

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

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

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

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

结果


优点:简单方便快捷
缺点:破坏了ORM的映射关系

你可能感兴趣的:(MyBatis,javaweb,java,SSM)