Mybatis3文档阅读(三)之Mapper XML

本文详细介绍了MyBatis框架的高级特性,包括CRUD操作、SQL片段复用、自动增长ID处理、一对多及一对一关系处理等,并通过具体示例展示了如何在实际项目中运用这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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指的是缓存命中率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值