MyBatis--全局配置

MyBatis--全局配置

一、简介

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

原是Apache的一个开源项目iBatis, 2010年6月这 个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis ,代码于 2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是 一个基于Java的持久层框架。 iBatis提供的持久 层框架包括SQL Maps和Data Access Objects (DAO)。

二、HelloWorld

2.1、MyBatis操作数据库

1、创建MyBatis全局配置文件
MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深 的设置(settings)和属性(properties)信息、如数据 库连接池信息等。指导着MyBatis进行工作。我们可以参照官方文件的配置示例。
2、创建SQL映射文件
映射文件的作用就相当于是定义Dao接口的实现类如何 工作。这也是我们使用MyBatis时编写的最多的文件。

2.2、测试

1、根据全局配置文件,利用SqlSessionFactoryBuilder 创建SqlSessionFactory

public SqlSessionFactory getSqlSessionFactory() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    return new SqlSessionFactoryBuilder().build(inputStream);
}

2、根据SqlSessionFactory创建SqlSession对象

SqlSession openSession = sqlSessionFactory.openSession();

3、使用SqlSession根据id进行操作

/**
 * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
 * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。 
 * 3、将sql映射文件注册在全局配置文件中
 * 4、写代码:
 *      1)、根据全局配置文件得到SqlSessionFactory;
 *      2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
 *          一个sqlSession就是代表和数据库的一次会话,用完关闭
 *      3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
 * 
 * @throws IOException
 */
@Test
public void test() throws IOException {
    // 2、获取sqlSession实例,能直接执行已经映射的sql语句
    // sql的唯一标识:statement Unique identifier matching the statement to use.
    // 执行sql要用的参数:parameter A parameter object to pass to the statement.
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    SqlSession openSession = sqlSessionFactory.openSession();
    try {
        Employee employee = openSession.selectOne(
                "com.atguigu.mybatis.EmployeeMapper.selectEmp", 1);
        System.out.println(employee);
    } finally {
        openSession.close();
    }
}

接口式编程:
使用SqlSession获取映射器进行操作。

@Test
public void test01() throws IOException {
    // 1、获取sqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    // 2、获取sqlSession对象
    SqlSession openSession = sqlSessionFactory.openSession();
    try {
        // 3、获取接口的实现类对象
        //会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
        EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        Employee employee = mapper.getEmpById(1);
        System.out.println(mapper.getClass());
        System.out.println(employee);
    } finally {
        openSession.close();
    }
}

SqlSession
SqlSession的实例不是线程安全的,因此是不能被共享的。
SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的。
SqlSession可以直接调用方法的id进行数据库操 作,但是我们一般还是推荐使用SqlSession获取 到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。

三、MyBatis全局配置文件

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构如下

https://mybatis.org/mybatis-3/zh/configuration.html#properties

3.1、properties属性

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123456

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根 据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

3.2、settings 设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

<!-- 
    2、settings包含很多重要的设置项
    setting:用来设置每一个设置项
        name:设置项名
        value:设置项取值
 -->
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

3.3、typeAliases别名处理器

类型别名是为Java类型设置一个短的名字,方便引用某个类。

<typeAliases>
    <!-- 1、typeAlias:为某个java类型起别名
            type:指定要起别名的类型全类名;默认别名就是类名小写;employee
            alias:指定新的别名
     -->
    <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> -->
    
    <!-- 2、package:为某个包下的所有类批量起别名 
            name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
    -->
    <package name="com.atguigu.mybatis.bean"/>
    
    <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 -->
</typeAliases>

MyBatis已经为许多常见的Java类型内建类响应的类型别别名。他们都是大小写不敏感的,我们在其别名的时候千万不要占用已经存在的别名。

3.4、typeHandlers 类型处理器

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

3.4.1、日期类型的处理器

日期和时间的处理,JDK1.8以前一直是个头疼的 问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实 现全部的JSR310规范了。
日期时间处理上,我们可以使用MyBatis基于 JSR310(Date and Time API)编写的各种日期 时间类型处理器。
MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的。

3.4.2、自定义类型处理器

可以重写类型处理器或创建自己的类型处理 器来处理不支持的或非标准的类型。
步骤:

  • 1)、实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
  • 2)、指定其映射某个JDBC类型(可选操作)
  • 3)、在mybatis全局配置文件中注册

3.5、plugins插件

插件是MyBatis提供的一个非常强大的机制,我们 可以通过插件来修改MyBatis的一些核心行为。插 件通过动态代理机制,可以介入四大对象的任何一个方法的执行。

Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters) 
ResultSetHandler (handleResultSets, handleOutputParameters) 
StatementHandler (prepare, parameterize, batch, update, query) 

3.6、enviroments 环境

MyBatis可以配置多种环境,比如开发、测试和生 产环境需要有不同的配置。
每种环境使用一个environment标签进行配置并指 定唯一标识符。
可以通过environments标签中的default属性指定 一个环境的标识符来快速的切换环境。

3.6.1、enviroment 指定具体环境

id:指定当前环境的唯一标识。
transactionManager、和dataSource都必须有。

<!-- 
4、environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
    environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
        transactionManager:事务管理器;
            type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
                自定义事务管理器:实现TransactionFactory接口.type指定为全类名
        
        dataSource:数据源;
            type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
                        |POOLED(PooledDataSourceFactory)
                        |JNDI(JndiDataSourceFactory)
            自定义数据源:实现DataSourceFactory接口,type是全类名
 -->
<environments default="dev_mysql">
    <environment id="dev_mysql">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>

    <environment id="dev_oracle">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${orcl.driver}" />
            <property name="url" value="${orcl.url}" />
            <property name="username" value="${orcl.username}" />
            <property name="password" value="${orcl.password}" />
        </dataSource>
    </environment>
</environments>

3.6.2、transactionManager

type:JDBC | MANAGED | 自定义

  • JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数 据源得到的连接来管理事务范围。 JdbcTransactionFactory
  • MANAGED:不提交或回滚一个连接、让容器来管理 事务的整个生命周期(比如 JEE 应用服务器的上下 文)。 ManagedTransactionFactory。
  • 自定义:实现TransactionFactory接口,type=全类名/ 别名。

3.6.3、dataSource

type:UNPOOLED | POOLED | JNDI | 自定义

  • UNPOOLED:不使用连接池, UnpooledDataSourceFactory
  • POOLED:使用连接池, PooledDataSourceFactory
  • JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
  • 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
    实际开发中我们使用Spring管理数据源,并进行 事务控制的配置来覆盖上述配置。

3.7、dataSourceProvider 环境

MyBatis 可以根据不同的数据库厂商执行不同的语句。

<!-- 5、databaseIdProvider:支持多数据库厂商的;
     type="DB_VENDOR":VendorDatabaseIdProvider
        作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
        MySQL,Oracle,SQL Server,xxxx
  -->
<databaseIdProvider type="DB_VENDOR">
    <!-- 为不同的数据库厂商起别名 -->
    <property name="MySQL" value="mysql"/>
    <property name="Oracle" value="oracle"/>
    <property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>

Type:DB_VENDOR 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
Property-name:数据库厂商标识。
Property-value:为标识起一个别名,方便SQL语句使用 databaseId属性引用。
DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不 同版本会返回不同的值,所以最好通过设置属性别名来使其变短。

MyBatis匹配规则如下:

  • 1、如果没有配置databaseIdProvider标签,那么databaseId=null。
  • 2、如果配置了databaseIdProvider标签,使用标签配置的name去匹 配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为 null。
  • 3、如果databaseId不为null,他只会找到配置databaseId的sql语句。
  • 4、MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">
<!-- 
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值

public Employee getEmpById(Integer id);
 -->
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select * from tbl_employee where id = #{id}
    </select>
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
        databaseId="mysql">
        select * from tbl_employee where id = #{id}
    </select>
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
        databaseId="oracle">
        select EMPLOYEE_ID id,LAST_NAME lastName,EMAIL email 
        from employees where EMPLOYEE_ID=#{id}
    </select>
</mapper>

3.8、mapper 映射

mapper逐个注册SQL映射文件。
或者使用批量注册:
这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下。

<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<!-- 6、mappers:将sql映射注册到全局配置中 -->
<mappers>
    <!-- 
        mapper:注册一个sql映射 
            注册配置文件
            resource:引用类路径下的sql映射文件
                mybatis/mapper/EmployeeMapper.xml
            url:引用网路路径或者磁盘路径下的sql映射文件
                file:///var/mappers/AuthorMapper.xml
                
            注册接口
            class:引用(注册)接口,
                1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
                2、没有sql映射文件,所有的sql都是利用注解写在接口上;
                推荐:
                    比较重要的,复杂的Dao接口我们来写sql映射文件
                    不重要,简单的Dao接口为了开发快速可以使用注解;
    -->
    <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> -->
    <!-- <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/> -->
    
    <!-- 批量注册: -->
    <package name="com.atguigu.mybatis.dao"/>
</mappers>

评论

暂无

添加新评论