Mybatis

一、JDBC弊端

  1. 重复创建链接和释放链接,造成资源浪费。解决方式:使用连接池
  2. 出现硬编码,体现在数据库驱动,url、用户名密码、sql。解决方式:使用配置文件
  3. 结果获取不方便。解决方式:把结果放到一个POJO中

二、Mybatis的介绍

MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。当前,最新版本是MyBatis 3.5.1 ,其发布时间是2019年4月8日。

MyBatis 是一款支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

三、Mybatis架构

Mybatis架构.jpg
  1. mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  2. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂。
  3. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  4. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  5. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  6. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  • 输入映射(传入的参数)
    支持的数据类型:
    基本数据类型:基础类型以及包装类、String
    POJO
    Map
    包装的POJO:一个pojo中有pojo属性
  1. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
  • 输出映射(产生的结果类型)
    基本数据类型:基础类型以及包装类、String
    POJO
    Map
    List

四、MyBatis xml配置文件层次结构

MyBatis配置文件层次结构.jpg

properties元素

properties是一个配置属性的元素,让开发者能在配置文件的上下文中使用它,MyBatis提供3种配置方式:

  1. property子元素。
  2. properties配置文件。
  3. SqlSessionFactoryBuilder使用Properties文件构建。

property子元素

 

properties配置文件
一般会使用一个单独的properties配置文件来配置属性值,以方便在多个配置文件中重复使用它们,也方便日后维护和随时修改。可以通过${key}的形式,取出在配置文件中配置的值。


    
    

    
        
            
            
                
                
                
                
            
        
    

SqlSessionFactoryBuilder使用Properties文件构建
出于安全考虑,properties配置文件中的账号密码等元素可能是加密的,这个时候就需要对加密的元素进行处理。

    public static void func() throws Exception {
        Properties properties = new Properties();
        properties.load(Resources.getResourceAsStream("datasource.properties"));
        // 对原账号密码解密
        properties.setProperty("username", decode(properties.getProperty("username")));
        properties.setProperty("password", decode(properties.getProperty("password")));

        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // SqlSessionFactoryBuilder可以使用一个InputStream和一个Properties构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is, properties);
    }

三种方式的优先级
MyBatis支持的3种配置方式可能同时出现,并且属性还会重复配置,MyBatis将按照下面的顺序来加载:

  1. 在properties元素体内指定的属性首先被读取。
  2. 根据 properties元素中的resource属性读取类路径下属性文件,或者根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  3. 读取作为build()方法参数传递的属性,并覆盖已读取的同名属性。

因此,通过build()方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是 properties属性中指定的属性。因此,我们尽量不要使用混合的方式来定义配置,首选的方式是使用properties文件。

五、environments环境变量

配置环境可以注册多个环境,每一个环境分为两大部分:一个是数据库源(dataSource)的配置,另外一个是数据库事务(transactionManager)的配置。

    
        
            
            
                
                
                
            
        
    
  1. default:表示默认使用哪个数据源
  2. id:表示数据源的名称
  3. transactionManager的事务类型type一共有三种:JDBC,采用JDBC方式管理事务,独立编码中我们常常使用;MANAGED,采用容器方式管理事务,在JNDI数据源中常用;自定义,由使用者自定义数据库事务管理办法,适用于特殊应用。
  4. property元素配置数据源的各类属性
  5. dataSource的type属性是提供我们对数据厍连接方式的配置:UNPOOLED(非连接池数据库)、POOLED(连接池数据库)、JNDI(JNDI数据源)、自定义数据源。

六、数据源

MyBatis内部为我们提供了3种数据源的实现方式:

  • UNPOOLED,使用org.apache.ibatis.datasource.unpooled.UnpooledDataSource实现。
  • POOLED,使用org.apache.ibatis.datasource.pooled.PooledDataSource实现。
  • JNDI,使用org.apache.ibatis.datasource.jndi.JndiDataSourceFactory实现。

七、数据库事务

数据库事务是交由SqlSession去控制的,我们可以通过SqlSession提交或者回滚。在大部分的工作环境下,我们都会使用 Spring框架来控制它。

八、Mybatis解决jdbc编程的问题

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
  2. Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
  3. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
    解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
  4. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
    解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

你可能感兴趣的:(Mybatis)