Mybatis中的mapper.xml的使用
1.typeAliases元素:
1,这个标签里面的typeAlias标签可以定义别名,会在映射文件中使用。如果没有定义别名,那必须使用【全限定名】。
2,其【子标签package】可以为包下所有类定义别名。
别名默认就是类名。
2.自动配置主键:
a.对于主键值可以自动增长的数据库,例如mysql 可以如下:
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">表示主键为studId,且自动增长
或者在数据库中配置也可(但主键必须为int类型)
b.对于主键值不能够自动增长的数据库,例如oracle,使用【序列】(SEQUENCE)来生成主键值。
create sequence my_seq;
<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT my_seq.nextval FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>
使用了<selectKey>子元素来生成主键值,并将值保存到Student对象的studId 属性上。
order属性:MySQLorder需要设置为after,Oracle需要设置为before
3.ResultMap属性:结果集映射,用来将SELECT语句的结果集映射到java对象的属性中。ResultMaps特性非常强大,你可以使用它将简单的SELECT语句映射到复杂的一对一、一对多关系的SELECT语句上。
1)拓展 ResultMap:
<resultMap type="Student" id="StudentResult">
<resultMap type="Student" id="StudentWithAddressResult" extends="StudentResult">
其中id为StudentWithAddressResult的resultMap拓展了id为StudentResult的resultMap
2)使用【嵌套结果查询ResultMap】
1)Association属性:一对一 Student对象中需生成address对象的getter和setter方法
<resultMap type="Address" id="AddressResult">
<....>
</resultMap>
<resultMap type="Student" id="StudentWithAddressResult">
<....>
<!-- 【关联】的意思 【嵌套结果映射】-->
<association property="address" resultMap="AddressResult" />
</resultMap>
元素<association>被用来导入“有一个”(has-one)类型的关联。在上述的例子中,
我们使用了<association>元素引用了另外的在同一个XML文件中定义的<resultMap>。
2)Collection属性:将多行结果映射成一个对象的一个集合
private List<Course> courses;
<resultMap type="Student" id="StudentWithAddressResult">
<!-- collection表一对多关系,遇到courses集合成员 -->
<collection property="courses" resultMap="CourseResult" />
</resultMap>
3)使用【嵌套查询结果select】一对一
嵌套查询本质:
一个select语句 转化成 多条select语句去实现功能。
【先根据addr_id去查找 地址对象】
<resultMap type="Address" id="AddressResult"></....>
<select id="findAddressById" parameterType="int" resultMap="AddressResult">
select * from addresses where addr_id=#{id}
</select>
<select id="findStudentById" parameterType="int" resultMap="StudentWithAddress">
select * from addresses where addr_id=#{id}
</select>
<resultMap type="Student" id="StudentWithAddress">
<........>
<!-- addr_id列的值将会被作为输入参数传递给findAddressById语句。-->
<association property="address" column="addr_id" select="findAddressById" />
</resultMap>
在此方式中,<association>元素的select属性被设置成了id为findAddressById的语句。这里,两个分开的SQL语句将会在数据库中分别执行,第一个调用findStudentById加载student信息,而第二个调用findAddressById来加载address信息。
总结:
嵌套结果查询 本质上是一条sql语句查询多张表;
嵌套查询 本质上是每条sql语句查询一张表,组合在一起查询多张表。
效率上,嵌套结果更快。
结论:
如果是 嵌套结果,通过 association标签中的 resultMap属性 实现;
如果是 嵌套查询,通过 association标签中的 select属性 实现
嵌套结果映射和嵌套查询 一对多 和 一对一 类似,只是运用collection属性而已
多对多的关系可以参照一对多,只是中间多了一个桥表。
不论是一对一还是一对多还是多对多,都不能在mybatis中进行级联保存、更新、删除,我们需要使用sql语句控制每一步操作(可以级联查询)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?