目录
🥣在全局配置文件中添加 元素来配置二级缓存开关和缓存实现方式。一般需要配置以下两个属性:
🥣在对应的Mapper XML文件中编写SQL语句和映射配置。
🥣创建一个新的Mapper接口,用来组合User和Order的数据。
🥣前言:
讲解了一下,一二级缓存和嵌套查询相关东西
🥣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的二级缓存开启:
-
配置MyBatis的全局配置文件(通常是一个XML文件,比如
mybatis-config.xml
)。 -
🥣在全局配置文件中添加
<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文件)中配置缓存。
-
🥣如果要对整个映射文件启用缓存,则在
<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
类型的对象。这个对象应该至少包含id
和name
这两个属性。- 此外,
userWithOrdersResultMap
还定义了一个集合属性orders
,用于映射用户的订单数据。这个集合类型应该是com.example.model.Order
。- 通过
<id>
和<result>
标签,可以指定如何将查询结果中的列映射到对应的属性上。- 所以,根据你的具体映射配置,
userWithOrdersResultMap
返回的数据格式将是一个包含用户信息以及与该用户关联的订单信息的对象。具体的数据格式和属性字段根据你的实际配置而定。
🥣userWithOrdersResultMap 返回的数据格式将是一个包含用户信息以及与该用户关联的订单信息的对象。那么实体类的字段是如何设计的
- 在这个示例中,
User
类包含了用户的信息,包括id
和name
两个字段。User
类还有一个类型为List<Order>
的orders
字段,用于存储与该用户关联的订单信息。Order
类表示订单信息,包含orderId
和productName
两个字段。- 当使用
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方法省略
}