1. 什么是ORM映射
ORM(Object Relational Mapping)对象关系映射,解决面向对象与关系数据库存在的互不匹配的现象的技术,将程序中的对象自动持久化到关系数据库中。MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM,如下图:
2.解决属性与列名不一致
2.1 列起别名
在SQL中使用 as 为查询字段添加列别名,以匹配属性名:
public List<Role> findAll();
<select id="findAll" resultType="com.by.pojo.Role" >
select id, role_name as roleName, role_desc as roleDesc from role
</select>
@Test
public void testFindAll(){
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
List<Role> roleList = roleMapper.findAll();
for (Role role : roleList) {
System.out.println(role);
}
}
思考: 如果我们的查询很多,都使用别名的话写起来岂不是很麻烦,有没有别的解决办法呢?
2.2 结果映射
使用ResultMap
标签手动映射,解决实体字段和数据表字段不一致的问题。
List<Role> findAll2();
<!--
结果映射
id="findAll2ResultMap" :resultMap标签的id,,必须唯一
type="com.by.pojo.Role":等价于resultType
-->
<resultMap id="findAll2ResultMap" type="com.by.pojo.Role">
<!--主键字段和属性的映射关系-->
<id column="id" property="id"></id>
<!--非主键字段和属性的映射关系-->
<result column="role_name" property="roleName"></result>
<result column="role_desc" property="roleDesc"></result>
</resultMap>
<!--
resultMap:resultMap标签的id
-->
<select id="findAll2" resultMap="findAll2ResultMap">
select * from role
</select>
@Test
public void testFindAll2(){
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
List<Role> roleList = roleMapper.findAll2();
for (Role role : roleList) {
System.out.println(role);
}
}
以上为属性与列名的不一致时具体解决办法