1.输出结果为简单类型(8个基本类型+String)
resultType="int"
mapper.xml文件中:
<select id="queryStudentCount" resultType="int">
select count(*) from student2
</select>
mapper接口中:
Integer queryStudentCount();
测试:
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Integer count = studentMapper.queryStudentCount();// 接口中的方法->SQL语句
System.out.println(count);
session.close();
返回结果为:
9
2.输出结果为对象类型
和简单对象类似,定义接口时方法返回值为实体类对象,sql语句返回对象.
3.输出结果为多个对象,集合类型
此时mapper.xml中resultType还是指定为对象类型,但是接口中的方法要指定集合类型,如list集合
mapper.xml:
<select id="queryAllStudents" resultType="student" >
select * from student2
</select>
mapper接口:
List<Student> queryAllStudents();
测试:
StudentMapper studentMapper = session.getMapper( StudentMapper.class) ;
List<Student> students = studentMapper.queryAllStudents() ;//接口的方法->SQL
System.out.println(students);
session.close();
测试结果:集合对象能打印输出
4.输出结果为Map类型(hashmap)
mapper.xml:
<!-- 输出参数为HashMap 但是只能查询一个学生的信息(去掉where条件,报错)
Expected one result (or null) to be returned by selectOne(), but found: 8
-->
<select id="queryStudentOutByHashMap" resultType="HashMap">
select stuno ,stuname from student2 where stuno=1
</select>
mapper接口:
//输出参数为HashMap 但是只能输出一个学生的信息
HashMap<String, Object> queryStudentOutByHashMap();
测试:
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
HashMap<String, Object> map = studentMapper.queryStudentOutByHashMap();// 接口的方法->SQL
System.out.println(map);
session.close();
上面输出结果为:{STUNAME=zs, STUNO=1}
如果select语句写成:select stuno "no",stuname "name" from student2 where stuno=1
则结果为{no=1, name=zs}.
说明当我们给输出结果取别名时,map就会把别名当作key,否则就按照原来的字段名为key。
另外,这个sql语句要加where条件,因为接口方法的返回值类型为HashMap(String,Object),虽然我们知道map本身就是一个集合,但是在这里面,一个hashmap表示一个Student,不加where条件,会查询出多条结果(即多个Student),所以会报:
Expected one result (or null) to be returned by selectOne(), but found: 8
要想返回多条结果集,就要使用List<HashMap<String,Object>>接收。结果就会输出一个List中的多个HashMap集合,即多个Student对象。
resultMap:
1如果 类中属性 和表中的字段 类型能够合理识别 (String-varchar2),则可以使用resultType;否则(boolean-number) 使用resultMap
2如果 类中属性名 和表中的字段名能够合理识别 (stuNo -stuno)则可以使用resultType;否则(id-stuno) 使用resultMap
当数据库中字段为
id和name,而类中属性名为
此时二者不统一,我们就用resultMap返回结果
mapper.xml:
<select id="queryStudentById" parameterType="int" resultMap="queryStudentByIdMap">
select * from student2 where id=#{id}
</select>
<resultMap type="student" id="queryStudentByIdMap">
<!-- 指定类中的属性和表中字段对应关系 -->
<id property="stuNo" column="id"></id>
<result property="stuName" column="name"/>
</resultMap>
mapper接口:
//输出参数使用resultMap,当数据库字段名和类中属性名不一致时
Student queryStudentById(Integer stuNo);
测试:
Integer stuNo=1;
Student student = studentMapper.queryStudentById(stuNo) ;//接口的方法->SQL
System.out.println(student);
session.close();
输出结果为:
1-zs-23-g1-性别:true
当用resultMap时,需要指定resultMap中数据库中的字段和java类的属性名,主键使用<id>,非主键使用<result>,确定好映射关系之后,Mybatis才会识别stuNo对应id,stuName对应name。如果不指定,就打印不出信息,就会显示默认值,如null,0,false之类的。
当然,当名字两边不匹配时,我们除了使用resultMap之外,也可以使用resultType,通过给字段取别名来确定映射关系: select 表中字段名 "类中属性名" from table... 这样字段名就和属性名建立起映射关系了。
mapper.xml:
<select id="queryStudentByIdWithHashMap" parameterType="int" resultType="student">
select id "stuNo",name "stuName" from student2 where id=${value}
</select>
别的地方都不用变,这样也能打印出信息,但是如果别名写错了,比如别名为"stuxxxxNo",对应关系对应不上了,就会打印出默认值0。resultType除了使用student,还可以使用hashmap,只要在接口方法中返回值类型改为HashMap即可。