• MyBatis基础之概念简介


    在这里插入图片描述

    注意
    很多人可能在使用 MyBatis-plus 进行代码开发,MyBatis的这部分内容是用来更好的讲述之后的内容。

    基本概念

    1. 关于 MyBatis

    持久层』可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏,即便实在断电情况下,重新开启系统仍然可以读取到这些数据。

    数据库系统』是最常见的执行持久化工作的工具。

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

    MyBatis 的成功主要有 3 点:

    • 不屏蔽 SQL,意味着可以更为精准地定位 SQL 语句,可以对其进行优化和改造。

    • 提供强大、灵活的映射机制,方便 Java 开发者使用。提供了动态动态 SQL 的功能,允许使用者根据不同条件组装 SQL 语句。

    • 在 MyBatis 中,提供了使用 Mapper 的接口编程,进一步简化了使用者的工作,使开发者能集中于业务逻辑,而非 Dao 层的编写。

    MyBatis 的持久化解决方案将用户从原始的 JDBC 访问中解放出来,用户只需要定义需要操作的 SQL 语句,无须关注底层的 JDBC 操作,就能以面向对象的方式进行持久化层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心。

    
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>${mysql.version}version> 
    dependency>
    
    
    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>${mybatis.version}version> 
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. MyBatis 的体系结构

    MyBatis 中的常用对象有 SqlSessionFactorySqlSession

    SqlSessionFactory 对象是 MyBatis 的关键对象,它对应着单个数据库。

    XML 配置文件
    └── SqlSessionFactoryBuilder
        └── SqlSessionFactory
            └── SqlSession
    
    • 1
    • 2
    • 3
    • 4

    整个关系可以如下述这样"反推":

    • 最终是需要获得一个 SqlSession 对象来操作数据库。SqlSession 对象代表着与数据库之间的连接。

    • 要"弄"到 SqlSession 对象,首先要先"弄"到一个 SqlSessionFactory 对象。

    • 要"弄"到 SqlSessionFactory 对象,首先要先"弄"到一个 SqlSessionFactoryBuilder 对象。

    • 而在这个整个过程中,需要用到 “1 + N” 个配置文件。

    // 这是一个相对于 classpath 的文件路径名。而且,不需要使用 / 。
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(is);
    SqlSession session = factory.openSession(true);
    
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意
    使用完 SqlSession 之后『关闭 Session 很重要』,应该确保使用 finally 块来关闭它。

    • 一个 MyBatis 应用程序只需要一个 SqlSessionFactory 的对象。因此,SqlSessionFactory 对象应该是『单例对象』。在将 Mybatis 和 Spring 整合后,毫无疑问,SqlSessionFactory 单例对象的创建工作就交到了 Spring 手里。
      `
    • SqlSession 是线程不安全的,所以 SqlSession 对象是非单例的。

    3. 使用 XML 构建 SqlSessionFactory

    MyBatis 中的 XML 文件分为两类,一类是『基础配置文件(也叫『核心配置文件』),它只有一个。另一类是『映射文件』,它至少有一个。合计是 1 + N 个配置文件

    基础配置文件』通常叫做 mybatis-config.xml 文件。

    
    DOCTYPE configuration
      PUBLIC "-//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/scott?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"/>
            <property name="username" value="root" />
            <property name="password" value="123456" />
          dataSource>
        environment>
      environments>
    
      
      <mappers>
        
        <mapper resource="mapper/DeptMapper.xml" />
      mappers>
    
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 元素为一个类定义了一个别名,这样在后续使用该类时,可以直接使用别名,而不是它的完全限定名。

    • 元素描述了一个数据库相关信息。

      • 它里面的 元素配置了『事务管理器』 ,这里采用的是 MyBatis 的 JDBC 管理器方式。

      • 它里面的 元素配置了数据库连接的相关信息,其中属性 type=“POOLED” 表示采用 MyBatis 内部提供的连接池方式。

    • 元素代表引入指定的 Mapper 配置文件。

    为了加载 XML 配置文件来构建 SqlSessionFactory 对象。MyBaits 专门提供了 Resources 类来加载配置文件。

    String resource = "mybatis-config.xml";
    SqlSessionFactory factory = null;
    InputStream is = null;
    
    try {
        is = Resources.getResourceAsStream(resource);
        factory = new SqlSessionFactoryBuilder().build(is);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意
    Mybatis 对核心配置文件中的内容(子元素) 出现的『先后顺序有要求』,你可以没有使用到某个子元素,但是如果你用到了,那么必须符合固定的先后顺序:

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

    4. SqlSession

    SqlSession 是 MyBatis 的核心接口。SqlSession 的作用类似于 JDBC 中的 Connection 对象,代表着一个数据库的连接。

    它的作用有 3 个:

    • 获取 Mapper 接口。

    • 发送 SQL 给数据库。

    • 控制数据库事务。

    有了 SqlSessionFactory 创建 SqlSession 就十分简单了:

    SqlSession sqlSession = factory.openSession();
    // 相当于
    SqlSession sqlSession = factory.openSession(false);
    
    • 1
    • 2
    • 3

    由此可见,SqlSession 默认『未开启』事务的自动提交(autoCommit)功能。因此需要程序员手动操作事务。

    另外,如果在建表时,有意或无意使用的是 MyIsam 引擎,那么此处无论是 true ,或者 false ,都无法回滚,因为 MyIsam 数据库引擎本身就不支持事务功能(这是它与 InnoDB 引擎的重要区别之一)

    对初学者而言,建表是错误地使用了数据库引擎,而导致『事务不回滚』的常见原因。

    SqlSession session = null;
    
    try {
        session = factory.openSession();
        // some code ...
        session.commit();    // 提交事务
    } catch (Exception e) {
        session.rollback();    // 回滚事务
    } finally {
        if (session != null)
            session.close();  // 务必确保关闭 session
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5. 默认的别名

    别名Java 类型是否支持数组别名Java 类型是否支持数组
    _bytebyteYbyteByteY
    _shortshortYshortShortY
    _intintYintIntegerY
    _integerintYintegerIntegerY
    _longlongYlongLongY
    _floatfloatYfloatFloatY
    _doubledoubleYdoubleDoubleY
    _booleanbooleanYbooleanBooleanY
    decimalBigDecimalYbigdecimalBigDecimalY
    stringStringYdateDateY
    objectObjectYcollectionCollection
    mapMap——hashmapHashMap——

    6. 补充

    <environments default="...">
      <environment id="...">
        <transactionManager type="..."/>
          <dataSource type="...">
            <property name="driver" value="..."/>
            <property name="url" value="..."/>
            <property name="username" value="..."/>
          <property name="password" value="..."/>
        dataSource>
      environment>
    environments>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    表示事务管理器配置,可选值有:JDBCMANAGED

    属性值说明
    JDBC这个配置表示 MyBatis 底层使用 JDBC 中的 Connection 对象进行事务的提交和回滚。
    MANAGED这个配置表示 MyBatis 底层不进行任何事物的提交和回滚操作,而是由『别人』(容器)来进行事务的操作。
    不过,默认情况下它会关闭连接,而有些容器并不希望如此,
    所以通常使用子元素 来取消这种行为。

    在整合 Spring 和 MyBaits 时,不需要在此配置事务管理器,因为 Spring 会使用其自身的事务管理器来覆盖此处的配置。

    表示数据源配置,其可选值有:UNPOOLEDPOOLEDJNDI

    属性值说明
    UNPOOLED表示不使用连接池,因此每次请求都会打开/关闭连接。
    POOLED表示使用 MyBatis 内部的数连接池功能,此时在底层 Connection 对象会被复用。
    JNDI这表示这数据库连接由容器维护。使用较少。
  • 相关阅读:
    2022 年坑过我的 JAVA 面试题
    前端 | Ajax&Axios模块
    13.8 - 软件测试工作量及成本估算 3.9 - 软件测试成本估算示例
    【操作系统】文件管理(一)—— 文件管理的概述
    C++之STL基础概念、容器、数据结构
    HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码
    企业架构LNMP学习笔记40
    【qml学习笔记】QML与C++的交互
    测试代码1
    FreeRTOS Cortex-M 中断管理
  • 原文地址:https://blog.csdn.net/m0_73393501/article/details/132804018