Mybatis的第二天

一.Mybatis
映射文件

MyBatis映射文件(Mapper XML)是用于定义数据库操作和SQL语句与Java方法之间的映射关系的配置文件。它是MyBatis框架中重要的组成部分,用于将数据库操作与Java代码解耦,并提供灵活的映射配置。

在MyBatis中,映射文件通常与对应的Java接口相对应,用于定义接口中的方法与SQL语句之间的映射。映射文件以XML格式编写,包含了一系列的SQL语句、参数映射、结果映射等配置信息。

在MyBatis中,"高级映射"通常指的是使用复杂的技术和技巧来处理对象之间的关联关系、动态SQL等需求。这些技术可以帮助我们更好地处理复杂的数据库操作,并提供更大的灵活性。

以下是一些常见的MyBatis高级映射技术:

  1. 嵌套查询(Nested Queries):在一个查询语句中嵌套另一个查询语句,实现多个对象之间的关联关系的映射。

  2. 关联查询(Association):通过定义结果映射规则,将多表查询的结果映射为包含关联对象的嵌套对象。

  3. 集合查询(Collection):通过定义结果映射规则,将多表查询的结果映射为包含集合对象的嵌套对象。

  4. 动态SQL(Dynamic SQL):使用<if><choose><when><otherwise>等元素编写动态的SQL语句,根据不同的条件生成不同的SQL语句。

  5. 自定义类型处理器(Type Handlers):用于实现数据库类型与Java类型之间的转换,可以根据具体需求自定义类型处理器来处理复杂类型的映射。

这些高级映射技术可以帮助开发者更好地处理复杂的数据库操作需求,提供了灵活而强大的功能。通过合理使用这些技术,可以简化代码编写、提高性能,并实现更精细的对象关联和动态SQL查询。

总结来说,"高级映射"是指在MyBatis中使用一系列复杂的技术和技巧,以满足特定的业务需求,处理对象之间的关联关系、动态SQL等复杂情况。这些技术能够提升开发效率和数据操作的灵活性。

 

映射文件的基本结构如下:

1.命名空间(namespace):指定该映射文件所对应的Java接口的全限定名。

<mapper namespace="com.example.mapper.UserMapper"> ... </mapper>

2.结果映射(resultMap):定义将查询结果映射为Java对象的规则,包括列名与属性名的对应关系、关联关系等。

<resultMap id="userResultMap" type="com.example.domain.User"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="password" column="password" /> ... </resultMap>

SQL语句:

  1. 查询语句(select):用于执行数据库查询操作,并将结果映射为Java对象。

<select id="getUserById" resultMap="userResultMap"> SELECT * FROM user WHERE user_id = #{id} </select>

2.插入语句(insert):用于执行数据库插入操作。

<insert id="insertUser" parameterType="com.example.domain.User"> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert>

3.更新语句(update):用于执行数据库更新操作。

<update id="updateUser" parameterType="com.example.domain.User"> UPDATE user SET username = #{username}, password = #{password} WHERE user_id = #{id} </update>

4.删除语句(delete):用于执行数据库删除操作。

<delete id="deleteUserById" parameterType="int"> DELETE FROM user WHERE user_id = #{id} </delete>

映射文件中还可以包含其他的SQL片段、动态SQL、缓存配置等更复杂的内容,以满足不同的业务需求和灵活的配置。

通过映射文件,我们可以有效地将Java对象与数据库表之间进行映射,并定义各种增删改查操作的SQL语句。在使用MyBatis时,需要将映射文件配置到MyBatis的配置文件或者使用注解方式进行映射关系的绑定。

二.事务管理

MyBatis提供了两种方式来进行事务管理:编程式事务管理和声明式事务管理。

  1. 编程式事务管理:
    • 通过SqlSessionFactory开启一个数据库会话(SqlSession)。
    • 在代码中手动控制事务的开始、提交和回滚操作。
    • 提交事务后关闭数据库会话。

以下是一个示例代码:

SqlSessionFactory sqlSessionFactory = ...; SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 手动开启事务 sqlSession.getConnection().setAutoCommit(false); // 执行数据库操作 // 手动提交事务 sqlSession.commit(); } catch (Exception e) { // 出现异常时手动回滚事务 sqlSession.rollback(); } finally { // 关闭数据库会话 sqlSession.close(); }

  1. 声明式事务管理:
    • 在MyBatis配置文件中配置事务管理器(Transaction Manager)。
    • 在映射文件中使用<transaction>标签声明事务的属性,如隔离级别、超时时间等。
    • MyBatis将自动处理事务的开始、提交和回滚操作。

以下是一个示例配置:

<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置Mapper接口所在包 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean>

在映射文件中使用<transaction>标签声明事务属性:

<mapper namespace="com.example.mapper.UserMapper"> <!-- 声明事务属性 --> <transaction property="propagation" value="REQUIRED" isolation="READ_COMMITTED" timeout="30" /> <!-- 定义SQL语句 --> </mapper>

在以上的示例代码中,MyBatis会根据配置自动管理事务的开启、提交和回滚操作,无需手动编写事务控制代码。

以上就是MyBatis的事务管理方式,开发者可以根据具体的需求选择适合的方式来管理事务,以确保数据的一致性和完整性。

 三.MyBatis的接口封装方法

在MyBatis中,可以使用接口封装方法来简化对数据库的操作。这种方式可以通过编写通用的接口和映射文件,使得开发者只需关注业务逻辑,而不必编写重复的增删改查代码。

以下是一种常见的MyBatis接口封装方法:

  1. 编写通用接口:
    • 创建一个接口,定义通用的数据库操作方法。例如,可以创建一个UserMapper接口。

public interface UserMapper { User getUserById(int id); List<User> getAllUsers(); int insertUser(User user); int updateUser(User user); int deleteUser(int id); }

  1. 编写映射文件:
    • 在映射文件(Mapper XML)中,为每个接口方法配置对应的SQL语句和结果映射规则。例如,创建一个名为UserMapper.xml的映射文件。

<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="getUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <select id="getAllUsers" resultType="User"> SELECT * FROM user </select> <insert id="insertUser" parameterType="User"> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert> <update id="updateUser" parameterType="User"> UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> </mapper>

  1. 配置映射文件:
    • 在MyBatis的配置文件(如mybatis-config.xml)中,将映射文件添加到配置中。

<!-- mybatis-config.xml --> <configuration> <mappers> <mapper resource="com/example/mapper/UserMapper.xml" /> </mappers> </configuration>

  1. 使用接口方法:
    • 在业务代码中,通过获取SqlSession对象并获得接口的实例,即可使用接口方法进行数据库操作。

SqlSessionFactory sqlSessionFactory = ...; try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用接口方法进行数据库操作 User user = userMapper.getUserById(1); List<User> userList = userMapper.getAllUsers(); int rowsAffected = userMapper.insertUser(newUser); // 其他操作... }

通过上述步骤,我们可以将数据库操作的具体实现与业务逻辑解耦,提高代码的可维护性和可读性。同时,通过接口封装方法,我们可以利用MyBatis的强大功能来处理数据库操作,例如参数映射、结果映射、动态SQL等。这种方式使得数据库操作变得简单而灵活,并且易于扩展和维护。

四.Mybatis缓存有哪些?

  1. 一级缓存(本地缓存):

    • 默认情况下,每个SqlSession对象都有一个本地的一级缓存。
    • 一级缓存是基于SqlSession的,生命周期与SqlSession相同。
    • 当多次调用相同的查询语句时,一级缓存会将第一次查询的结果缓存起来,并在后续查询中直接返回缓存的结果,避免了重复查询数据库。
  2. 二级缓存(全局缓存):

    • 二级缓存是基于SqlSessionFactory的,属于全局缓存。
    • 多个SqlSession对象共享同一个二级缓存。
    • 二级缓存可以跨越多个SqlSession,当不同的SqlSession执行相同的SQL语句时,可以从缓存中获取结果。
    • 默认情况下,二级缓存是禁用的,需要在映射文件中进行配置启用。
  3. 自定义缓存:
    • MyBatis允许用户自定义缓存实现,通过实现org.apache.ibatis.cache.Cache接口来创建自定义缓存。
    • 用户可以根据具体需求选择合适的缓存实现方式,如使用第三方缓存库(如Redis、Ehcache)作为MyBatis的缓存实现。

需要注意的是,对于一级缓存和二级缓存,在进行数据的增删改操作时,会自动清空相应的缓存,以保证缓存数据的一致性。

此外,需要了解的是,缓存只适用于在同一个SqlSession中执行的查询操作,并且需要满足缓存的配置条件(如缓存的开启、查询的参数和语句等),否则将不会命中缓存。

缓存的使用可以有效地减少对数据库的访问,提高系统的性能。但在使用缓存时,需要根据具体的业务场景和需求进行合理的配置和管理,谨慎处理缓存的失效和更新问题,以确保数据的一致性和正确性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值