Mybatis | 初识Mybatis

本文介绍了Mybatis的基础知识,包括其作为ORM框架的特性、与Hibernate的差异,以及如何下载和使用Mybatis。详细阐述了Mybatis的工作原理,涉及配置文件、SqlSessionFactory的构建和数据库操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识Mybatis


在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


1.什么是Mybatis?

  • MyBatis当前主流Java持久层框架之一,它与Hibernate一样,也是一种ORM框架。因其性能优异,且具有高度的灵活性可优化性易于维护等特点,所以受到了广大互联网企业的青睐,是目前大型互联网项目首选框架
  • MyBatis (前身iBatis )是一个支持普通SQL查询存储过程以及高级映射持久层框架 ( 即操作数据库框架)MyBatis 消除了几乎所有的 JDBC代码参数的手动设置以及对结果集的检索,并使用简单的XML注解进行配置原始映射,用以将接口 和 Java的POJO ( Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想操作数据库
  • MyBatis框架也被称之为ORM ( Object/Relational Mapping,即对象关系映射) 框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象数据库表之间的映射关系,自动将Java应用程序中的对象持久化关系型数据库的表中。
  • ORM框架工作原理如下图所示 :
    在这里插入图片描述
    从上图可以看出,使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象( Persisent Object, PO),而ORM框架则会通过映射关系将这些面向对象操作换成底层的SQL操作
  • 常见的 ORM对象关系映射框架有 : HibernateMyBatis

2.Hibernate 和 MyBatis的区别?

  • Hibernate :
    是一个 全表映射的框架。通常开发者只需定义好持久化对象数据库表映射关系,就可以通过Hibernate提供的方法完成持久层操作。开发者并不需要熟练地掌握SQL语句的编写Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用 JDBC 接口来执行,所以其开发效率会高于MyBatis
    ( Hibernate 优点 : Hibernate开发效率高于Mybatis )

  • 然而Hibernate自身也存在着一些 缺点, 例如 它在多表关联时,对SQL查询支持较差② 更新数据时,需要发送所有字段 不支持存储过程; 不能通过优化SQL来优化性能等。这些问题导致Hibernate只适合在场景不太复杂对性能要求不高项目中使用
    ( Hibernate 缺点 : 只适合在常见不太复杂 且对性能要求不高项目中使用 )


  • MyBatis :

    是一个 半自动映射的框架。这里所谓的“半自动"是相对于Hibernate全表映射而言的,MyBatis 需要手动匹配提供POJO (普通java对象 )、SQL映射关系,而Hibernate 只需提供 POJO映射关系 即可。

  • Hibernate 相比,虽然使用MyBatis 手动编写sql语句要比使用Hibernate的工作量大,但是 MyBatis可以配置动态SQL优化SQL它还支持存储过程 等。对于一些复杂的和需要优化性能的项目来说,使用MyBatis更加合适
    ( MyBatis优点 : 适合在常见不太复杂 且对性能要求不高项目中使用,实际开发中,更倾向于使用Mybatis操作数据库 )

3.Mybatis的下载和使用

4.Mybatis的工作原理

MyBatis框架操作数据库时,大体经过了8个步骤
在这里插入图片描述

  • 第一步、 读取 Mybatis配置文件 (mybatis-config.xml ) :

    • 通过 输入流读取 Mybatis-config.xml 配置文件。

      package com.myh.test;
      
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      
      import java.io.InputStream;
      
      public class MybatisTest {  // 测试类 : 根据id来查询数据
      
          /**
           * 根据客户编号查询客户信息
           */
          public void findCustomerByIdTest() throws Exception{
              //1.读取mybatis框架的配置文件
              String resource = "mybatis-config.xml";
              //通过“输入流”读取mybatis配置文件
              /*
                 在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置,
                 可实施加载“映射文件”
               */
              InputStream inputStream = Resources.getResourceAsStream(resource);
          }
      }
      
      
    • mybatis-config.xml 中现在 要配置内容 : 配置Mybatis运行环境获取数据库的连接

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
      
       <!--
          Mybatis的配置文件: mybatis-config.xml : 为全局配置文件,配置了“运行环境的信息”,
          主要内容是 : 数据库的连接
         -->
          <!--  1.配置环境,默认环境id为mysql  -->
          <environments default="mysql">
              <environment id="mysql">
                  <transactionManager type="JDBC"/>
                  <!--  用于指定MyBatis获取数据库连接的方式。“POOLED”代表的是连接池。 -->
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                      <property name="username" value="root"/>
                      <property name="password" value="root"/>
                  </dataSource>
              </environment>
          </environments>
      
      </configuration>
      
  • 第二步、 加载映射文件 (Mapper.xml ) :
    XxxMapper.xml文件SQL映射文件该文件中配置了操作数据库SQL语句需要在mybatis-config.xml中加载才能执行 )。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中一张表
    加载映射文件 (实际操作为 : ) : 在原mybatis-config.xml配置 XxxMapper.xml文件的位置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <!--  2.配置Mapper文件的位置 : mybatis.config.xml配置文件要读取映射文件: 即读取mapper.xml文件  -->
    <!--  所以此处要映射文件CustomerMapper.xml (因为Mybatis-config.xml要加载"映射文件")  -->
        <mappers>
            <mapper resource="com/myh/CustomerMapper.xml"/>
        </mappers>
    
    </configuration>
    

    此时 mybatis-config.xml配置文件 中的 完整 代码 如 :

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
     <!--
        Mybatis的配置文件: mybatis-config.xml : 为全局配置文件,配置了“运行环境的信息”,
        主要内容是 : 数据库的连接
       -->
        <!--  1.配置环境,默认环境id为mysql  -->
        <environments default="mysql">
            <environment id="mysql">
                <transactionManager type="JDBC"/>
                <!--  用于指定MyBatis获取数据库连接的方式。“POOLED”代表的是连接池。 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--  2.配置Mapper文件的位置 : mybatis.config.xml配置文件要读取映射文件: 即读取mapper.xml文件 (读取映射文件)  -->
        <!--  因为按照"Mybatis框架的执行流程图 : 加载了mybatis-config.xml配置文件之后,是要加载"映射文件"的,所以  -->
        <mappers>
            <mapper resource="com/myh/CustomerMapper.xml"/>
        </mappers>
    
    </configuration>
    
  • 第三步、 构造 会话工厂 (SqlSessionFactory) : 根据 mybatis-config.xml配置文件 构建 会话工厂 : SqlSessionFactory :
    通过 调用 Sql会话工厂生成器”对象 (SqlSessionFactoryBuilder) 的 build( )方法 来构建 会话工厂 :

    package com.myh.test;
    
            import org.apache.ibatis.io.Resources;
            import org.apache.ibatis.session.SqlSessionFactory;
            import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
            import java.io.InputStream;
    
    public class MybatisTest {  // 测试类 : 根据id来查询数据
    
        /**
         * 根据客户编号查询客户信息
         */
        public void findCustomerByIdTest() throws Exception{
    //        //1.读取mybatis框架的配置文件
    //        String resource = "mybatis-config.xml";
    //        //通过“输入流”读取mybatis配置文件
    //        /*
    //           在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置,
    //           可实施加载“映射文件”
    //         */
    //        InputStream inputStream = Resources.getResourceAsStream(resource);
    
            //2.根据配置文件“构建会话工厂 : SqlSessionFactory ”
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
        }
    }
    
  • 第四步、构造 会话对象 (SqlSession) :
    会话工厂 (sqlSessionFactory) 创建
    SqlSession对象
    对象 (SqlSession) 中包含了执行SQL的所有方法

      //3.通过SqlSessionFactory(会话工厂)创建SqlSession("会话"对象)
      SqlSession sqlSession = sqlSessionFactory.openSession();
    
  • 第五步、Executor执行器 :
    MyBatis底层定义了一个Executor接口操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存维护

  • 第六步、MappedStatement对象 :
    Executor接口执行方法中,包含一个MappedStatement 类型参数,该参数是对映射信息封装,用于存储要映射的SQL语句id参数等。

    Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的 id 即是MappedStatement 的 id

  • 第七步输入映射 (Map、List类型、String、Integer等基本数据类型、POJO类型) :
    在执行方法时,MapedStatement对象会对用户执行SQL语句的输入参数进行定义 (可以定义MapList 类型、基本类型POJO类型),Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里对输入参数映射过程就 类似于 JDBC 编程中对 preparedStatement对象设置参数过程

  • 第八步、输出映射 (Map、List类型、String、Integer等基本数据类型、POJO类型) :
    数据库执行完SQL语句后MappedStatement 对象会对SQL执行输出的结果进行定义 (可以定义为MapList类型、基本类型POJO类型),Executor执行器会通过MappedStatement对象在执行SQL语句后,将输出结果映射Java对象中。这种将输出结果映射到 Java对象的过程就类似于JDBC编程中对结果的解析处理过程

  • 第五到 - 第八步 :实际操作 : 大致可以理解为
    通过SqlSession对象操作数据库 (包括查询添加修改删除以及提交事务。)


完成代码例子 (测试类) 如下 :

package com.myh.test;

import com.myh.po.Customer;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;

public class MybatisTest {  // 测试类 : 根据id来查询数据

    /**
     * 根据客户编号查询客户信息
     */
    @Test //Junit4"单元测试"
    public void findCustomerByIdTest() throws Exception{
        //1.读取mybatis框架的配置文件
        String resource = "mybatis-config.xml";
        //通过“输入流”读取mybatis配置文件
        /*
           在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置,
           可实施加载“映射文件”
         */
        InputStream inputStream = Resources.getResourceAsStream(resource);

        //2.根据配置文件“构建会话工厂 : SqlSessionFactory ”
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.通过SqlSessionFactory(会话工厂)创建SqlSession("会话"对象)
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.SqlSession执行"映射文件"中定义的SQL,并返回"映射结果"
        //SelectOne()中的参数为 : "映射文件"中的sql语句 + 该sql语句对应的参数为:1 ---执行获得指定id下的“顾客信息”
        Customer customer = (Customer)sqlSession.selectOne("CustomerMapper.findCustomerById", 1);
        //打印输出结果
        System.out.println(customer.toString());
        //5.关闭SqlSession
        sqlSession.close();
    }
}

5.Mybatis操作的大致步骤

(1) 读取配置文件 (得事先配置好 mybatis-config.xmlXxxMapper.xml映射文件log4j.properties 、通过“输入流”的方式读取配置文件 等)。

(2) 根据mybatis-config.xml 配置文件构建 SqlSessionFactory

(3) 通过SqlSessionFactory创建 SqlSession

(4) 使用SqlSession对象操作数据库(包括查询添加修改删除以及提交事务等)。
通过SqlSession对象的方法 + 映射文件中的sql语句等来操作数据库。

(5) 关闭SqlSession

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值