学习My Batis的第二天

1.SQL映射的XML文件

MyBatis真正的特色在于SQL映射语句,功能强大,使用简单 SQL映射文件的几个顶级元素 mapper – SQL映射文件的根元素,有一个namespace属性

cache – 配置给定命名空间的缓存

cache-ref – 从其他命名空间引用缓存配置

resultMap – 用来描述数据库结果集和对象的对应关系

sql – 可以重用的SQL块,也可以被其他语句引用

insert – 映射插入语句

update – 映射更新语句

delete – 映射删除语句

select – 映射查询语句

以下是一个简单的SQL映射的XML文件示例:

2.mapper

在软件开发中,"mapper" 是一个常用的术语,它通常指的是数据映射器或对象-关系映射器(Object-Relational Mapper,ORM)。Mapper 是用于将应用程序的对象模型(通常是面向对象的)与数据库的关系模型进行映射的组件或工具。

具体而言,在持久层开发中,Mapper 用于处理应用程序与数据库之间的数据交互。它负责执行一些基本的 CRUD 操作(即创建、读取、更新和删除),并将结果转换为适合应用程序使用的对象形式。

ORM 框架(如 MyBatis 和 Hibernate)通常使用 mapper 来管理 SQL 语句的定义和执行。在这种情况下,mapper 通常是一个包含了 SQL 查询和操作的接口或类。通过编写 mapper 接口或类,并提供相应的 SQL 映射配置文件(如 XML 文件),我们可以定义数据库操作的细节,然后框架会根据这些定义自动生成相应的 SQL 语句并执行。

mapper 是一个用于将应用程序对象与数据库关系模型映射的组件或工具,负责处理数据的持久化和交互。它可以大大简化开发人员在数据库操作方面的工作,提高代码的可维护性和可读性。

3.resultMap元素

<resultMap> 元素是 MyBatis 中用于配置结果集映射关系的重要元素,它定义了如何将数据库查询结果映射为 Java 对象。

通过使用 <resultMap> 元素,我们可以指定数据库列与 Java 对象属性之间的映射规则。这样,在执行数据库查询时,MyBatis 将会根据映射规则自动将查询结果转换为相应的 Java 对象。

以下是 <resultMap> 元素的概述:

  • 概念<resultMap> 元素用于定义结果映射规则,指示 MyBatis 如何将数据库返回的结果映射为 Java 对象。
  • 作用:通过定义 <resultMap> 元素,我们可以灵活地处理复杂的结果集映射关系,包括简单字段、主键字段、嵌套对象和集合等。
  • 语法<resultMap> 元素位于 MyBatis 映射文件(通常是 XML 文件)的 <mapper> 元素内部。
  • 属性
    • id:必需,给结果映射命名的唯一标识符。
    • type:必需,指定映射到的目标 Java 类型。
  • 子元素<result><id><association><collection> 等子元素用于定义不同类型字段的映射规则。

4.嵌套结果映射之association

嵌套结果映射(Nested Result Mapping)是MyBatis框架中用于处理数据库查询结果与复杂对象之间关联关系的一种技术。在MyBatis中,可以通过使用association元素来定义嵌套结果映射。

association元素用于将一个复杂对象与查询结果进行关联,它会将查询结果中的某些列映射到该对象的属性上。通常情况下,一个复杂对象对应于数据库中的一张表,其中包含了多个字段。

使用association元素需要在映射文件中进行配置,主要包括以下几个方面:

  1. property属性:指定复杂对象对应的属性名。
  2. resultMap属性:指定嵌套结果映射的id,即关联对象的映射规则。
  3. column属性:指定查询结果中关联字段的列名。
  4. javaType属性:指定复杂对象对应的Java类型。

通过以上配置,MyBatis可以根据查询结果自动将数据填充到复杂对象中,并建立起对象之间的关联关系。

嵌套结果映射的好处在于可以通过一次查询操作获取到整个关联对象的信息,减少了多次查询的开销,提高了查询效率

5.resultType与resultMap小结

resultType和resultMap是MyBatis中用于处理查询结果的两种方式。

1. resultType:
   - resultType用于指定单个简单类型的映射关系,例如基本数据类型(如int、String等)或自定义的JavaBean。
   - 使用resultType时,需要在SQL语句中使用列别名,使得查询结果的列与Java对象的属性一一对应。MyBatis会根据列别名将查询结果映射到相应的属性上。
   - resultType适用于查询结果较为简单的情况,不涉及复杂对象之间的关联关系。

2. resultMap:
   - resultMap用于指定复杂对象的映射规则,即将查询结果映射到自定义的Java对象上。
   - 使用resultMap时,需要在映射文件中定义一个或多个resultMap元素,其中包含了对象的属性与查询结果列的映射关系。
   - resultMap可以处理嵌套对象以及一对多、多对一等复杂的关联关系,通过使用association和collection元素来定义对象之间的关联关系。
   - 使用resultMap时,不需要使用列别名,MyBatis根据resultMap的配置信息来进行映射。

总结:
- resultType适用于简单的查询结果映射,适合返回单个简单类型或自定义简单对象。
- resultMap适用于复杂查询结果映射,支持嵌套对象和关联关系的映射。它提供了更灵活和强大的映射能力,但需要在映射文件中进行详细的配置。

根据实际需求和查询结果的复杂程度,可以选择适合的方式来处理查询结果的映射。

6.MyBatis传参方式选择

MyBatis提供了多种传参方式,可以根据具体情况选择适合的方式:

1. 单个参数:
   - 位置参数:将参数作为方法参数直接传入SQL语句中。
   - 命名参数:使用@Param注解给参数取一个名字,并在SQL语句中通过#{paramName}引用。

2. 多个参数:
   - 位置参数:将多个参数按照顺序传入SQL语句中。
   - Map类型:将多个参数封装到Map中,通过键值对的方式传入SQL语句中。
   - JavaBean对象:将多个参数封装到一个JavaBean对象中,通过对象的属性名传入SQL语句中。

3. 动态SQL:
   - 使用&lt;if&gt;标签判断条件,根据不同的条件拼接不同的SQL片段。
   - 使用&lt;choose&gt;、&lt;when&gt;和&lt;otherwise&gt;标签实现多重条件选择。
   - 使用&lt;foreach&gt;标签遍历集合类型的参数。

选择哪种传参方式取决于以下因素:

- 参数的个数和类型:如果只有一个简单的参数,可以选择位置参数或命名参数;如果有多个参数或复杂的参数结构,可以选择Map类型或JavaBean对象。
- 参数的可选性:如果某些参数是可选的,可以使用动态SQL来根据条件进行拼接。
- SQL语句的复杂度:如果SQL语句比较简单,可以选择简单的传参方式;如果SQL语句比较复杂,可能需要使用Map类型或JavaBean对象来传递参数。
- 可读性和维护性:选择传参方式时,也要考虑代码的可读性和维护性,尽量选择清晰和易于理解的方式。

根据具体情况选择传参方式是最佳实践。在选择过程中,需要综合考虑参数的个数、类型、可选性,以及SQL语句的复杂度和代码的可读性。

7.MyBatis缓存

MyBatis提供了缓存机制,可以有效地提高数据库访问性能。下面是关于MyBatis缓存的一些概述:

1. 一级缓存(Local Cache):
   - 一级缓存是MyBatis默认开启的缓存机制,它位于SqlSession的内部。
   - 当执行查询语句时,查询结果会被缓存在SqlSession的一级缓存中。
   - 在同一个SqlSession中,如果再次执行相同的查询语句,MyBatis会直接从一级缓存中获取结果,而不会再去数据库查询。
   - 一级缓存的生命周期与SqlSession一致,即在SqlSession关闭之前有效。
   - 一级缓存是默认开启的,可以使用`clearCache()`方法清除缓存。

2. 二级缓存(Second Level Cache):
   - 二级缓存是基于Mapper级别的缓存,可以共享缓存数据给多个SqlSession使用。
   - 需要手动配置开启二级缓存,并指定具体使用哪个缓存实现,如Ehcache、Redis等。
   - 当执行查询语句并且开启了二级缓存时,查询结果会被缓存在二级缓存中。
   - 在不同的SqlSession中,如果执行相同的查询语句,会从二级缓存中获取结果,而不会再去数据库查询。
   - 二级缓存的生命周期与应用程序的运行时一致,即在应用程序关闭之前有效。

3. 缓存失效:
   - 当执行增删改操作(如insert、update、delete)时,会触发对应的缓存失效机制,使得相关的缓存数据无效。
   - 可以通过配置`flushCache="true"`来强制刷新一级缓存。
   - 可以通过`<cache-ref>`元素将多个Mapper的二级缓存组合使用。

需要注意的是,缓存虽然可以提高性能,但也可能导致数据不一致的问题。当数据库中的数据被修改时,相应的缓存数据也应该被更新或清除,以保持数据的一致性。因此,在使用缓存时,需要仔细考虑缓存策略和数据的实时性需求。

MyBatis提供了一级缓存和二级缓存两种缓存机制,可以根据具体需求选择合适的缓存方式来提升查询性能。同时,要注意缓存失效的情况,并根据业务需求合理配置和管理缓存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值