MyBatis 基础使用02
1.使用resultMap 处理查询一对多,多对一的关系:
1.1关于xml 中 返回类型解析:
resultType:
resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。
如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中
resultMap
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
resultType:常用限定到pojo就行
1.2当出现一对多且实体类不对应数据库
一对多还是多对一核心就是:在实体类中和数据库不能匹配,把不能匹配的属性单独用resultMap 处理
<resultMap id="studentbyteacher" type="Teacher">
<result property="当前实体类中属性" column="数据库中对应的列"/>
<!--实体类中复杂类型单独处理
1.对象类型用: association
2.集合类型用: collection: javaType:指定属性类型,集合中的泛型用ofType -->
<collection property="目标实体类中包含的其他属性的名字" javaType="java.util.List" ofType="泛型" >
<result property="包含的其他实体类中属性" column="s_id"/>
</collection>
</resultMap>
pojo 一定要实现序列化
Teacher.java
public class Teacher implements Serializable {
private int tId;
private String tName;
private int tAge;
//一对多的关系
private List<Student> students;
}
public class Student implements Serializable {
private int sId;
private String sName;
private int sAge;
private int tTeacher;
}
Mapper.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">
<!--namespace绑定到mapper接口-->
<mapper namespace="com.hzh.mapper.TeacherMapper">
<!--开启二级缓存,当然需要序列化实体类-->
<cache/>
<!-- 一对多关系处理 -->
<!--方法一 按结果集查询-->
<resultMap id="studentbyteacher" type="Teacher">
<result property="tId" column="t_id"/>
<result property="tName" column="t_name"/>
<result property="tAge" column="t_age"/>
<!--实体类中复杂类型单独处理
1.对象类型用: association
2.集合类型用: collection: javaType:指定属性类型,集合中的用ofType -->
<collection property="students" javaType="java.util.List" ofType="student" >
<result property="sId" column="s_id"/>
<result property="sName" column="s_name"/>
</collection>
</resultMap>
<select id="selectByTeacherId" resultMap="studentbyteacher" >
select te.t_id,te.t_name,st.s_id,st.s_name
from student st,teacher te
where
st.t_teacher = te.t_id and te.t_id = #{te.t_id}
</select>
<!--方法二 子查询的方式-->
<select id="selectByTeacherId2" resultMap="studentbyteacher2">
select * from teacher
where t_id = #{t_id}
</select>
<resultMap id="studentbyteacher2" type="Teacher">
<collection property="students" javaType="java.util.List" ofType="Student"
select="getStudent" column="t_id"/>
</resultMap>
<select id="getStudent" resultType="Student">
select * from student where t_teacher = #{t_id}
</select>
</mapper>
2.动态sql模板
<select id="list" resultMap="BaseResultmap" >
SELECT * FROM `order`
<where>
<trim prefixOverrides="and">
<if test="orderNum != null and orderNum != ''">
and orderNum=#{orderNum}
</if>
<if test="payStatus != null and payStatus >= 0">
and payStatus=#{payStatus}
</if>
<if test="payMethod != null and payMethod >= 0">
and payMethod=#{payMethod}
</if>
<if test="userId != null and userId >= 0">
and userId=#{userId}
</if>
</trim>
</where>
ORDER BY orderId DESC
</select>
3.缓存
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
<cache/>