MyBatis教程大全


 MyBatis SQL 映射

     MyBatis select 标签

     MyBatis 多数据库支持

     MyBatis selectKey 标签作用

     MyBatis @SelectKey注解用法介绍

     MyBatis @SelectKey注解用法详细介绍

     MyBatis keyProperty 属性介绍

     MyBatis insert、update 和 delete 元素

     MyBatis sql 元素

 MyBatis SQL 参数映射

     MyBatis SQL 参数映射

 MyBatis 动态SQL

     MyBatis 动态SQL与数据准备

     MyBatis if 标签

     MyBatis if else 用法

     MyBatis choose、when、otherwise 标签

     MyBatis where 标签

     MyBatis set 标签

     MyBatis foreach 标签

     MyBatis bind 标签

     MyBatis trim 标签

 MyBatis SQL 结果映射

 MyBatis SQL 结果之关系映射

 MyBatis 使用介绍

     MyBatis typeAliases 类型别名

     MyBatis typeHandlers 类型处理器

     MyBatis Transaction 事务接口

     MyBatis transactionManager 事务管理

     SqlSessionFactory 介绍

     MyBatis 核心对象 SqlSession

     MyBatis 初始化 创建 Session 实例

     MyBatis ObjectFactory 对象工厂

     MyBatis缓存机制:一级缓存和二级缓存

     MyBatis 常用注解

 MyBatis 配置文件

     MyBatis 配置文件

 MyBatis 映射

     MyBatis 映射简介

     MyBatis ResultMap 映射

     MyBatis 自动映射

     MyBatis 高级映射

     MyBatis 集合映射

     MyBatis 关联映射

     MyBatis 一对一关联映射

     MyBatis 一对多关联映射

     MyBatis 多对多关联映射

     MyBatis 一对一(注解形式)

     MyBatis 一对多(注解形式)

     MyBatis 多对多(注解形式)

     MyBatis resultMap 元素

 MyBatis 面试题库

     #{}和${}的区别是什么?

     数据库链接中断如何处理?

     数据库插入重复如何处理?

     事务执行过程中宕机的应对处理方式

     Java客户端中的一个Connection问题

MyBatis利用databaseIdProvider属性实现多数据库支持

1、databaseIdProvider 简介

MyBatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃,如下所示,只会执行上面的一条SQL语句:

<select id="getAllProduct" resultType="product" databaseId="mysql">
         SELECT * FROM product
</select>

<select id="getAllProduct" resultType="product">
         SELECT * FROM product
</select>

为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

<!--数据库厂商标示 -->
<databaseIdProvider type="DB_VENDOR">
    <property name="Oracle" value="oracle"/>
    <property name="MySQL" value="mysql"/>
</databaseIdProvider>

说明:

(1)databaseIdProvidertype属性是必须的,不配置时会报错。DB_VENDOR这个属性值使用的是VendorDatabaseIdProvider类的别名。

(2)property子元素是配置一个数据库,其中的name属性是数据库名称,value是我们自定义的别名,通过别名我们可以在SQL语句中标识适用于哪种数据库运行。

2、mysql和oracle两种数据库的应用实例

下面,我们就实现mysql的获取系统时间函数now()和oracle的获取系统时间to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) 的分别执行。

2.1、首先配置 mybatis-config.xml

<properties resource="jdbc.properties" />

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

<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql" />
    <property name="Oracle" value="oracle" />
</databaseIdProvider>

<mappers>
    <mapper class="cn.mybatis.mapper.TimeMapper" />
</mappers>

2.2、定义接口和mapper xml文件

package cn.mybatis.mapper;

public interface TimeMapper {

    String getTime();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.mybatis.mapper.TimeMapper" >

  <select id="getTime"  resultType="string" databaseId="mysql">
   select  now() from dual 
  </select>

  <select id="getTime"   resultType="string" databaseId="oracle">
   select  'oralce'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  from dual 
  </select>

</mapper>

上面的mapper文件具有相同的id,但是它们的databaseId分别是mysqloralce

2.3、设置配置文件:jdbc.properties文件

#driver=com.mysql.cj.jdbc.Driver
#url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
#username=mybatis
#password=mybatis


driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:mybatis
username=mybatis
password=mybatis

maxActive= 50

这个配置文件注销了mysql的链接,启用的是oralce的链接

2.4、编写测试类


import cn.mybatis.mysession.SqlSession;
import cn.mybatis.mysession.SqlSessionFactory;
import cn.mybatis.mysession.SqlSessionFactoryBuilder;

public class Test
{
    public static void main(String[] args)
    {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        try
        {
            TimeMapper mapper = (TimeMapper ) session.getMapper(TimeMapper.class);

            System.out.println(mapper.getTime());
        }
        finally
        {
            session.close();
        }
    }
}

结果说明:如果当前启用的是oracle则执行databaseId="oracle"的语句,否则执行databaseId="mysql"的语句。