MyBatis中五种成功映射数据库字段与实体类属性不一致的解决方案
在Mybatis中,当根据某字段查询数据库信息时,如果数据库字段名与实体类属性名称不一致,查询时,会出现赋值不上的情况,值为Null。本次将给出五种方案,其中方案三、四为推荐。
例如:根据学号sno查询学生信息
1.数据库表student字段名称以及类型:
2.数据库表内容:
3.实体类:实体类内 学号为s_no 不对应数据库表内 sno
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<Student> 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<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的映射关系