初识MyBatis框架(四大核心组件和配置文件)

一、概述

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

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

优点:

  1. 简单易学,本身比较小巧。
  2. 不屏蔽SQL语句,我们可以根据自己的需求去编写优化SQL语句。
  3. 映射机制十分灵活,支持动态SQL、存储过程。
  4. 映射器创建简单,只需一个接口和一个XML文件即可。

缺点:
需要手动编写SQL语句和映射规则,某些情况下会加大工作量

官网帮助文档:http://www.mybatis.org/mybatis-3/zh/index.html

二、四大核心组件

  • SqlSessionFactoryBuilder(构造器): 根据配置或代码生成SqlSessionFactory,采用分步构建的Builder模式,创建成功SqlSessionFactory后就失去了作用。
  • SqlSessionFactory(工厂接口):使用它来生成SqlSession接口对象,使用工厂模式。你可以认为它是一个数据库连接池,为了避免它被多次创建,消耗数据库资源,一般我们采用单例模式创建,存活于整个mybatis中。
  • SqlSession(会话):即可发送SQL执行返回结果,又可获取mapper的接口。相当于一个数据库连接对象,可以在一个事务里面执行多条SQL,通过commit、rollback进行提交或回滚事务。存活于一个业务逻辑中,处完成后为避免消耗数据库资源,可以使用try…catch…finally确保将其关闭,
  • SQL Mapper(映射器):由一个Java接口和XML文件(或注解)构成。根据编写的SQL和映射规则,实现对数据库的访问,并返回结果。存活于一个请求中,一但请求完毕后,就会废弃。

1、SqlSessionFactory的创建

SqlSessionFactory可以通过两种方式进行创建,一种是java代码生成,一种是读取XML配置文件生成。一般大家都使用XML模式进行创建,因为修改时比较方便,方便日后的管理,其次看起来也比较直观。

XML文件创建:

这是一个简单mybatis的配置文件,只配置了数据库。一般都是以mybatis-config.xml命名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--数据库环境 -->
    <properties resource="jdbc.properties"/>
   <environments default="development">
       <environment id="decelopment">
           <transactionManager type="JDBC" />
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis_studydb"/>
               <property name="username" value="root"/>
               <property name="password" value=""/>
           </dataSource>
       </environment>
   </environments>
</configuration>

有了数据库环境,我们就可以简单生成SqlSessionFactory了

// 配置文件放到了resources文件夹中
// 如果你放到了一个包中,你可以这样找到它 com/lzx/config/mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);//读取配置文件
MySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
java代码创建
// 配置数据库
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_studydb");
dataSource.setUsername("root");
dataSource.setPassword("");
// 关闭事务的自动提交
dataSource.setDefaultAutoCommit(false);
// 采用Mybatis的JDBC的事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
// 加入映射器
configuration.addMapper(BlogMapper.class);
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration)

2、掌握SqlSession的使用

mybatis中SqlSession是它的核心接口,有两个实现类:DefaultSqlSession和SqlSessionManager,其中DefaultSqlSession是在单线程中使用的,SqlSessionManager是在多线程中使用的。

SqlSession共有一下三个作用:

  1. 获取Mapper接口

  2. 发送SQL给数据库

  3. 控制数据库事务

     //这里的sqlSessionFactory是上面SqlSessionFactory创建出来的·
     SqlSession session =  sqlSessionFactory.openSession();
     try {
         // do work
         sqlSessionFactory.commit();
     } catch (Exception e){
         sqlSessionFactory.rollback();  
     } finally {
         session.close();
     }
    

3、了解映射器

映射器是MyBtis中最为重要、最复杂的组件。可以通过XML文件和注解的形式去实现。可以用来配置以下内容:

  • 描述映射规则
  • 编写SQL语句,可以配置参数类型、返回类型、缓存刷新等信息。
  • 支持动态SQL
  • 配置缓存

这里我们暂时先了解一下它,因为它最为重要,我们以后会单独去学习掌握。

映射器接口:

@Repository
public interface BillingInfoDAO {
    BillingInfoEntity queryById(int id);
}

XML方式创建映射器:

<?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="com.lzx.dao.BillingInfoDAO">
    <select id="queryById" resultType="com.lzx.entity.BillingInfoEntity">
      select invoice_id,billing_address,billing_city,billing_state,
      billing_country,billing_postalcode from invoice where invoice_id=#{id}
    </select>
</mapper>

注解实现映射器:

public interface BillingInfoDAO {
	//这里不推荐使用,较为复杂的sql语句不便于管理
	@select(select invoice_id,billing_address,billing_city,billing_state,
      billing_country,billing_postalcode from invoice where invoice_id=#{id})
    BillingInfoEntity queryById(int id);
}

三、掌握MyBatis配置文件

了解MyBatis配置文件的所有元素

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties /> <!--属性-->
    <settings /> <!--设置-->	        
    <typeAliases /> <!--类型别名-->
    <typeHandlers /> <!--类型处理器-->
    <objectFactory /> <!--对象工厂-->
    <environments > <!--配置环境-->
        <environment > <!--环境配置-->
            <transactionManager ></transactionManager> <!--事务管理器-->
            <dataSource></dataSource> <!--数据源-->
        </environment>
    </environments> 
    <databaseIdProvider /> <!--数据库厂商-->
    <mappers /> <!--映射器-->
</configuration>

接下来我们开始掌握这些元素的使用,接下来的所有配置都是在configuration里面完成的,注意这些元素的顺序一定要按照上面的顺序,不可随意放置, MyBatis的配置文件一般以mybatis-config.xml来命名,放置到类的加载路径下

1、porperties属性

<!-- 通过porpert的子元素来进行数据库连接的相关配置-->
<properties>
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis_studydb" />
    <property name="jdbc.username" value="root" />
    <property name="jdbc.password" value="123456" />
</properties>

<environments default="development">
    <environment id="decelopment">
        <transactionManager type="JDBC" />
        <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>
</environments>

为了方便管理,我们一般使用properties文件进行数据库的连接配置。创建jdbc.properties文件,放置classpath路径下。方便我们配置数据库。

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

接下来我们就可以把properties和它的子元素进行替换即可

<properties resource="jdbc.properties"/>

2、settings设置

settings是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。大部分情况下保持默认值运行即可。

一个配置完整的 settings 元素的示例如下:

<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"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

下面是settings配置项的详细说明:

设置参数描述有效值默认值
cacheEnabled全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。true|falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。true|falsefalse
aggressiveLazyLoading当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).true|falsefalse(truein≤3.4.1)
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)。true|falsetrue
useColumnLabel使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。true|falsetrue
useGeneratedKeys允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如Derby)。true|falseFalse
autoMappingBehavior指定MyBatis应如何自动映射列到字段或属性。NONE表示取消自动映射;PARTIAL只会自动映射没有定义嵌套结果集映射的结果集。FULL会自动映射任意复杂的结果集(无论是否嵌套)。NONE,PARTIAL,FULLPARTIAL
autoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或者未知属性类型)的行为。
  • NONE:不做任何反应
  • WARNING:输出提醒日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为WARN)
  • FAILING:映射失败(抛出SqlSessionException)
NONE,WARNING,FAILINGNONE
defaultExecutorType配置默认的执行器。SIMPLE就是普通的执行器;REUSE执行器会重用预处理语句(preparedstatements);BATCH执行器将重用语句并执行批量更新。SIMPLEREUSEBATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。任意正整数NotSet(null)
defaultFetchSize为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。任意正整数NotSet(null)
safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。true|falseFalse
safeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。true|falseTrue
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camelcase)映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射。true|falseFalse
localCacheScopeMyBatis利用本地缓存机制(LocalCache)防止循环引用(circularreferences)和加速重复嵌套查询。默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据。SESSION|STATEMENTSESSION
jdbcTypeForNull当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER。JdbcType常量.大多都为:NULL,VARCHARandOTHEROTHER
lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载。用逗号分隔的方法列表。equals,clone,hashCode,toString
defaultScriptingLanguage指定动态SQL生成的默认语言。一个类型别名或完全限定类名。org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler指定Enum使用的默认TypeHandler。(从3.4.5开始)一个类型别名或完全限定类名。org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls指定当结果集中值为null的时候是否调用映射对象的setter(map对象时为put)方法,这对于有Map.keySet()依赖或null值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成null的。true|falsefalse
returnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回null。当开启这个设置时,MyBatis会返回一个空实例。请注意,它也适用于嵌套的结果集(i.e.collectioinandassociation)。(从3.4.2开始)true|falsefalse
logPrefix指定MyBatis增加到日志名称的前缀。任何字符串Notset
logImpl指定MyBatis所用日志的具体实现,未指定时将自动查找。SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGINGNotset
proxyFactory指定Mybatis创建具有延迟加载能力的对象所用到的代理工具。CGLIB|JAVASSISTJAVASSIST(MyBatis3.3orabove)
vfsImpl指定VFS的实现自定义VFS的实现的类全限定名,以逗号分隔。Notset
useActualParamName允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的工程必须采用Java8编译,并且加上-parameters选项。(从3.4.1开始)true|falsetrue
configurationFactory指定一个提供Configuration实例的类。这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。这个类必须包含一个签名方法staticConfigurationgetConfiguration().(从3.2.3版本开始)类型别名或者全类名.Notset

3、typeAlias别名

由于类的完全限定名称比较长,大量使用时十分不方便。MyBatis通过别名的方式来代表它,在MyBatis中别名是不区分大小写。别名又分为系统定义别名和自定义别名。

配置自定义别名:

<typeAliases>
    <!--全写-->
    <typeAlias type="com.lzx.entity.Author" alias="author" />
    <typeAlias type="com.lzx.entity.Blog" alias="blog" />
    <!--简写,MyBatis自动扫描这个包下面的所有类,把第一字母变成小写作为别名-->
    <package name="com.lzx.entity" />
</typeAliases>

使用注解配置别名:

@Alias("blog")
public class Blog {
	...
}

系统自定义别名:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

4、typeHandler类型转换器

在JDBC中,需要在PreparedStatement中处理预编译的SQL语句中的参数,执行完毕SQL后,通过ResultSet对象获得数据库中的数据,这些数据类型在MyBatis中通过typeHandler实现。在typeHandler中分为jdbcType和javaType。jdbcType定义数据库类型,javaType定义java类型。typeHandler的作用是承担jdbcType和javaType之间的相互转换。一般来说,系统定义的typeHandler就足够我们使用,我们还可以自定义typeHandler来处理我们需要满足的转换规则。

系统定义的typeHandler:

类型处理器Java类型JDBC类型
BooleanTypeHandlerjava.lang.Boolean,boolean数据库兼容的BOOLEAN
ByteTypeHandlerjava.lang.Byte,byte数据库兼容的NUMERICBYTE
ShortTypeHandlerjava.lang.Short,short数据库兼容的NUMERICSHORTINTEGER
IntegerTypeHandlerjava.lang.Integer,int数据库兼容的NUMERICINTEGER
LongTypeHandlerjava.lang.Long,long数据库兼容的NUMERICLONGINTEGER
FloatTypeHandlerjava.lang.Float,float数据库兼容的NUMERICFLOAT
DoubleTypeHandlerjava.lang.Double,double数据库兼容的NUMERICDOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的NUMERICDECIMAL
StringTypeHandlerjava.lang.StringCHAR,VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB,LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR,NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型
BlobTypeHandlerbyte[]BLOB,LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER或未指定类型
EnumTypeHandlerEnumerationTypeVARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandlerEnumerationType任何兼容的NUMERICDOUBLE类型,存储枚举的索引(而不是名称)。
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHARorLONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

自定义typeHandler需要实现TypeHandler接口

public class MyTypeHandler implements TypeHandler<Integer> {
    // ...重写方法
}

配置自定义typeHandler:

<typeHandlers>
    <typeHandler handler="com.lzx.element.MyTypeHandler" 
		javaType="string" jdbcType="VARCHAR" />

	<!--扫描包配置typeHandler-->
    <package name="com.lzx.mytypehandler" />
</typeHandlers>

使用包扫描和注解注册typeHandler

@MappedTypes(Integer.class)
@MappedJdbcTypes(jdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<Integer> {
    // ...重写方法	  
}

使用自定义typeHandler

<!--使用方式一-->
<resultMap id="authorMapper" type="author">
    <id property="id" column="id"/>
    <result property="name" column="name" typeHandler="com.lzx.element.MyTypeHandler"/>
</resultMap>

  <!--使用方式二-->
<select id="queryByName" >
    select `id`,`name` from author
      where `name` = #{name, typeHandler=com.lzx.element.MyTypeHandler}
</select>

枚举typeHandler

大多数情况下,typeHandler因为枚举而使用,MyBatis定义了两个类作为枚举类型地支持,因为不常用,所以我们了解一下即可。分别是EnumOrdinalTypeHandler和EnumTypeHandler。其中,EnumOrdinalTypeHandler是按照MyBatis根据数组下标索引的方式进行匹配的,它要求数据库返回一个整数作为其下标,它会根据下标找到对应的枚举类型。 EnumTypeHandler会把使用的名称转换为对应的枚举,比如它根据数据库返回的字符串“MALE”进行Enum.valueOf(SexEnum.class,“MALE”)转换。

文件操作

MyBatis对数据的Blob的字段进行了支持,提供了一个BlobTypeHandler,还有ByteArrayTypeHanddler,只不过不太常用。因为一次性把大批量的数据加载到JVM中,会对服务器造成很大的压力,应该考虑采用文件流的形式。因为性能不佳,大型互联网网站会采用文件服务器的形式,能够对文件进行更为告诉的操作。

5、ObjectFactory(对象工厂)

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。MyBatis允许自定义ObjectFactory,可以继承ObjectFactory来实现,但是由于里面的自定义返回规则比较复杂且易出错,所以我们继承系统实现好的ObjectFactory即可。

public class MyObjectFactory extends DefaultObjectFactory {
// .....重写方法
}

XML配置:

<objectFactory type="com.lzx.element.MyObjectFactory">
    <property name="properties" value="properties_value"/>
</objectFactory>

6、插件(plugin)

插件是MyBatis中最为强大和灵活的组件,也是最为复杂、最难使用的组件。因为它覆盖了MyBatis底层对象的核心方法和属性,如果不熟悉MyBatis底层的构建和运行原理,请不要随意自定义使用。

MyBatis 允许使用插件来拦截的方法调用包括:

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

自定义插件:

@Intercepts({@Signature(
    type= Executor.class,
    method = "update",
    args = {MappedStatement.class,Object.class})})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        return null;
    }

    @Override
    public Object plugin(Object o) {
        return null;
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

XML配置:

<plugins>
    <plugin interceptor="com.lzx.element.MyPlugin">
        <property name="someProperty" value="100"/>
    </plugin>
</plugins>

7、environment(运行环境)

运行环境主要用来配置数据库信息,可以配置多个数据库。主要分为两个配置元素transactionManager(事务管理器)和dataSource(数据库)

<environments default="development">
    <environment id="decelopment">
        <transactionManager type="JDBC"/>
        <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>
</environments>

在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):

  • JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

  • MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

     <transactionManager type="MANAGED">
       <property name="closeConnection" value="false"/>
     </transactionManager>
    

dataSource三种数据源及其属性:

  • UNPOOLED
  • POOLED
  • JNDI

8、databaseIdProvider数据库厂商标识

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

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

使用时,需要在映射器中加上databaseId

<select id="queryByName" resultType="com.lzx.entity.Author" databaseId="oracle">
    select * from author where name = #{name}
</select> 

9、引入映射器

前面我们知道实现映射器常用的实现方式是声明一个接口并配合xml文件使用。映射器中的定义命名空间(namespace),命名空间对应的是一个接口的全路径。

在配置文件中我们要引入映射器,共有以下几种实现方式:

1. 使用相对于类路径的资源引用

2. 使用完全限定资源定位符(URL)

3. 使用映射器接口实现类的完全限定类名

4. 将包内的映射器接口实现全部注册为映射器

<!--方式一-->
<mappers>
    <mapper resource="mapper/AuthorMapper.xml"/>
    <mapper resource="mapper/BlogMapper.xml"/>
</mappers>
<!--方式二-->
<mappers>
    <mapper url="file:///var/mapper/AuthorMapper.xml"/>
    <mapper url="file:///var/mapper/BlogMapper.xml"/>
</mappers>
<!--方式三-->
<mappers>
    <mapper class="mapper.AuthorMapper"/>
    <mapper class="mapper.BlogMapper"/>
</mappers>
<!--方式四-->
<mappers>
    <package name="mapper"/>
</mappers>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值