Mybatis使用详解

一、mybatis的介绍

        MyBatis是一种开源的Java持久化框架,它提供了一个简单而强大的方式来将Java对象与数据库之间进行映射。MyBatis在数据库访问层中起到了ORM(对象关系映射)的作用,使开发人员可以通过Java编程而不是SQL来进行数据库的操作。

1. MyBatis的主要特点和优势

  • 简单易用:

        MyBatis相对于其他ORM框架来说,配置简单、学习曲线较低,使用起来非常方便。

  • 灵活性:

        MyBatis并不强制开发人员完全使用对象映射的方式,可以使用原生SQL语句,从而灵活地控  制数据库操作。

  • 高性能:

        MyBatis直接使用JDBC执行SQL,没有额外的ORM操作开销,因此在性能上表现优异。

  • 可定制性:

        MyBatis提供了许多插件和扩展点,允许开发人员根据需要定制和扩展框架的功能。

  • 动态SQL:

        MyBatis支持动态SQL,可以根据条件动态生成SQL语句,避免了硬编码和大量重复代码。

  • 支持存储过程和高级映射:

        MyBatis支持存储过程的调用,并且提供了高级映射功能,可以处理复杂的数据库关系。

  • 缓存支持:

        MyBatis内置了一级缓存和二级缓存,可以提高查询性能。

  • 注解支持:

        除了XML配置外,MyBatis还支持使用注解来配置映射关系和SQL语句,使得代码更加紧凑。

2. 小结

        MyBatis是一个功能强大、灵活且高性能的Java持久化框架,适用于各种规模的项目,特别是对于那些需要更多底层数据库操作控制的应用程序。它的使用可以减少大量的JDBC编码,并提供了很好的数据库访问抽象层。

二、MyBatis的配置(常用配置)

1. 引入MyBatis依赖(同时引入mysql驱动)



    org.mybatis
    mybatis
    3.5.0




    mysql
    mysql-connector-java
    8.0.28

2. mybatis-config.xml配置文件

        新建一个mybatis-config.xml文件在resource目录下作为mybatis的核心配置文件。





    
    
    
        
        

        

        




        
        
        
        
    


    
        
    

    
        
        
            

        
    
    
    
        
        
            
            
            
            
                
                
                
                
                
                
            
        
    
    




    
    
        
        
    


3. 配置文件属性介绍

(1)properties属性

        用于配置外部属性,这些属性可以在整个 MyBatis 配置文件中引用。它允许将一些常用的配置参数抽离出来,使得配置文件更加简洁和易于维护。


        上图就是引入了一个jdbc的配置文件,其内容如下(resource属性代表resource资源目录下的某个配置文件):

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_database?serverTimezone=GMT&useSSL=false
jdbc.username=root
jdbc.password=root

        数据库8.0以上需要使用com.mysql.cj.jdbc.Driver,5.0则使用com.mysql.jdbc.Driver

(2)settings属性(常用)

  • logImpl:指定MyBatis所用日志的具体实现,未指定时将自动查找,值包括:SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。(常用的为STDOUT_LOGGING,即配置运行的sql在控制台打印输出)
  • autoMappingBehavior:指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。
  • mapUnderscoreToCamelCase:是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN 映射到经典Java属性名aColumn。
  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType属性来覆盖该项的开关状态。
  • cacheEnabled:全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。(使用MyBatis二级缓存时开启)

        更多的设置可以参考MyBatis的官方文档MyBatis官方配置

(3)typeAliases属性

        用于为 Java 类型或包起一个别名。使用别名可以简化 MyBatis 配置文件,使得配置更加清晰、简洁,并且方便在映射文件中引用 Java 类型。它允许你为常用的 Java 类型指定别名,包括 Java 基本数据类型、Java 内置对象类型,以及自定义的 Java 类。通过定义别名,你可以在 MyBatis 配置文件和映射文件中使用别名来代替完整的 Java 类名,从而减少了冗余的全限定类名,提高了配置文件的可读性。

        下面就是为某个包下的所有实体类统一设置别名



    

        或者通过指定某一个全限定类名来设置别名,具体如下

 

(4)plugins属性

        用于配置插件(Plugins)。插件是一种可以在 MyBatis 执行过程中拦截方法调用,并对其进行自定义处理的组件。通过使用插件,我们可以在不修改原始代码的情况下,增强 MyBatis 的功能或添加自定义的功能。

        其允其许你在 MyBatis 配置文件中声明一个或多个插件,并按顺序将它们应用于 SQL 语句执行过程中的不同阶段。每个插件都必须实现 MyBatis 的 Interceptor 接口,该接口包含了 intercept方法,用于在方法调用前后执行自定义逻辑。

在mybatis配置中常用的插件为分页插件,下面是引入分页插件:


    
    
    
        
        
        
    

(5)environments属性

        用于定义数据源环境。MyBatis 可以配置多个不同的数据源环境,每个环境对应不同的数据库连接配置,这样在不同的场景下可以切换不同的数据库配置。

        其包其含一个或多个 environment 子元素,每个 environment 子元素用于定义一个数据源环境。在每个 environment 子元素中,需要指定一个数据源(DataSource)和一个事务管理器(TransactionManager)。

        通常情况下,MyBatis 数据库连接池常用的实现是 POOLED,它使用了内置的连接池来管理数据库连接。除了 POOLED,MyBatis 还支持其他数据源实现,比如 UNPOOLEDJNDI

        下面是一个常用环境配置:

 
    
        
        
            
            
            
            
                
                
                
                
                
                
            
        
    

        这里结合了上面引入的配置文件的标签,从而实现一个动态的数据库配置设置。

(6)mappers属性

        用于指定映射器(Mapper)文件的位置。Mapper 文件用于定义 SQL 映射,即将 Java 对象与数据库表之间的映射关系。

        其允许你在 MyBatis 配置文件中声明一个或多个映射器文件,这些文件可以是 XML 格式的映射器文件或者是注解方式的映射器接口。

常用的方法有:

        指定mapper映射文件所对应的接口。


  

        指定某个mapper映射文件。


  

        上述两种方式在每次新建一个mapper对象时都需要再次指定新的文件,所以一般采用下面的方式一次性指定某个包,所有在这个包下的映射文件都会被映射。


    
        
        
    

        注意:mapper映射文件和其对应的接口应该在同一个路径下且同名。

Mybatis使用详解_第1张图片

(7)小结

        其他的配置属性不太常用,如果有业务需要可以参考官方文档mybatis官方文档中文版。

        还有一个注意点是,所有的配置的属性需要按照一定的顺序进行摆放,否则会报错,顺序如下(从上到下)

Mybatis使用详解_第2张图片

三、MyBatis的使用

1. 创建mapper接口

        在java目录下新建一个名为xxx.xxx.mapper的包,并创建实体类所对应的mapper接口。

Mybatis使用详解_第3张图片

        接口中定义我们操作数据库所使用到的抽象方法。

Mybatis使用详解_第4张图片

2. 创建mapper.xml映射文件

        在resource目录下同样新建一个xxx.xxx.mapper的包,并摆放mapper接口说对于的xml映射文件。

Mybatis使用详解_第5张图片


        同理,在接口对应的xml文件中实现接口中的查询方法。 ​​​

Mybatis使用详解_第6张图片

         xml映射文件模板如下:






3. 使用注解(可与xml映射文件一同使用)

        在实现接口上添加注解来实现数据库操作(对于简单的操作使用注解方式开发,复杂操作则通过使用编写mapper映射文件的方式)

Mybatis使用详解_第7张图片

4. 创建测试类

         在Test目录下创建一个对应的测试类,并测试方法。

Mybatis使用详解_第8张图片

        使用MyBatis进行数据库操作的前提需要有以下几个步骤:

  1. 创建 SqlSessionFactory:在应用程序启动时,通过配置文件创建一个 SqlSessionFactory实例。SqlSessionFactory是 MyBatis 的主要入口,它负责创建 SqlSession对象。

  2. 创建 SqlSession:每次进行数据库操作前,需要从 SqlSessionFactory 中获取一个 SqlSession 实例。SqlSession 提供了执行 SQL 查询、提交事务、关闭资源等操作的方法。

  3. 调用 Mapper 方法:在 SqlSession 中,你可以通过调用映射器接口(或者 XML 映射器文件中定义的方法)来执行 SQL 查询。MyBatis 会将方法调用映射到对应的 SQL 语句,并执行数据库操作。

  4. 处理结果:根据 Mapper 方法的返回类型,你可以得到数据库查询结果。如果是查询单个对象,可以得到一个 Java 对象;如果是查询多个结果,可以得到一个列表。

  5. 提交事务和关闭资源:如果进行了数据库修改操作,需要调用 commit() 方法提交事务。最后,记得调用 close() 方法关闭SqlSession资源,释放连接池资源。

        其具体实现为

Mybatis使用详解_第9张图片

         工具类代码为:

public class SqlSessionUtil {
    public static SqlSession getSqlSession() {
        try {
            String resource = "mybatis-config.xml";
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
            return sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

四、mapper文件内标签详解

        在 MyBatis 的 Mapper 文件中,有一些常用的标签,用于定义 SQL 映射和配置与数据库操作相关的信息。以下是这些标签的详细解释:

1.  

  • 作用:Mapper 文件的根元素,用于标识该文件是一个 Mapper 文件。
  • 属性:
    • namespace:指定 Mapper 接口或类的完整路径,用于与对应的 Java 接口或类建立映射关系。

2.  

  • 作用:用于定义查询结果与 Java 对象之间的映射关系。
  • 属性:
    • id:结果映射的唯一标识。
    • type:映射结果集的目标 Java 类型。
    • extends:可选属性,用于继承父 resultMap,实现结果映射的复用。
  • 子元素:
    • :用于定义主键属性与数据库字段的映射关系。
    • :用于定义非主键属性与数据库字段的映射关系。
    • :用于定义一对多(或多对多)关联关系的映射。
    • :用于定义一对一(或多对一)关联关系的映射。

3.  

  • 作用:用于定义主键属性与数据库字段的映射关系。
  • 属性:
    • property:Java 对象的属性名。
    • column:数据库表中的列名。

4.  

  • 作用:用于定义非主键属性与数据库字段的映射关系。
  • 属性:
    • property:Java 对象的属性名。
    • column:数据库表中的列名。

5.

  • 作用:用于定义一对多(或多对多)关联关系的映射。
  • 属性:
    • property:Java 对象中表示集合属性的属性名。
    • ofType:集合元素的类型,可以使用别名或完整类名。
    • select:可选属性,用于指定关联对象的查询语句。
    • fetchType:可选属性,用于指定关联对象的加载策略,可以是 lazy 或 eager。
  • 子元素:
    • :用于定义主键属性与数据库字段的映射关系。
    • :用于定义非主键属性与数据库字段的映射关系。
    • :用于定义一对一(或多对一)关联关系的映射。

6.

  • 作用:标签用于定义一对一关联关系的映射。
  • 属性:
    • property:Java 对象中表示关联属性的属性名。
    • javaType:关联对象的类型,可以使用别名或完整类名。
    • select:可选属性,用于指定关联对象的查询语句。
    • fetchType:可选属性,用于指定关联对象的加载策略,可以是 lazy 或 eager。
  • 子元素:
    • :用于定义主键属性与数据库字段的映射关系。
    • :用于定义非主键属性与数据库字段的映射关系。

7.