MyBatis的深度理解

it2026-01-27  5

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

Mybatis的概念:(对比架构图)

读取Mybatis核心配置文件 获取SqlSessionFactory工厂对象 获取Sqlsesssion对象(true表示自动提交事物,false表示手动提交事务) 执行sql语句(EmpMapper.xml), 返回处理结果(参数: namespace.id) 输出控制台

Mybatis架构图

Mybatis相对JDBC有哪些优势

JDBC:

使用JDBC访问数据库有大量重复代码(比如注册驱动、获取连接、获取传输器、释放资源等);JDBC自身没有连接池,会频繁的创建连接和关闭连接,效率低;SQL是写死在程序中,一旦修改SQL,需要对类重新编译;对查询SQL执行后返回的ResultSet对象,需要手动处理,有时会特别麻烦;

MyBatis:

Mybatis对JDBC对了封装,可以简化JDBC代码;Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率;Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译。对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象。

总之,Mybatis框架大于JDBC

Mybatis中的占位符

#{}占位符

增删改查操作中,SQL语句中的值是写死在SQL语句中的,而在实际开发中,此处的值往往是用户提交过来的值,因此这里我们需要将SQL中写死的值替换为占位符。

${}占位符

那么如果我们在传递的时候不是一个参数值,而是一个SQL片段呢?

加入log4j日志框架

在项目中加入log4j的配置文件,用于打印日志信息,便于开发调试。

在src(或相似的目录)下创建log4j.properties如下:

# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis默认使用log4j作为输出日志信息。

动态SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦。利用动态 SQL,可以彻底摆脱这种痛苦。

if

<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </select>

choose、when、otherwise

想从所有条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

<select id="findActiveBlogLike" 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>

foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历

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

script

带注解的映射器接口类中使用动态 SQL,可以使用 script 元素

@Update({"<script>", "update Author", " <set>", " <if test='username != null'>username=#{username},</if>", " <if test='password != null'>password=#{password},</if>", " <if test='email != null'>email=#{email},</if>", " <if test='bio != null'>bio=#{bio}</if>", " </set>", "where id=#{id}", "</script>"}) void updateAuthorValues(Author author);

SqlSession

最新回复(0)