MyBatis Day2

一.SQL映射文件主要包含以下几个重要的元素:

<mapper>标签:SQL映射文件的根元素,用于指定命名空间和引入其他配置。

<select>标签:用于定义查询语句。可以指定查询的SQL语句、参数类型、返回结果类型等。

<insert>标签:用于定义插入语句。可以指定插入的SQL语句、参数类型等。

<update>标签:用于定义更新语句。可以指定更新的SQL语句、参数类型等。

<delete>标签:用于定义删除语句。可以指定删除的SQL语句、参数类型等。

<sql>标签:用于定义可复用的SQL片段。可以在多个SQL语句中引用该片段,避免重复编写相同的代码。

<resultMap>标签:用于定义结果集的映射关系。可以将查询结果映射到Java对象的属性上。

<include>标签:用于引入外部的SQL片段。可以将其他地方定义的SQL片段直接引入到当前的SQL语句中。

这些元素可以根据需要进行组合和嵌套,以实现复杂的数据库操作。除了这些核心元素之外,还有一些其他的辅助元素,如动态SQL(if、choose、when、otherwise等)、缓存配置、延迟加载等,可以提供更灵活和高级的功能。

通过合理使用这些元素,可以在SQL映射文件中定义各种类型的SQL操作,并将数据库表与Java对象之间的映射关系进行描述,使得开发人员可以方便地进行数据库操作并管理相关的映射规则。

二.在SQL映射文件中,可以通过不同的方式传递参数给SQL语句。以下是几种常见的参数传递方式:

位置参数(Positional Parameters):这是最基本和最常用的参数传递方式。在SQL语句中使用占位符(?)来代表参数的位置,按照参数在方法中出现的顺序进行传递。例如:

xml
复制代码
<select id="getUserById" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{0}
</select>
在调用该查询语句时,可以通过索引来指定参数值,如#{0}表示第一个参数。

命名参数(Named Parameters):通过在SQL语句中使用命名参数的方式来传递参数。可以在SQL语句中使用#{paramName}的形式来表示参数。例如:

xml
复制代码
<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
在调用该插入语句时,可以直接使用参数对象的属性名作为参数名称,ORM框架会自动将参数值与对应的属性进行匹配。

Map参数(Map Parameters):可以将参数作为一个包含键值对的Map对象进行传递。在SQL语句中可以使用Map中的键作为参数名来获取对应的值。例如:

xml
复制代码
<update id="updateUser" parameterType="java.util.Map">
    UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
在调用该更新语句时,可以将参数以键值对的形式放入一个Map中,并传递给映射方法。

POJO参数(Plain Old Java Object Parameters):即将参数作为一个Java对象进行传递。在SQL语句中可以使用对象的属性名来获取参数值。例如:

xml
复制代码
<select id="getUserByNameAndAge" resultType="com.example.model.User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
在调用该查询语句时,可以将一个包含对应属性的Java对象作为参数传递给映射方法。

通过以上不同方式,我们可以根据具体需求选择合适的参数传递方式,实现灵活、可读性好的SQL操作。同时,ORM框架会根据参数类型和注解等信息,自动将参数与SQL语句进行绑定。

三.结果映射

resultMap元素

resultMap元素的属性 id:resultMap的唯一标识 type:映射的结果类型 resultMap元素的子元素 id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能 result:指定结果集字段和实体类属性的映射关系 association:映射“多对一”或“一对一”关系 collection:映射“一对多”关系

association

association 复杂的关联类型,映射一个嵌套JavaBean属性 多对一或一对一 属性 property:用来映射查询结果子集的实体属性 javaType:完整Java类名或者别名 resultMap:引用外部resultMap 子元素 id result

collection

collection 复杂类型集合,映射嵌套结果集到一个列表 一对多 属性 property:实体类中用来映射查询结果子集的集合属性 ofType:集合中元素的类型,完整Java类名或者别名 resultMap:引用外部resultMap 子元素 id result

resultType与resultMap

resultType 直接表示返回类型 适用于比较简单直接的数据封装场景 resultMap 是对外部resultMap的引用 能够处理结果集字段名与实体类属性名不一致、或者需要对连接查询结果使用嵌套映射等较为复杂的问题 二者本质上都是基于Map数据结构,不能同时使用

resultMap提供了三种自动映射行为配置选项,分别是NONE、PARTIAL和FULL。

  1. NONE:表示关闭自动映射行为。当使用NONE时,需要手动配置所有的属性映射关系。即使查询结果的列名与目标Java对象的属性名一致,也不会进行自动映射。

 

2.PARTIAL:表示部分自动映射行为。在PARTIAL模式下,如果查询结果的列名与目标Java对象的属性名一致,会自动进行映射。但如果查询结果包含了复杂类型的数据或者存在属性名与列名不一致的情况,需要手动配置这些映射关系。

 

3.FULL:表示完全自动映射行为。在FULL模式下,除了自动映射查询结果与目标Java对象的简单属性外,还会自动映射复杂类型的属性和属性名与列名不一致的情况。

 

需要注意的是,自动映射行为只适用于查询结果与目标Java对象之间的简单映射关系。对于复杂的映射关系,仍然需要手动配置来实现。

通过合理选择不同的自动映射行为配置选项,可以根据具体情况来简化映射配置,并提高开发效率。

四.MyBatis 的映射文件中,实现增删改操作

  1. 增加(Insert)操作:
    • 在映射文件中使用 <insert> 标签定义插入操作。
    • 使用 <selectKey> 标签生成主键值(可选)。
    • 在 <insert> 标签内部编写插入语句,使用参数占位符或者动态标签来指定要插入的数据。

 

2.删除(Delete)操作:

  • 在映射文件中使用 <delete> 标签定义删除操作。
  • 在 <delete> 标签内部编写删除语句,使用参数占位符或者动态标签来指定要删除的数据条件。

 

3.修改(Update)操作:

  • 在映射文件中使用 <update> 标签定义更新操作。
  • 在 <update> 标签内部编写更新语句,使用参数占位符或者动态标签来指定要更新的数据和更新条件。

 

五.MyBatis提供了两级缓存来提升查询性能,分别是一级缓存(本地缓存)和二级缓存(全局缓存)

一级缓存(本地缓存):

1.默认情况下,MyBatis开启了一级缓存。一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次执行查询后会将查询结果缓存到内存中。


2.当再次执行相同的查询时,如果没有发生数据变动,则直接从缓存中获取结果,而不需要再次访问数据库。


3.一级缓存的作用范围是SqlSession级别的,即同一个SqlSession中的缓存共享。


二级缓存(全局缓存):

  • 范围:二级缓存是多个SqlSession共享的缓存,可以跨SqlSession进行数据共享。它的作用范围是在同一个命名空间(namespace)下的Mapper中。
  • 配置:要启用二级缓存,需要在映射文件中的 <cache> 标签中进行配置。

 

常见的 <cache> 标签的属性配置如下:

  • eviction:指定缓存的回收策略,默认为 LRU(Least Recently Used,最近最少使用算法)。
  • flushInterval:指定刷新缓存的时间间隔,单位为毫秒。
  • size:指定缓存中最大的元素数量。
  • readOnly:指定缓存是否只读,默认为 true。

需要注意的是:

  • 二级缓存默认是关闭的,需要显式配置 <cache> 标签来启用并进行相关配置。
  • 对于具有联合主键或者使用了分页插件的查询语句,二级缓存是不起作用的。
  • 在使用二级缓存时,需要保证实体对象和关联对象的序列化能力,以便正确地进行缓存的读取和写入。

通过合理配置一级缓存和二级缓存,可以提高MyBatis的查询性能,减少数据库的访问次数,并实现数据的共享和缓存管理。在配置缓存时,还需考虑缓存的失效策略、数据一致性以及合理设置缓存的大小等因素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值