一个简单的需求,Student表和Course表,Student表中有一个courseId字段,对应的是Course表的id主键,进行关联查询,查询学生的时候,同时查出学生对应的课程信息;
这里利用Mybatis的<resultMap>中的<association>进行分布式关联查询。简单的实体类以及接口不在这里展示,主要看一下mapper.xml文件内容
1、StudentMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.springboot.mybatis.mapper.StudentMapper">
<cache></cache>
<resultMap id="selectStudentByIdMap" type="com.springboot.mybatis.entity.Student">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<association property="course" select="com.springboot.mybatis.mapper.ClasserMapper.getClasserById" column="classId"></association>
</resultMap>
<select id="selectStudentById" parameterType="int" resultMap="selectStudentByIdMap">
select id ,name,age,classId from student where id = #{id}
</select>
</mapper>
2、CourseMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.springboot.mybatis.mapper.ClasserMapper">
<cache></cache>
<resultMap id="getClasserByIdMap" type="com.springboot.mybatis.entity.Course">
<id column="id" property="id"></id>
<result column="class_name" property="className"></result>
</resultMap>
<select id="getClasserById" parameterType="int" resultMap="getClasserByIdMap">
select id,class_name,teacherId from course where id = #{classId}
</select>
</mapper>
3、查询结果展示
2019-03-29 16:19:06.572 DEBUG 6184 --- [ main] c.s.mybatis.mapper.StudentMapper : Cache Hit Ratio [com.springboot.mybatis.mapper.StudentMapper]: 0.0
2019-03-29 16:19:06.578 INFO 6184 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2019-03-29 16:19:06.827 INFO 6184 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-03-29 16:19:06.833 DEBUG 6184 --- [ main] c.s.m.m.StudentMapper.selectStudentById : ==> Preparing: select id ,name,age,classId from student where id = ?
2019-03-29 16:19:06.854 DEBUG 6184 --- [ main] c.s.m.m.StudentMapper.selectStudentById : ==> Parameters: 1(Integer)
2019-03-29 16:19:06.903 DEBUG 6184 --- [ main] c.s.m.m.StudentMapper.selectStudentById : <== Total: 1
2019-03-29 16:19:06.917 DEBUG 6184 --- [ main] c.s.mybatis.mapper.ClasserMapper : Cache Hit Ratio [com.springboot.mybatis.mapper.ClasserMapper]: 0.0
2019-03-29 16:19:06.917 DEBUG 6184 --- [ main] c.s.m.m.ClasserMapper.getClasserById : ==> Preparing: select id,class_name,teacherId from course where id = ?
2019-03-29 16:19:06.918 DEBUG 6184 --- [ main] c.s.m.m.ClasserMapper.getClasserById : ==> Parameters: 1(Integer)
2019-03-29 16:19:06.920 DEBUG 6184 --- [ main] c.s.m.m.ClasserMapper.getClasserById : <== Total: 1
2019-03-29 16:19:06.922 DEBUG 6184 --- [ main] c.s.mybatis.mapper.TeacherMapper : Cache Hit Ratio [com.springboot.mybatis.mapper.TeacherMapper]: 0.0
2019-03-29 16:19:06.922 DEBUG 6184 --- [ main] c.s.m.m.TeacherMapper.getTeacherById : ==> Preparing: select id,teacher_name from teacher where id = ?
2019-03-29 16:19:06.922 DEBUG 6184 --- [ main] c.s.m.m.TeacherMapper.getTeacherById : ==> Parameters: 1(Integer)
2019-03-29 16:19:06.923 DEBUG 6184 --- [ main] c.s.m.m.TeacherMapper.getTeacherById : <== Total: 1
Student{id=1, name='Tom', age=11, course=Course{id=1, className='Java', teacher=Teacher{id=1, teacherName='YANG'}}}
2019-03-29 16:19:06.929 INFO 6184 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2019-03-29 16:19:06.937 INFO 6184 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
通过查询日志来看,是分布的查询,然后最后组装一起,然后返回结果的,那么接下来看下association标签具体的一些属性,见下表:
property | 映射数据库列的字段或属性。 |
colum | 数据库的列名或者列标签别名。 |
javaTyp | 完整java类名或别名。 |
jdbcType | 支持的JDBC类型列表列出的JDBC类型。 |
resultMap | 一个可以映射联合嵌套结果集到一个适合的对象视图上的ResultMap |
select | 表明当前属性是调用select指定的方法查出的结果,此时的column表示指定将哪一列的值传给这个方法 |
上面的例子中就是利用select属性和colum属性进行分布式的一对一查询操作。