• MyBatis之核心对象及配置文件详解


    一、MyBatis核心对象

    1. SqlSessionFactory

    SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。可以利用SqlSessionFactoryBuilder对象,通过XML配置文件,来构建SqlSessionFactory。

    SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。所以,在构建SqlSessionFactory实例时,建议使用单例模式。

    示范代码:

    package com.clzhang.mybatis.mapper;
    
    import java.io.*;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    /**
     * SqlSessionFactory应该在你的应用执行期间都存在,所以定义一个通用类,所以获取SqlSessionFactory句柄的程序都从这儿获取。
     *
     */
    public class MyBatisSessionFactory {
    
        private static final String MYBATIS_CONFIG_FILENAME = "config/mybatis-config.xml";
        private static SqlSessionFactory sqlSessionFactory = null;
    
        static {
            try {
                InputStream inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_FILENAME);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                throw new RuntimeException("Get resource error:"+MYBATIS_CONFIG_FILENAME, e);
            }
        }
        
        public static SqlSessionFactory getSqlSessionFactory(){   
            return sqlSessionFactory;   
        }
    }

    2. SqlSession

    SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession 对应数据库会话,它不能被共享,也不是线程安全的。

    调用程序片段如下:

        @Override
        public void updateProduct(ProductBean product) {
            SqlSession session = MyBatisSessionFactory.getSqlSessionFactory().openSession();
            try {
                session.update("ProductMapper.updateProduct", product);
                session.commit();
            } finally {
                session.close();
            }
        }

    SqlSession的常用方法

    • T selectOne(String statement);
    • List selectList(String statement);
    • int insert(String statement);
    • int update(String statement);
    • int delete(String statement);
    • void commit(); 
    • void rollback(); 
    • void close(); 
    • T getMapper(Class type); 
    • Connection getConnection(); 

    更多方法,参考:https://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1

     二、MyBatis配置文件,mybatis-config.xml

     configuration为最顶层节点,其余所有的属性都必须嵌套在configuration内

    2.1 properties元素

    properties是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下:
    2.1.1 编写db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=root

    2.1.2 在mybatis-config.xml中配置<properties… />属性

    <properties resource="db.properties" />

    2.1.3 在mybatis-config.xml中配置<dataSource.../>属性

    <dataSource type="POOLED">
        <!-- 数据库驱动 -->
        <property name="driver" value="${jdbc.driver}" />
        <!-- 连接数据库的url -->
        <property name="url" value="${jdbc.url}" />
        <!-- 连接数据库的用户名 -->
        <property name="username" value="${jdbc.username}" />
        <!-- 连接数据库的密码 -->
        <property name="password" value="${jdbc.password}" />
    </dataSource>

    2.2 settings元素
    settings元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。这些配置通常不需要开发人员去干涉,稍作了解即可。配置参考:

     <!-- 设置 -->
     <settings>
         <setting name="cacheEnabled" value="true" />
         <setting name="lazyLoadingEnabled" value="true" />
         <setting name="multipleResultSetsEnabled" value="true" />
         <setting name="useColumnLabel" value="true" />
         <setting name="useGeneratedKeys" value="false" />
         <setting name="autoMappingBehavior" value="PARTIAL" />
    </settings>

    2.3 typeAliases元素
    typeAliases元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。

    2.3.1 使用元素配置别名的方法如下

    <typeAliases>
                 <typeAlias alias="user" type="com.clzhang.mybatis.entity.User"/>
    </typeAliases>

    2.3.2 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:

    <typeAliases>
                 <package name="com.clzhang.mybatis.entity"/>
    </typeAliases>

    注意:如果在程序中使用了注解,则别名为其注解的值。

    2.4 typeHandler元素
    typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。

    2.5 objectFactory元素

    MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

    2.6 plugins元素

    MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。

    2.7 environments元素

    environments元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过environments元素配置多种数据源,即配置多种数据库。

    2.7.1 使用environments元素进行环境配置的示例如下:

        <environments default="development"> 
           <environment id="development"> 
               <transactionManager type="JDBC"/> 
               <dataSource type="POOLED"> 
                  <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> 
                  <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
                  <property name="username" value="mytest"/> 
                  <property name="password" value="test001"/> 
               </dataSource> 
           </environment> 
        </environments> 

    2.7.2 事务管理器的配置(transactionManager)
    在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:

    • JDBC:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
    • MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。

    注意: 如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。

    2.7.3 数据源的配置(dataSource )

    • UNPOOLED 配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
    • POOLED 此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速的响应请求,是当前流行的处理方式。
    • JNDI 可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。

    2.8 databaseIdProviderf元素

    MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。

    2.9 mappers元素

    mappers元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下:

    2.9.1 使用类路径引入

    <mappers>
       <mapper resource="com/clzhang/mybatis/mapper/UserMapper.xml" />
    </mappers>

    2.9.2 使用本地文件路径引入

    <mappers>
        <mapper url="file:///D:/com/clzhang/mybatis/mapper/UserMapper.xml"/>
    </mappers>

    2.9.3 使用接口类引入

    <mappers>
        <mapper class="com.clzhang.mybatis.mapper.UserMapper"/>
    </mappers>

    2.9.4 使用包名引入

    <mappers>
       <package name="com.clzhang.mybatis.mapper"/>
    </mappers>

    本文参考:

    https://www.cnblogs.com/wxdestiny/p/9743686.html

    https://blog.csdn.net/lcachang/article/details/86691237

  • 相关阅读:
    antdvue 全局配置loading
    eslint使用
    chrome浏览器跨域请求cookie丢失问题(一直报验证码错误,因为未携带sessionid)
    [2021BUAA软工_助教博客]作业成绩汇总
    将list按指定大小分为n组
    关于sql中group by使用的一些注意点
    Java调用webservice请求
    windows系统查看用户sid
    高等软工期末作业《课程总结》
    成年人最大的智慧:认清自己
  • 原文地址:https://www.cnblogs.com/nayitian/p/15071390.html
Copyright © 2020-2023  润新知