Sql映射器Mapper
MyBatis基于动态代理机制,让我们无需再编写Dao的实现。
传统Dao接口,现在名称统一以Mapper结尾,还有我们映射器配置文件要和映射器在同一个包.:
- 使用映射器步骤
1、根据需求,创建模型相关的Mapper接口(UserMapper)
2、编写映射文件
a)Mapper。Xml的命名空间,必须和接口的“全限定名”一致
b)定义sql标签的id,需要和“接口的方法”一致
3、配置映射文件
高级查询(字符串拼接部分)
- 使用’ ’ 拼接
- 使用Mysqlconcat函数
...
<sql id="qqq">
<!--高级查询引号拼接-->
<if test="keyWords != null" >
<!--使用单引号拼接只能使用$符号,不能使用#号,因为#是以?形式接入sql语句-->
AND productName LIKE '%${keyWords}%' OR brand LIKE '%${keyWords}%'
</if>
<!--高级查询使用sql concat函数拼接-->
<if test="keyWords != null">
AND productName LIKE concat('%',#{keyWords},'%') OR brand LIKE concat('%',#{keyWords},'%')
</if>
</sql>
...
结果映射ResultMap
MyBatis提供两种方式处理我们关联对象,嵌套查询和嵌套结果。
- 嵌套结果: 发送1条SQL,查询所有的信息(本身+关联对象)
- 嵌套查询:发送1+N条sql。又根据不同情形大致分为四类
多对一,一对一
嵌套结果
这种方式,所有属性都要自己来
<!--嵌套结果 1条sql id 结果Map的值 type:返回类型 -->
<select id="resultQuery" resultMap="employeeMap">
select e.id,e.name,e.age,d.id did,d.name dname from employee e JOIN dept d ON e.dept_id=d.id
</select>
<resultMap id="employeeMap" type="employee">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<association property="dept" javaType="Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
</association>
</resultMap>
嵌套查询
通过执行另外一个SQL映射语句来返回预期的复杂类型。
<!--嵌套查询 1+N条sql-->
<select id="query" resultMap="empMap">
select * from employee
</select>
<resultMap id="empMap" type="employee">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<association property="dept" column="dept_id" select="findDept">
</association>
</resultMap>
<select id="findDept" parameterType="long" resultType="dept">
select * from dept WHERE id=#{id}
</select>
一对多,多对多
嵌套结果
<!--嵌套结果-->
<select id="resultQuery" resultMap="TeacherMap">
SELECT t.id,t.name, s.id sid, s.age, s.name sname
FROM teacher t LEFT JOIN student s ON t.id = s.teacher_id
</select>
<resultMap id="TeacherMap" type="teacher">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!--property 类里面属性 javaType集合属性 ofType集合里面类型-->
<collection property="students" javaType="arraylist" ofType="student">
<id column="sid" property="id"/>
<result column="age" property="age"/>
<result column="sname" property="name"/>
</collection>
</resultMap>
缓存
MyBatis支持缓存:
一级缓存: SqlSession级别缓存,缓存对象存储周期为第一次获取,到sqlsession被销毁掉,或是sqlSession().clearCache();
二级缓存: SqlSessionFactory级别缓存,缓存对象存储周期为第一次获取,到SqlSessionFactory被销毁掉(应用停止了);
默认情况下,只开启一级缓存,如果需要开启二级缓存我们需要在Mapper.xml添加一个标签
<cache> </cache>
缓存对象必须实现Serializable接口