[Mybatis 应用 一二级缓存/嵌套查询]

本文介绍了MyBatis的一级和二级缓存机制,以及如何配置和使用二级缓存。同时,详细讲解了MyBatis的嵌套查询功能,包括如何定义Mapper接口和SQL语句,以及如何在Java代码中执行嵌套查询,以提高查询效率。
摘要由CSDN通过智能技术生成

目录

🥣前言:

 🥣MyBatis的相关应用:

🥣Mybatis相关配置信息:

🥣MyBatis提供了一级缓存和二级缓存来提升性能

🥣 MyBatis的二级缓存开启:

🥣在全局配置文件中添加 元素来配置二级缓存开关和缓存实现方式。一般需要配置以下两个属性:

🥣以下是一个示例的配置片段:

🥣如果要对整个映射文件启用缓存,则在 标签下添加 标签。

🥣注意事项:

🥣Mybaits嵌套查询:

🥣定义两个Mapper接口和对应的SQL语句。

🥣在对应的Mapper XML文件中编写SQL语句和映射配置。

🥣创建一个新的Mapper接口,用来组合User和Order的数据。

🥣创建一个新的Mapper XML文件,并通过标签组合两个查询。🥣在Java代码中调用Mapper接口的方法,执行嵌套查询。🥣代码分段讲解含义:🥣userWithOrdersResultMap后面返回的数据格式 是什么样的🥣userWithOrdersResultMap 返回的数据格式将是一个包含用户信息以及与该用户关联的订单信息的对象。那么实体类的字段是如何设计的

🥣前言:

 讲解了一下,一二级缓存和嵌套查询相关东西

 🥣MyBatis的相关应用:

MyBatis是一种Java持久层框架,用于将数据库操作与应用程序的业务逻辑分离。它使用XML或注解配置映射关系,提供了简单且直观的API,可以轻松地执行各种数据库操作。

  • 数据库访问:MyBatis可以帮助你执行数据库的增删改查操作,并提供了灵活的映射配置方式。你可以通过编写SQL语句或者使用对象关系映射(ORM)技术来进行数据库操作。

  • 分页查询:MyBatis提供了分页插件,可以方便地在数据库查询中进行分页处理。你可以指定查询的起始位置和每页显示的记录数,MyBatis会自动进行分页查询并返回结果。

  • 缓存管理:MyBatis内置了一级缓存和二级缓存的支持。一级缓存是默认开启的,可以减少对数据库的查询次数;而二级缓存则可以提高多个会话之间的数据共享性能。

  • 动态SQL:MyBatis支持动态SQL语句的构建,在XML配置文件中可以使用条件判断、循环等语句动态生成SQL,以满足不同的查询需求。

  • 嵌套查询:MyBatis支持在一个查询中嵌套执行另一个查询,以解决复杂查询需求。这样可以减少数据库的访问次数,提高查询效率。

  • 事务管理:MyBatis可以与Spring等框架进行集成,提供事务管理功能。你可以使用注解或XML配置的方式管理数据库事务,确保数据的完整性和一致性。

🥣Mybatis相关配置信息:

  • 数据库连接信息:包括数据库的URL、用户名和密码。这些信息用于建立与数据库的连接。

  • 映射文件(Mapper XML):映射文件定义了 SQL 语句与 Java 方法之间的关系。它包含了数据库操作的具体逻辑,如查询语句、插入语句等。

  • 数据库连接池配置:数据库连接池用于管理数据库连接,提高应用程序的性能和可扩展性。可以配置连接池的最大连接数、最小空闲连接数等参数。

  • MyBatis 配置文件(mybatis-config.xml):这个配置文件指定了 MyBatis 的全局配置信息,例如数据库连接池、映射文件路径等。

  • Java 类和数据库表的映射关系:通过注解或者 XML 配置,将 Java 对象与数据库表进行映射,为了能够正确地将结果集映射到 Java 对象中。

  • 数据库驱动配置:指定使用的数据库驱动类。

  • 其他可选的配置项:如缓存配置、插件配置等。

🥣MyBatis提供了一级缓存和二级缓存来提升性能
  • 一级缓存是默认开启的,它位于SqlSession的范围内,也就是在同一个会话中有效。当执行查询操作时,查询结果会被缓存到内存中,下次如果相同的查询再次执行,MyBatis会先从缓存中获取结果,而不需要再次访问数据库。这样可以减少对数据库的查询次数,提高查询效率。
  • 二级缓存是位于SqlSessionFactory的范围内,可以跨多个会话共享数据。当启用二级缓存后,查询结果会被缓存到指定的缓存区域中,比如可以使用Ehcache、Redis等作为缓存介质。当不同的会话执行相同的查询时,MyBatis会先查找二级缓存,如果存在缓存数据,则直接返回结果,而不需要重复查询数据库。这样可以提高多个会话之间的数据共享性能。
  • 需要注意的是,一级缓存和二级缓存的作用范围是不同的。一级缓存是在同一个会话中有效,而二级缓存可以跨多个会话共享数据。另外,二级缓存需要手动配置并启用,而一级缓存是默认开启的。

🥣 MyBatis的二级缓存开启:

  1. 配置MyBatis的全局配置文件(通常是一个XML文件,比如mybatis-config.xml)。

  2. 🥣在全局配置文件中添加 <setting> 元素来配置二级缓存开关和缓存实现方式。一般需要配置以下两个属性:
    • cacheEnabled:设置为 true 表示开启二级缓存,默认是开启的。
    • type:指定缓存实现类,可以使用 MyBatis 提供的默认实现或者自定义的实现。例如,使用默认的 PerpetualCache 实现可以简单地配置为 <setting name="cacheImpl" value="org.apache.ibatis.cache.impl.PerpetualCache"/>
    🥣以下是一个示例的配置片段:
    <configuration>
      <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="cacheImpl" value="org.apache.ibatis.cache.impl.PerpetualCache"/>
      </settings>
      ...
    </configuration>
    

    在映射文件(即Mapper文件)中配置缓存。

  3. 🥣如果要对整个映射文件启用缓存,则在 <mapper> 标签下添加 <cache> 标签。
<mapper namespace="com.example.mapper.UserMapper">
  <cache/>
  ...
</mapper>

如果只想对某个具体的查询语句启用缓存,可以在相应的 <select> 标签上设置 useCache="true"

<select id="getUserById" parameterType="int" resultType="com.example.model.User" useCache="true">
  SELECT * FROM users WHERE id = #{id}
</select>

在其他查询语句中不设置 useCache 属性,或者设置为 false,则该查询语句不使用缓存。

🥣注意事项:

  • 如果开启了二级缓存,记得只对不经常改变的数据启用缓存,以免出现数据不一致的情况。
  • MyBatis的二级缓存默认是基于命名空间(Mapper接口)进行缓存的,不同的命名空间之间的缓存是相互隔离的。
  • 配置二级缓存时还可以使用其他的缓存实现方式,比如使用 Ehcache、Redis 等第三方缓存工具。

配置完成后,MyBatis会自动根据配置开启并使用二级缓存。你可以根据实际需求进行缓存的配置和调整,以提高系统的性能和响应速度。

🥣Mybaits嵌套查询:

在MyBatis中,你可以通过使用<select>标签来实现嵌套查询。具体的步骤如下:

🥣定义两个Mapper接口和对应的SQL语句。
public interface UserMapper {
    User getUserById(int id);
}

public interface OrderMapper {
    List<Order> getOrdersByUserId(int userId);
}
🥣在对应的Mapper XML文件中编写SQL语句和映射配置。
<!-- UserMapper.xml -->
<select id="getUserById" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

<!-- OrderMapper.xml -->
<select id="getOrdersByUserId" resultType="com.example.model.Order">
    SELECT * FROM orders WHERE user_id = #{userId}
</select>

🥣创建一个新的Mapper接口,用来组合User和Order的数据。
public interface UserOrderMapper {
    User getUserWithOrders(int id);
}

🥣创建一个新的Mapper XML文件,并通过<select>标签组合两个查询。

<!-- UserOrderMapper.xml -->
<select id="getUserWithOrders" resultMap="userWithOrdersResultMap">
    SELECT * FROM users WHERE id = #{id};
</select>

<resultMap id="userWithOrdersResultMap" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="com.example.model.Order" select="com.example.mapper.OrderMapper.getOrdersByUserId">
        <id property="orderId" column="order_id"/>
        <result property="productName" column="product_name"/>
    </collection>
</resultMap>
  • <collection>标签中,指定了嵌套查询的结果对象类型和使用的OrderMapper的方法名。通过select属性指定了调用OrderMapper的getOrdersByUserId方法来执行嵌套查询,并将结果映射到主查询的结果对象的相应属性上。

🥣在Java代码中调用Mapper接口的方法,执行嵌套查询。
User user = userMapper.getUserWithOrders(1);

 通过调用getUserWithOrders方法,MyBatis会执行主查询和对应的嵌套查询,并返回查询结果。


🥣代码分段讲解含义:

<select id="getUserWithOrders" resultMap="userWithOrdersResultMap"> SELECT * FROM users WHERE id = #{id}; </select>

这段代码是一个MyBatis的映射配置,用于执行一个查询并将结果映射到一个结果对象中。

  • <select> 标签定义了一个查询语句。
  • id 属性指定了该查询的唯一标识符。
  • resultMap 属性指定了要使用的结果映射配置的标识符。
  • 在这个例子中,getUserWithOrders 是查询的唯一标识符,userWithOrdersResultMap 是用于结果映射的配置标识符。
  • 查询语句是 SELECT * FROM users WHERE id = #{id};,它会从名为 users 的表中选取满足条件 id = #{id} 的行。
  • #{id} 是一个占位符,表示查询时将动态填充的参数。
  • 查询结果将被映射到一个结果对象中,这个结果对象的类型由 resultMap 中的配置决定。在这种情况下,结果对象的类型应该是 userWithOrdersResultMap 中指定的类型。
  • 总结起来,这段代码的含义是定义了一个查询语句,当调用 getUserWithOrders 方法时,MyBatis 会执行该查询,并将结果映射到一个结果对象中,然后返回该结果对象。

🥣userWithOrdersResultMap后面返回的数据格式 是什么样的

<resultMap id="userWithOrdersResultMap" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="com.example.model.Order" select="com.example.mapper.OrderMapper.getOrdersByUserId">
        <id property="orderId" column="order_id"/>
        <result property="productName" column="product_name"/>
    </collection>
</resultMap>
  • 在这个示例中,userWithOrdersResultMap 将结果映射到 com.example.model.User 类型的对象。这个对象应该至少包含 idname 这两个属性。
  • 此外,userWithOrdersResultMap 还定义了一个集合属性 orders,用于映射用户的订单数据。这个集合类型应该是 com.example.model.Order
  • 通过 <id><result> 标签,可以指定如何将查询结果中的列映射到对应的属性上。
  • 所以,根据你的具体映射配置,userWithOrdersResultMap 返回的数据格式将是一个包含用户信息以及与该用户关联的订单信息的对象。具体的数据格式和属性字段根据你的实际配置而定。

🥣userWithOrdersResultMap 返回的数据格式将是一个包含用户信息以及与该用户关联的订单信息的对象。那么实体类的字段是如何设计的

  • 在这个示例中,User 类包含了用户的信息,包括 idname 两个字段。User 类还有一个类型为 List<Order>orders 字段,用于存储与该用户关联的订单信息。
  • Order 类表示订单信息,包含 orderIdproductName 两个字段。
  • 当使用 userWithOrdersResultMap 配置进行结果映射时,MyBatis 将会将查询结果映射到这两个实体类的相应字段上,形成一个包含用户信息以及与该用户关联的订单信息的对象。
public class User {
    private int id;
    private String name;
    private List<Order> orders;

    // 省略构造方法、getter和setter等其他方法

    // Getter和Setter方法省略
}

public class Order {
    private int orderId;
    private String productName;

    // 省略构造方法、getter和setter等其他方法

    // Getter和Setter方法省略
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值