【1】表结构与model对象
① 两个表结构
其中t_class表拥有外键 t_id,对应t_teacher表主键t_id
表结构如下:
② 对应的model
Classes:
public class Classes { private int id; private String name; private Teacher teacher; ... }
可以看到class类中有一个对象属性teacher。
Teacher:
public class Teacher { private int id; private String name; ... }
【2】classMapper.xml配置
① 第一种配置实例-嵌套结果查询,必须有JavaType
这里关于association 标签属性说明如下:
property=“teacher”:指定哪个属性是联合的对象
javaType:指定这个属性对象的类型[不能省略]
<select id="getClass" parameterType="int" resultMap="classResultMap"> select * from t_class c,t_teacher t where c.t_id = t.t_id and c.c_id = #{id} </select> <!-- 可以解决model属性名与数据表中column列名不一致问题 jdbcType一定要大写 --> <resultMap type="Classes" id="classResultMap"> <id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/> <result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/> <association property="teacher" javaType="Teacher" > <id property="id" column="t_id" javaType="int" jdbcType="INTEGER"/> <result property="name" column="t_name" javaType="string" jdbcType="VARCHAR"/> </association> </resultMap>
② 第二种实例-返回map
<select id="getClassById" parameterType="int" resultMap="classResultMap2"> select * from t_class c where c.c_id = #{id} </select> <resultMap type="java.util.Map" id="classResultMap2"> <result property="id" column="c_id" javaType="int" jdbcType="INTEGER"/> <result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/> </resultMap>
③ 第三种实例-嵌套查询-必须有column
这里关于association 标签属性说明如下:
select:表明当前属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法
property=“teacher”:指定哪个属性是联合的对象
javaType:指定这个属性对象的类型
流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
<select id="getClass3" parameterType="int" resultMap="classResultMap3"> select * from t_class c where c.c_id = #{id} </select> <resultMap type="Classes" id="classResultMap3"> <result property="id" column="c_id" javaType="int" jdbcType="INTEGER"/> <result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/> //这里嵌套查询 <association property="teacher" javaType="Teacher" select="getTeacher" column="t_id"> </association> </resultMap> <select id="getTeacher" parameterType="int" resultType="Teacher"> select t_id id,t_name name from t_teacher where t_id = #{id} </select>
关联查询时还可以可以使用懒加载,在使用关联的对象的时候再执行嵌套查询:
<settings> <!--开启懒加载--> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
association或者collection标签的fetchType=eager/lazy
可以覆盖全局的延迟加载策略,指定立即加载(eager)或者延迟加载(lazy)。
嵌套查询传输多列
在上面的实例中,嵌套查询传输单列column作为级联查询的方法入参,如果需要传输多个呢?column可以如下传递:
多列的值传递过去:将多列的值封装map传递; column="{key1=column1,key2=column2}"
【3】方法测试实例
① 嵌套结果测试
@Tes@Test public void testSelect(){ /*set auto commit ,which equals to the above*/ SqlSession session = MybatisUtils.getFactory().openSession(true); String statement = "com.web.mapper.classMapper.getClass"; /*return the effect rows*/ Classes c = session.selectOne(statement, 1); System.out.println("result.."+c); Teacher teacher = c.getTeacher(); System.out.println("get from class..."+teacher); }
result as follows :
② getClassById
测试返回为map,controller中手动封装为Classes对象–这里没有附带teacher
@Test public void testSelect2(){ /*set auto commit ,which equals to the above*/ SqlSession session = MybatisUtils.getFactory().openSession(true); String statement = "com.web.mapper.classMapper.getClassById"; /*return the effect rows*/ HashMap<String, Object> classMap = session.selectOne(statement, 1); Classes classes = new Classes(classMap.get("name")+""); System.out.println("result.."+classes+','+classes.getClass()); }
result as follows :
③ 测试嵌套查询
嵌套查询
@Test public void testSelect3(){ /*set auto commit ,which equals to the above*/ SqlSession session = MybatisUtils.getFactory().openSession(true); String statement = "com.web.mapper.classMapper.getClass3"; /*return the effect rows*/ Classes classes = session.selectOne(statement, 1); System.out.println("result.."+classes+','+classes.getClass()); }
result as follows :
result..Classes [id=1, name=计算机, teacher=Teacher [id=1, name=李明], list=null],class com.web.model.Classes
标签说明
association : 用于一对一的关联查询 ; property : 对象属性名称 ; javaType : 对象属性类型 ; column : 所对应的外键字段名称 ; select : 使用另一个查询封装的结果 ; parameterType : 参数类型 ; resultType : 返回的结果类型 ; jdbcType : 对应的jdbc字段类型,请注意要大写 !另外与使用数据库字段类型一致!!