1.数据库准备:建立学生–课程–老师的关系
2.CRUD操作
(1)select
a.建立StudentMapper.xml
<mapper namespace="gdut.ff.student">
<!-- 根据学生标识查找学生 -->
<select id="selectStudentById" resultType="hashmap" parameterType="int">
SELECT * FROM student WHERE ID = #{id}
</select>
</mapper>
b.在mybatis-config.xml中引入StudentMapper.xml
<mappers>
<mapper resource="gdut/ff/mapper/StudentMapper.xml"></mapper>
</mappers>
c.测试
d.测试结果
从打印的结果可以看出,这里实际上是执行了JDBC的一个PreparedStatement操作,未知参数ID使用了占位符?代替。
e.select语句的属性
(2)update,insert,delete
注意:在官方文档有提到:如果在表中字段设置了auto_increment.插入语句修改如下:
这里Mybatis利用了数据库的自动增长,那数据库又是以什么样的方式实现自动增长的呢?
(3)selectKey
keyProperty 表示selectKey返回的结果应该设置在哪个属性。
keyColumn 表示selectKey返回的结果设置在哪个字段。
order 表示如果order=”BEFORE”,selectKey语句在insert语句执行前执行,如果order=”AFTER”,selectKey语句在insert语句执行后执行。
(4)sql
这个元素可以用来定义一个能在不同语句重复使用的SQL片段。这个元素的内容可以是静态的(在加载阶段)参数化。不同的属性值可以在include实例中变化。
定义sql片段:
<!-- 用于select需要查询的字段 -->
<sql id="nameSql">
${student}.STU_NAME,${course}.COUR_NAME
</sql>
<!-- 连接查询语句 -->
<sql id="innerJoinSql">
INNER JOIN student s ON ${student_course}.STU_ID = s.ID
INNER JOIN course c ON c.ID = ${student_course}.COUR_ID
</sql>
<!-- 一个sql片段里面应用另一个sql片段 -->
<sql id="refInnerJoinSql">
<include refid="${target}"></include>
</sql>
注意这里使用的是$,而不是#。
例子一:
<select id="getStudentCourse2" resultType="map">
SELECT
<include refid="nameSql">
<property name="student" value="s"/>
<property name="course" value="c"/>
</include>
FROM student_course sc
INNER JOIN student s ON sc.STU_ID = s.ID
INNER JOIN course c ON c.ID = sc.COUR_ID
</select>
这里引用了nameSql片段。引入需要查询的字段。在include标签中设置需要传递到nameSql中的参数值。
例子二:
<select id="getStudentCourse" resultType="map">
SELECT
<include refid="nameSql">
<property name="student" value="s"/>
<property name="course" value="c"/>
</include>
FROM student_course sc
<include refid="refInnerJoinSql">
<property name="student_course" value="sc"/>
<property name="target" value="innerJoinSql"/>
</include>
</select>
在例子一的基础上,连接语句也是引用的sql片段。在sql片段refInnerJoinSql中引用了片段innerJoinSql,所以在refInnerJoinSql中也需要为innerJoinSql的参数赋值。
运行结果:
5.association(处理一对一的关系)
mapper写法如下:
association标签属性的含义:
select:调用哪个查询语句。
property:对应JavaBean的哪个属性。
column:传递哪个字段的值作为查询语句的参数。
javaType:property属性对应的Java类型是什么。
测试程序:
运行结果:
6.collection(处理一对多的关系)
根据1中的数据关系:
column:查询的字段。
property:将查询的字段的值对应JavaBean中哪个属性的值。
测试程序:
这里分两次打开session,在没有引入cache标签前,会向数据库发送两次查询请求。引入cache标签后,只会向数据库发送一次查询请求。
引入cache标签后:
向数据库请求查询了一遍,打印了两遍。
Cache hit Ratio指的是缓存命中率。