MyBatis第二章:基本的CRUD操作
在上一章中,我们已经学习了如何配置和使用MyBatis,以及如何进行简单的查询操作。接下来,在这一章节中,我们将学习MyBatis的基本CRUD操作(增删改查),并掌握它们的用法。
1. 创建实体类
首先,我们需要创建一个与数据库表对应的实体类。实体类的属性应该与表的字段相对应,而且还需要提供相应的getter和setter方法。
2. 编写Mapper接口
接下来,我们需要编写Mapper接口,用于定义各种数据库操作的方法。每个方法都应该有对应的SQL语句,并使用注解或XML方式进行映射。
3. 配置Mapper映射文件
在MyBatis的配置文件中,我们需要指定Mapper接口的位置,并为每个Mapper接口配置相应的映射关系。这样,MyBatis就能够自动将方法调用转化为对应的SQL语句执行。
4. 实现CRUD操作
现在,我们可以开始实现CRUD操作了。以下是几个常见的操作示例:
4.1 查询操作
User user = sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", 1);
4.2 插入操作
User user = new User(); user.setName("张三"); user.setAge(20); int result = sqlSession.insert("com.example.mapper.UserMapper.insertUser", user);
4.3 更新操作
User user = new User(); user.setId(1); user.setName("李四"); int result = sqlSession.update("com.example.mapper.UserMapper.updateUser", user);
4.4 删除操作
int result = sqlSession.delete("com.example.mapper.UserMapper.deleteUserById", 1);
5. 测试CRUD操作
我们可以编写一个简单的测试类来验证我们的CRUD操作是否正常工作。在测试类中,我们可以创建一个SqlSession对象,通过它执行各种数据库操作,并使用断言或打印输出来验证结果。
resultMap元素的属性
id:resultMap的唯一标识 type:映射的结果类型 resultMap元素的子元素 id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能 result:指定结果集字段和实体类属性的映射关系 association:映射“多对一”或“一对一”关系 collection:映射“一对多”关系
嵌套结果映射之association
association
复杂的关联类型,映射一个嵌套JavaBean属性
多对一或一对一
属性
property:用来映射查询结果子集的实体属性
javaType:完整Java类名或者别名
resultMap:引用外部resultMap
子元素
id
result
collection
复杂类型集合,映射嵌套结果集到一个列表
一对多
属性
property:实体类中用来映射查询结果子集的集合属性
ofType:集合中元素的类型,完整Java类名或者别名
resultMap:引用外部resultMap
子元素
id
result
resultType与resultMap小结
resultType
直接表示返回类型
适用于比较简单直接的数据封装场景
resultMap
是对外部resultMap的引用
能够处理结果集字段名与实体类属性名不一致、或者需要对连接查询结果使用嵌套映射等较 为复杂的问题
二者本质上都是基于Map数据结构,不能同时使用
自动映射的前提:属性名与字段名一致
自动映射级别:autoMappingBehavior
缓存
MyBatis缓存
一级缓存
二级缓存
一级缓存
一级缓存是MyBatis默认开启的缓存机制,它是基于线程的缓存。
下面是配置一级缓存的步骤:
- 确保在 MyBatis 的配置文件中开启缓存:
<configuration> <!-- 其他配置项 --> <settings> <!-- 开启一级缓存,默认值为 true --> <setting name="localCacheScope" value="SESSION"/> </settings> <!-- 映射文件等其他配置 --> </configuration>
- 确保 SQL 映射文件中的查询语句没有设置
flushCache
属性或属性值为默认的true
。
<select id="getUsers" resultType="User"> SELECT * FROM users </select>
- 在同一个 SqlSession 中重复执行相同的查询语句时,MyBatis 会将结果存储在内存中,以供后续查询使用。
需要注意以下几点:
- 一级缓存只在同一个 SqlSession 内有效,不同的 SqlSession 之间无法共享缓存。
- 当进行 insert、update、delete 操作时,会清空当前 SqlSession 的一级缓存。
- 如果希望禁用一级缓存,可以将 MyBatis 的配置文件中的
<setting name="localCacheScope" value="SESSION"/>
修改为<setting name="localCacheScope" value="STATEMENT"/>
。
二级缓存的配置
二级缓存是MyBatis提供的一种跨SqlSession的缓存机制,可以在不同的SqlSession之间共享缓存。
下面是配置二级缓存的步骤:
- 确保在 MyBatis 的配置文件中开启缓存:
<configuration> <!-- 其他配置项 --> <settings> <!-- 开启二级缓存,默认值为 true --> <setting name="cacheEnabled" value="true"/> </settings> <!-- 映射文件等其他配置 --> </configuration>
- 在需要启用二级缓存的 Mapper 接口对应的 XML 文件中添加
<cache>
标签,并指定缓存类型,通常使用默认的org.apache.ibatis.cache.impl.PerpetualCache
:
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
-
确保需要进行缓存的查询语句没有设置
flushCache
属性或属性值为默认的true
。 -
如果需要特定的 Mapper 接口禁用缓存,可以在接口上使用
@CacheNamespace(implementation = org.apache.ibatis.annotations.CacheNamespace.class, readOnly = true)
注解。
需要注意以下几点:
- 默认情况下,MyBatis使用的是PerpetualCache作为二级缓存的实现,它将缓存对象永久存储在内存中。
- 如果希望使用其他的缓存实现,可以通过在
<cache>
标签中添加type
属性来指定自定义的缓存实现类。 - 二级缓存默认是开启的,如果希望禁用二级缓存,可以将 MyBatis 的配置文件中的
<setting name="cacheEnabled" value="true"/>
修改为<setting name="cacheEnabled" value="false"/>
。