前言
声明:本专栏文章均为观看动力节点王鹤老师三大框架的视频所撰写的笔记,笔者实力有限,内容如有错误欢迎各位小伙伴在评论区指出。
视频链接:SSM-Mybatis
对使用Mybatis查询后获取的输出数据类型进行指定,全限定类名或者别名都可以。mapper中有两种属性可以实现此功能,分别是resultType和resultMap。
1、resultType
执行sql得到ResultSet转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
(1) 不使用框架之前,jdbc执行sql结束后使用ResultSet接收查询的结果,然后手动进行结果的封装,如下:
// 查询数据
String sql = "select * from student";
// executeQuery(sql)执行查询
ResultSet rs = sttm.executeQuery(sql);
while(rs!=null){
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
//封装到list集合中
stulist.add(stu);
}
(2)使用了框架之后,上述这个手动封装的步骤可以由Mybatis代为执行,而我们只需要在mapper文件指定返回结果resultType的类型即可。规则:同名列赋值给同名属性。
resultType: 1 )java类型全限定名称; 2 )别名
resultType: 表示mybatis执行sql后得到java对象类型。
如下:
<select id="selectById" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>
(3)对比
2、不同返回结果的封装
查询结果类型不同,大致分为三类,简单类型、对象类型和Map类型。
1)简单类型
接口方法,统计student表中学生数量
long countStudent();
mapper文件中sql映射
<select id="countStudent" resultType="java.lang.Long">
select count(*) from student
</select>
测试方法
@Test
public void testCountStudent(){
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao dao = session.getMapper(StudentDao.class);
//3.统计学生表中学生的个数
long nums = dao.countStudent();
System.out.println("nums = " + nums);
//4.关闭SqlSession对象
session.close();
}
2)对象类型
按照学生的id查找
接口方法
Student selectById(Integer id);
mapper文件中sql映射
<select id="selectById" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>
测试方法
@Test
public void testSelectById(){
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao dao = session.getMapper(StudentDao.class);
Student student = dao.selectById(1005);
System.out.println("student = " + student);
//3.关闭SqlSession对象
session.close();
}
解释:
resultType使用Student全限定类名,就是告诉Mybatis在执行完sql语句以后,将结果转换为Student类型的对象,具体会进行以下操作:
1)Mybatis会利用全限定类名反射构造Student类型的对象(无参构造方法)
2)将查询出来的学生记录按照同名列赋值给同名对象属性
学生记录列名 | java对象设置方法 |
id | student.setId(rs.getInt("id")) |
name | student.setName(rs.getString("name")) |
student.setEmail(rs.getString("email")) | |
age | student.setAge(rs.getInt("age")) |
3)如果dao接口的返回值是List集合,Mybatis会把学生对象添加到list集合中
上述这些也就是原生的jdbc手动封装结果的步骤,只不过现在都是由框架帮我们自动完成。
3)Map类型
sql的查询结果作为Map的key和value。Map作为接口返回值,sql语句的查询结果最多只能有一条记录。
接口方法,按照id查找学生
Map<Object,Object> selectMap(@Param("stuid") Integer id);
mapper文件中sql映射,执行sql得到一个Map结构数据, mybatis执行sql,把ResultSet转为map sql执行结果, 列名做map的key , 列值作为value。
<select id="selectMap" resultType="java.util.HashMap">
select id,name,email from student where id != #{stuid}
</select>
测试方法
@Test
public void testSelectMap(){
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao dao = session.getMapper(StudentDao.class);
Map<Object,Object> map = dao.selectMap(1006);
System.out.println("map==="+map);
//3.关闭SqlSession对象
session.close();
System.out.println("name="+map.get("name"));
System.out.println("id="+map.get("id"));
}
3、resultMap
resultMap和resultType不可以同时使用,resultMap相比于resultType适用于数据库中列字段名称和java对象的属性名不一致的情况,可以实现更加灵活的赋值。
使用方式:
1)先在mapper文件中定义resultMap,指定列名和属性的对应关系,以待使用。
<resultMap id="customMap" type="com.bjpowernode.vo.CustomObject">
<!--定义列名和属性名的对应-->
<!--主键类型使用id标签-->
<id column="id" property="cid" />
<!--非主键类型使用result标签-->
<result column="name" property="cname" />
<!--列名和属性名相同不用定义-->
<result column="email" property="email" />
<result column="age" property="age" />
</resultMap>
2)在<select>中把resultType替换为resultMap。
<select id="selectById2" resultMap="customMap">
select id,name,email,age from student where id=#{stuid}
</select>
演示:
接口方法,查询结果返回Map;
Map<Object,Object> selectMap(@Param("stuid") Integer id);
mapper文件如上面使用方法第二步;
测试方法;
@Test
public void testSelectMap(){
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao dao = session.getMapper(StudentDao.class);
Map<Object,Object> map = dao.selectMap(1006);
System.out.println("map==="+map);
//3.关闭SqlSession对象
session.close();
System.out.println("name="+map.get("name"));
System.out.println("id="+map.get("id"));
}