MyBatis课堂笔记

引言

在软件开发领域,数据库操作是不可或缺的一部分,而如何高效、灵活地进行数据库访问成为开发者关注的重点。MyBatis作为一款优秀的持久层框架,以其简洁的XML或注解配置方式、强大的动态SQL能力以及良好的封装性,在众多Java项目中得到了广泛应用。本课堂笔记旨在通过理论讲解与实例分析,帮助学习者深入理解MyBatis的核心概念、工作原理及使用方法。

一、MyBatis概述

1.1 MyBatis简介

MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

1.2 MyBatis的优势
  • 简单易学:相对于Hibernate等全自动ORM框架,MyBatis的学习曲线较为平缓,因为它更接近于JDBC,但又比JDBC简单。
  • 灵活性强:MyBatis提供了高度自定义的SQL能力,可以通过XML文件或注解方式灵活地编写SQL语句。
  • 解耦度高:通过映射文件将SQL语句与Java代码分离,提高了代码的维护性和可读性。
  • 性能优越:由于MyBatis直接操作SQL,减少了不必要的封装和转换,因此在某些场景下性能优于全自动ORM框架。

二、MyBatis核心组件

2.1 SqlSessionFactory

SqlSessionFactory是MyBatis的核心接口,用于创建SqlSession。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSessionFactoryBuilder则可以通过读取MyBatis的配置文件(通常是mybatis-config.xml)来构建SqlSessionFactory实例。

2.2 SqlSession

SqlSession是MyBatis中用于执行SQL命令、获取映射器实例和管理事务的核心接口。SqlSession提供了大量的方法来直接执行已映射的SQL语句或存储过程。每个线程都应该有它自己的SqlSession实例,SqlSession的实例不是线程安全的,因此不能被共享。

2.3 Mapper接口

Mapper接口是MyBatis中的一个重要概念,它允许开发者直接通过接口方法调用数据库操作,而无需编写具体的SQL实现代码。Mapper接口需要与Mapper XML文件(或注解)进行绑定,MyBatis通过动态代理机制在运行时为Mapper接口生成代理对象,从而实现对数据库的操作。

三、MyBatis配置

3.1 mybatis-config.xml

MyBatis的全局配置文件是mybatis-config.xml,它包含了MyBatis的运行环境信息,如数据库连接信息、事务管理器配置、映射文件位置等。

  • environments:用于配置数据库连接信息,可以配置多个environment,通过default属性指定默认使用的environment。
  • mappers:用于指定Mapper接口或Mapper XML文件的位置,MyBatis会通过这些信息找到对应的Mapper接口和SQL映射文件。
3.2 Mapper XML

Mapper XML文件是MyBatis中用于定义SQL语句和映射规则的文件。每个Mapper XML文件都对应一个Mapper接口,文件中的namespace属性必须与Mapper接口的完全限定名一致。Mapper XML文件中可以定义<select><insert><update><delete>等标签来映射SQL语句。

四、MyBatis动态SQL

MyBatis提供了强大的动态SQL能力,允许开发者在XML映射文件中编写灵活的SQL语句,以适应不同的查询需求。动态SQL主要包括以下几种元素:

  • if:根据条件包含SQL片段。
  • choose (when, otherwise):相当于Java中的switch语句,用于多个条件分支的选择。
  • where:智能地处理where条件前的“AND”或“OR”。
  • set:智能地处理update语句中的set子句,自动忽略未赋值的字段。
  • foreach:用于遍历集合,常用于构建IN查询条件或批量插入/更新操作。

五、MyBatis事务管理

MyBatis提供了两种事务管理方式:

  • JDBC事务管理:通过控制底层的数据库连接(Connection)的setAutoCommit方法来开启或关闭事务。MyBatis默认使用JDBC事务管理。
  • MANAGED事务管理:将事务管理交给容器(如Spring容器)来管理,这种方式下,MyBatis不会自己控制事务的提交和回滚,而是依赖于外部容器。

六、MyBatis缓存机制

MyBatis提供了两级缓存:一级缓存(SqlSession级别的缓存)和二级缓存(Mapper级别的缓存)。

  • 一级缓存:默认开启,作用域为SqlSession。当同一个SqlSession中执行相同的查询时,会直接从缓存中读取数据,而不需要再次访问数据库。但是,当SqlSession关闭或提交事务后,一级缓存中的数据会被清空

七、MyBatis集成Spring

在实际的项目开发中,MyBatis经常与Spring框架集成使用,以充分利用Spring的依赖注入(DI)和面向切面编程(AOP)等特性。MyBatis-Spring整合包提供了MyBatis和Spring集成的解决方案,使得开发者能够更加方便地在Spring应用中使用MyBatis。

7.1 集成步骤
  1. 添加依赖:在项目的pom.xml文件中添加MyBatis-Spring整合包和MyBatis、Spring等相关依赖。

  2. 配置数据源:在Spring的配置文件中配置数据源(DataSource),用于连接数据库。

  3. 配置SqlSessionFactoryBean:通过配置SqlSessionFactoryBean来创建SqlSessionFactory实例,并指定MyBatis的配置文件位置、数据源等信息。

  4. 配置Mapper扫描:通过MapperScannerConfigurer或@MapperScan注解来自动扫描Mapper接口,并生成对应的Mapper代理对象。

  5. 事务管理:配置事务管理器(TransactionManager),并通过声明式事务管理来管理数据库操作的事务。

7.2 示例配置
 

xml复制代码

<!-- Spring配置文件 -->
<beans>
<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<!-- SqlSessionFactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- Mapper扫描配置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

八、MyBatis插件机制

MyBatis的插件机制允许开发者通过拦截器(Interceptor)的方式,在MyBatis执行SQL语句的过程中插入自定义的逻辑。插件可以用于执行日志记录、权限校验、SQL改写等多种功能。

8.1 插件编写
  1. 实现Interceptor接口:自定义插件类需要实现MyBatis的Interceptor接口,并重写intercept、plugin和setProperties方法。

  2. 配置插件:在MyBatis的配置文件(mybatis-config.xml)或Spring的配置文件中,通过<plugin>标签配置插件。

8.2 插件示例

以下是一个简单的MyBatis插件示例,用于在执行SQL语句前后打印日志:

 

java复制代码

@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class, Object.class}))
})
public class LoggingPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("Before method execution");
Object result = invocation.proceed();
System.out.println("After method execution");
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 可以设置插件的属性
}
}

九、MyBatis最佳实践

  1. 合理设计Mapper接口和XML映射文件:保持Mapper接口方法的简洁明了,每个方法对应一个具体的数据库操作。XML映射文件中的SQL语句应该清晰、易于维护。

  2. 利用MyBatis的动态SQL功能:充分利用MyBatis提供的动态SQL元素,如<if><choose><foreach>等,来编写灵活的SQL语句。

  3. 合理使用缓存:根据实际需求配置MyBatis的一级缓存和二级缓存,以提高查询效率。同时,注意缓存的更新和失效策略,避免脏读等问题。

  4. 注意SQL注入风险:在使用MyBatis时,应尽量避免直接将用户输入拼接到SQL语句中

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值