当前位置: 首页 > news >正文

深入浅出MyBatis:全面解析与实战指南

MyBatis 是一个优秀的持久层框架,它简化了 Java 应用与关系数据库之间的映射。对于大多数 Java 开发者而言,掌握 MyBatis 是必不可少的一部分。本文将详细介绍 MyBatis 的各个方面,包括其基本原理、配置、操作、动态 SQL、插件机制和高级应用等,帮助你全面了解和熟练使用 MyBatis。

一、MyBatis 简介

1.1 什么是 MyBatis

MyBatis 是一款支持定制 SQL、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的 JDBC 代码以及手动设置参数和获取结果集的过程。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain Old Java Objects)为数据库中的记录。

1.2 MyBatis 的特点

  • 灵活性高:可以使用原生的 SQL 语句,自由度高,适应复杂的 SQL 查询。
  • 易于集成:能够轻松集成到 Spring 框架等其他流行框架中。
  • 性能优异:支持高效的缓存机制。
  • 动态 SQL:支持动态 SQL 的生成。

二、MyBatis 的基本原理与架构

2.1 MyBatis 的工作原理

MyBatis 通过 SQL 映射文件或注解,将 SQL 语句和 Java 方法关联起来,并通过配置文件管理数据库连接池和事务。其核心组件包括 SqlSessionFactory、SqlSession、Mapper 等。

2.2 MyBatis 架构

  • Configuration:MyBatis 的核心配置类,包含所有配置信息。
  • SqlSessionFactory:创建 SqlSession 实例的工厂。
  • SqlSession:MyBatis 与数据库交互的主要接口,提供了执行 SQL、获取映射器等方法。
  • Mapper:MyBatis 中的数据映射接口,定义数据库操作方法。

三、MyBatis 的基本配置

3.1 配置文件

MyBatis 的配置文件一般分为主配置文件(mybatis-config.xml)和映射文件(mapper.xml)。

3.1.1 主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
3.1.2 映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" parameterType="int" resultType="Blog">SELECT * FROM Blog WHERE id = #{id}</select>
</mapper>

3.2 MyBatis 配置详解

  • environments:配置环境信息,可以设置多个环境(development、production等)。
  • transactionManager:事务管理器配置,通常有 JDBC 和 MANAGED 两种类型。
  • dataSource:数据源配置,常见的类型有 UNPOOLED、POOLED 和 JNDI。

四、MyBatis 的基本操作

4.1 SqlSessionFactory 的创建

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

4.2 SqlSession 的使用

try (SqlSession session = sqlSessionFactory.openSession()) {Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);System.out.println(blog);
}

4.3 Mapper 的使用

4.3.1 定义接口
public interface BlogMapper {Blog selectBlog(int id);
}
4.3.2 映射 XML 文件
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" parameterType="int" resultType="Blog">SELECT * FROM Blog WHERE id = #{id}</select>
</mapper>
4.3.3 调用 Mapper
try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);System.out.println(blog);
}

五、动态 SQL

5.1 if 标签

<select id="findActiveBlogWithTitleLike" resultType="Blog">SELECT * FROM Blog WHERE state = 'ACTIVE'<if test="title != null">AND title like #{title}</if>
</select>

5.2 choose 标签

<select id="findBlog" resultType="Blog">SELECT * FROM Blog WHERE state = 'ACTIVE'<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

5.3 trim、where 和 set 标签

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim><where>...
</where><set>...
</set>

5.4 foreach 标签

<select id="selectPostIn" resultType="domain.blog.Post">SELECT * FROM Post WHERE id IN<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

六、MyBatis 插件机制

6.1 插件接口

@Intercepts({@Signature(type= Executor.class,method = "update",args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {public Object intercept(Invocation invocation) throws Throwable {return invocation.proceed();}public Object plugin(Object target) {return Plugin.wrap(target, this);}public void setProperties(Properties properties) {// 设置属性}
}

6.2 注册插件

<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="someProperty" value="100"/></plugin>
</plugins>

七、MyBatis 高级应用

7.1 MyBatis 与 Spring 的集成

7.1.1 配置 DataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/>
</bean>
7.1.2 配置 SqlSessionFactoryBean
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:org/mybatis/example/*.xml"/>
</bean>
7.1.3 配置 MapperScannerConfigurer
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.mybatis.example"/>
</bean>

7.2 MyBatis 二级缓存

7.2.1 配置缓存
<cache eviction="LRU"flushInterval="60000"size="512"readOnly="true"/>
7.2.2 使用缓存
try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog1 = mapper.selectBlog(101);Blog blog2 = mapper.selectBlog(101);System.out.println(blog1 == blog2); // true
}

八、总结

本文详细介绍了 MyBatis 的各个方面,从基本概念、配置、操作、动态 SQL 到插件机制和高级应用。希望通过这篇文章,你能

对 MyBatis 有一个全面而深入的了解,能够在实际项目中灵活应用 MyBatis 来处理各种复杂的数据库操作。

相关文章:

  • 蓝牙耳机怎么连接电脑?轻松实现无线连接
  • 10.错误处理
  • 开源大模型的新星:ChatGPT-Next-Web 项目解析与推荐
  • 百度网盘限速解决办法
  • 构建LangChain应用程序的示例代码:33、如何在LangChain框架中使用HumanInputChatModel来模拟人工输入的聊天模型教程
  • 二分查找总结:算法原理,适用题型,经典题单
  • 禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作
  • java是值传递还是引用传递?
  • 【C++课程学习】:类和对象(拷贝构造和运算符重载)
  • stm32MP135裸机编程:修改官方GPIO例程在DDR中点亮第一颗LED灯
  • c++ 函数内对象的释放
  • Django序列化器详解:普通序列化器与模型序列化器的选择与运用
  • 如何将ai集成到项目中,方法二
  • 【C++】map和set
  • 打造专属 Switch 模拟游戏机
  • bootstrap创建登录注册页面
  • C++类的相互关联
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS 三角实现
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6 ...操作符
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js写一个简单的选项卡
  • Median of Two Sorted Arrays
  • overflow: hidden IE7无效
  • Redis中的lru算法实现
  • SegmentFault 2015 Top Rank
  • spring boot 整合mybatis 无法输出sql的问题
  • 高性能JavaScript阅读简记(三)
  • 后端_ThinkPHP5
  • 简单数学运算程序(不定期更新)
  • 前端面试总结(at, md)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 首页查询功能的一次实现过程
  • 推荐一个React的管理后台框架
  • 我这样减少了26.5M Java内存!
  • 怎么将电脑中的声音录制成WAV格式
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Java NIO(一)FileChannel
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #stm32整理(一)flash读写
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (libusb) usb口自动刷新
  • (Python) SOAP Web Service (HTTP POST)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (待修改)PyG安装步骤
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (十)T检验-第一部分
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一) storm的集群安装与配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)