MyBatis的深度理解

什么是 MyBatis?

在这里插入图片描述

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

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

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

Mybatis架构图

MyBatis的深度理解_第1张图片

Mybatis相对JDBC有哪些优势

JDBC:

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

MyBatis:

  1. Mybatis对JDBC对了封装,可以简化JDBC代码;
  2. Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率;
  3. Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译。
  4. 对查询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",
      "  ",
      "    username=#{username},",
      "    password=#{password},",
      "    email=#{email},",
      "    bio=#{bio}",
      "  ",
      "where id=#{id}",
      "script>"})
    void updateAuthorValues(Author author);

SqlSession

你可能感兴趣的:(SSM框架实战系列,mybatis,spring,java,后端)