MyBatis 可以自动映射查询结果。
@Test
public void queryAllUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.queryAllUser();
for (User user : users) {
System.out.println(user);
}
//关闭资源
sqlSession.close();
}
做如上查询时,MyBatis 会将数据库表中的列名与Bean中的字段名进行映射,如果找到了就会把该列的值赋给相对应字段。这就是自动映射。
如果数据库表中的列名和Bean中的字段名不一致会出现什么结果呢?
<select id="queryAllStudent" resultType="student">
select student_id, student_name, student_age from student;
</select>
可以发现只有列名和字段名一致的才可以成功映射并输出相应的值。然而数据库中的列名往往跟Bean中的字段名是不一致的,这个问题该怎么解决呢?
<select id="queryAllStudent" resultType="student">
select student_id id,student_name student_name, student_age age from student;
</select>
通过起别名可以解决这个问题。
mybatis提供的resultMap也可以解决这个问题。
<resultMap id="studentResultMap" type="student">
<id column="student_id" property="id"/>
<result column="student_name" property="student_name"/>
<result column="student_age" property="age"/>
</resultMap>
<select id="queryAllStudent" resultMap="studentResultMap">
select student_id, student_name, student_age from student;
</select>
结果:
以上都只是在一个表中查询(或者说是实体类中只有基本数据类型,并没有复杂的对象)。如果一个实体类中包含另外一个实体类的对象会出现什么情况呢?
定义实体类
public class Cat {
private int catId;
private String catName;
private String catAge;
private Person personId; //猫有一个主人
//get set 构造函数省略。。。
public class Person {
private int personId;
private String personName;
//get set 构造函数省略。。。
定义接口
public interface CatMapper {
List<Cat> getCat();
}
接口实现类
<mapper namespace="cn.gbl.dao.CatMapper">
<select id="getCat" resultType="cat">
select cat_id catId,cat_name catName,cat_age catAge,person_id personId from cat;
</select>
</mapper>
测试
尽管使用了别名,personId的值还是查不出来。
如果一个实体类中包含另外一个实体类的对象那么该如何进行映射呢?
mybatis提供了以下两个标签来实现复杂映射:
有两种方式:
这里只说按照结果嵌套处理:
如图所示对应关系,不是复杂类型的直接使用result进行映射,若要映射的是对象就使用association。
property还是Bean中的字段名,只是此时就不需要column了,直接使用javaType指明这个对象的类型。然后再在association标签下使用result对这个对象进行映射即可。
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.gbl.dao.CatMapper">
<resultMap id="catResultMap" type="cat">
<result property="catId" column="cat_id" />
<result property="catName" column="cat_name" />
<result property="catAge" column="cat_age" />
<association property="personId" javaType="person">
<result property="personId" column="person_id"/>
<result property="personName" column="person_name"/>
</association>
</resultMap>
<select id="getCat" resultMap="catResultMap">
select * from cat c inner join person p
on c.person_id = p.person_id ;
</select>
</mapper>
测试:
@Test
public void getCat(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
CatMapper mapper = sqlSession.getMapper(CatMapper.class);
List<Cat> cats = mapper.getCat();
for (Cat cat : cats) {
System.out.println(cat);
}
sqlSession.close();
}
结果:
实体类
public class Person {
private int personId;
private String personName;
private List<Cat> cats; //一个人有多只猫
//get set 构造函数省略。。。
有两种方式:
这里只说按照结果嵌套处理:
和association很相似,不是复杂类型的直接使用result进行映射,若要映射的是集合就使用collection。
注意:association中使用javaType表明对象类型,collection中使用ofType表明对象类型。
测试:
@Test
public void getPerson(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> persons = mapper.getPerson();
for (Person person : persons) {
System.out.println(person);
}
}
//结果:张三有四只猫
Person{personId=1, personName=‘张三‘,
cats=[Cat{catId=1, catName=‘tom‘, catAge=‘1‘, personId=1},
Cat{catId=2, catName=‘lucy‘, catAge=‘2‘, personId=1},
Cat{catId=3, catName=‘kimi‘, catAge=‘3‘, personId=1},
Cat{catId=4, catName=‘aci‘, catAge=‘4‘, personId=1}]}
原文:https://www.cnblogs.com/xxgbl/p/14311106.html