MyBatis之SqlMapConfig.xml主配置文件详解

一、可配置属性(必须遵循下面顺序)

标签必须按下面的顺序依次配置 

配置内容作用
<properties>用来加载属性文件
<settings>用来设置全局参数
<typeAliases>用来设置类型的别名
<typeHandlers>用来设置类型处理器
<objectFactory>用来设置对象工厂
<plugins>用来设置插件
<environments>用来设置mybatis的环境
<mappers>用来配置映射文件

二、具体属性配置信息

1.properties(属性)

将需要将数据库连接参数单独配在db.properties文件(key-value形式注意不要出现空格)中,然后在SqlMapConfig.xml中加载db.properties的属性值即可从外部加载数据信息

properties特性

1.在properties元素体内定义的属性优先读取

2.然后读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性

db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=mark

 SqlMapConfig.xml主配置文件

        <properties resource="db.properties"/>//引用外部数据库配置文件
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"/>//使用el表达式
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>

2.settings(全局参数配置)

Mybatis框架在运行时可以调整一些运行参数,比如:开启二级缓存、开启延迟加载等

setting(设置)Description(描述)valid Values(验证值组)Default(默认值)
cacheEnabled在全局范围内启用或禁用缓存配置 任何映射器在此配置下。true | falseTRUE
lazyLoadingEnabled在全局范围内启用或禁用延迟加载。禁用时,所有相关联的将热加载。true | falseTRUE
aggressiveLazyLoading启用时,有延迟加载属性的对象将被完全加载后调用懒惰的任何属性。否则,每一个属性是按需加载。true | falseTRUE
multipleResultSetsEnabled允许或不允许从一个单独的语句(需要兼容的驱动程序)要返回多个结果集。true | falseTRUE
useColumnLabel使用列标签,而不是列名。在这方面,不同的驱动有不同的行为。参考驱动文档或测试两种方法来决定你的驱动程序的行为如何。true | falseTRUE
useGeneratedKeys允许JDBC支持生成的密钥。兼容的驱动程序是必需的。此设置强制生成的键被使用,如果设置为true,一些驱动会不兼容性,但仍然可以工作。true | falseFALSE
autoMappingBehavior指定MyBatis的应如何自动映射列到字段/属性。NONE自动映射。 PARTIAL只会自动映射结果没有嵌套结果映射定义里面。 FULL会自动映射的结果映射任何复杂的(包含嵌套或其他)。

NONE,PARTIAL,FULL

PARTIAL
defaultExecutorType配置默认执行人。SIMPLE执行人确实没有什么特别的。 REUSE执行器重用准备好的语句。 BATCH执行器重用语句和批处理更新。

SIMPLE,REUSE,BATCH

SIMPLE
safeRowBoundsEnabled允许使用嵌套的语句RowBounds。true | falseFALSE
mapUnderscoreToCamelCase从经典的数据库列名A_COLUMN启用自动映射到骆驼标识的经典的Java属性名aColumn。true | falseFALSE
localCacheScopeMyBatis的使用本地缓存,以防止循环引用,并加快反复嵌套查询。默认情况下(SESSION)会话期间执行的所有查询缓存。如果localCacheScope=STATMENT本地会话将被用于语句的执行,只是没有将数据共享之间的两个不同的调用相同的SqlSession。

SESSION

STATEMENT

SESSION
dbcTypeForNull指定为空值时,没有特定的JDBC类型的参数的JDBC类型。有些驱动需要指定列的JDBC类型,但其他像NULL,VARCHAR或OTHER的工作与通用值。JdbcType enumeration. Most common are: NULL, VARCHAR and OTHEROTHER
lazyLoadTriggerMethods指定触发延迟加载的对象的方法。A method name list separated by commasequals,clone,hashCode,toString
defaultScriptingLanguage指定所使用的语言默认为动态SQL生成。A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags

.XMLDynamicLanguageDriver

callSettersOnNulls指定如果setter方法 或地图的put方法时,将调用检索到的值是null。它是有用的,当你依靠Map.keySet()或null初始化。注意原语(如整型,布尔等)不会被设置为null。true | falseFALSE
logPrefix指定的前缀字串,MyBatis将会增加记录器的名称。Any StringNot set
logImpl指定MyBatis的日志实现使用。如果此设置是不存在的记录的实施将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGINGNot set
proxyFactory指定代理工具,MyBatis将会使用创建懒加载能力的对象。CGLIB | JAVASSISTCGLIB

3. typeAliases(类型别名)

在mapper.xml中可能会有很多的statement,statement需要parameterType来指定输入参数的类型、需要resultType来指定输出结果的类型。如果在指定类型时输入类型全路径,有时候会很长,不方便进行开发,那么我们就可以可以针parameterTyp或resultType指定的类型定义一些别名,在mapper.xml中通过别名来定义,方便开发

Mybatis默认支持的别名

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

自定义别名(不区分大小写)

<!-- 自定义别名 -->
<typeAliases>
    <!-- 针对单个别名的定义.type:类型的路径; alias:别名 -->     
    <typeAlias type="com.mark.domain.User" alias="user"/>
</typeAliases>

UserMapper.xml引用别名

<select id="findUserById" parameterType="int" resultType="user" >
      select * from `user` where id=#{id}
</select>

批量定义别名(常用) --别名就是类名(不区分大小写)

<!-- 批量别名的定义:
        package:指定包名,mybatis会自动扫描包中的pojo类,自动定义别名,别名就是类名(首字母大写或小写都可以)
 -->
     <typeAliases>
         <package name="com.mark.domain"/>
         <package name="其它包"/>
    </typeAliases>

4.typeHandlers(类型处理器)

Mybatis 中通过 typeHandlers 完成 jdbc 类型和 java 类型的转换,通常情况下, mybatis 提供的类型处理器(如下表)满足日常需要,不需要自定义。

类型处理器

Java类型

JDBC类型

BooleanTypeHandler

Boolean,boolean

任何兼容的布尔值

ByteTypeHandler

Byte,byte

任何兼容的数字或字节类型

ShortTypeHandler

Short,short

任何兼容的数字或短整型

IntegerTypeHandler

Integer,int

任何兼容的数字和整型

LongTypeHandler

Long,long

任何兼容的数字或长整型

FloatTypeHandler

Float,float

任何兼容的数字或单精度浮点型

DoubleTypeHandler

Double,double

任何兼容的数字或双精度浮点型

BigDecimalTypeHandler

BigDecimal

任何兼容的数字或十进制小数类型

StringTypeHandler

String

CHAR和VARCHAR类型

ClobTypeHandler

String

CLOB和LONGVARCHAR类型

NStringTypeHandler

String

NVARCHAR和NCHAR类型

NClobTypeHandler

String

NCLOB类型

ByteArrayTypeHandler

byte[]

任何兼容的字节流类型

BlobTypeHandler

byte[]

BLOB和LONGVARBINARY类型

DateTypeHandler

Date(java.util)

TIMESTAMP类型

DateOnlyTypeHandler

Date(java.util)

DATE类型

TimeOnlyTypeHandler

Date(java.util)

TIME类型

SqlTimestampTypeHandler

Timestamp(java.sql)

TIMESTAMP类型

SqlDateTypeHandler

Date(java.sql)

DATE类型

SqlTimeTypeHandler

Time(java.sql)

TIME类型

ObjectTypeHandler

任意

其他或未指定类型

EnumTypeHandler

Enumeration类型

VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)

5.objectFactory(对象工厂)

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

我们可以创建自己的对象工厂实现ObjectFactory这个接口,但是这样我们就需要自己去实现一些在DefaultObjectFactory已经实现好了的东西,因此如果想自定义一个,可以继承这个DefaultObjectFactory类。就可以在MyBatis初始化过程传递进去自定义的参数

配置objectFactor对象工厂

<objectFactory type="com.mark.demo.ExampleObjectFactory"></objectFactory>

自定义对象工厂

public class ExampleObjectFactory extends DefaultObjectFactory{
 
	private static final long serialVersionUID = 3608715667301891724L;
 
	@Override
	public <T> T create(Class<T> type) {
		T result = super.create(type);
		if(type.equals(User.class)){
			((User)result).setAuthor("mark");
		}
		return result;
	}
 
}

6.plugins(插件)

在某种情况下,需要在执行程序的过程中对某一点进行拦截,并在拦截后做出一系列处理,此时就需要使用一种拦截器。在 MyBatis 中,对某种方法进行拦截调用的机制,被称为 plugin 插件。使用 plugin 可以很好地对方法地调用进行监控,而且还可以修改或重写方法的行为逻辑。在 MyBatis 中允许使用 plugin 来拦截的方法如下:

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

其中,Executor 是 MyBatis 对外提供的一个操作接口类,其中包含了 query 查询、update 修改、commit 提交、rollback 回滚等核心方法。ParameterHandler、ResultSetHandler 及 StatementHandler 分别是处理参数、结果集、预编译状态的接口,里面的一些方法也可以使用 plugin 进行拦截。

插件使用的场景有:日志记录、权限控制、缓存控制等。

实现一个 plugin 只需要继承 Interceptor 接口,并且指定需要拦截的方法的签名信息即可

<plugins>
    <plugin interceptor="com.mark.TestPlugin">
        <property name="testProperty" value="2"/>
    </plugin>
</plugins>
@Intercepts(value={
    @Signature(
        type = Executor.class, // 只能是: StatementHandler | ParameterHandler | ResultSetHandler | Executor 类或者子类
        method = "query", // 表示:拦截Executor的query方法
        args = {  // query 有很多的重载方法,需要通过方法签名来指定具体拦截的是那个方法
                MappedStatement.class,
                Object.class,
                RowBounds.class,
                ResultHandler.class
        }
        /**
         * type:标记需要拦截的类
         * method: 标记是拦截类的那个方法
         * args: 标记拦截类方法的具体那个引用(尤其是重载时)
         */
)})
public class TestPlugin implements Interceptor {
    public Object intercept(Invocation invocation) throws Throwable {
        // 调用方法,实际上就是拦截的方法
        return invocation.proceed();
    }
    // 插入插件
    public Object plugin(Object target) {
        return Plugin.wrap(target,this);
    }
    // 设置插件属性
    public void setProperties(Properties arg0) {}
 
}

7.environments(设置mybatis的环境)

可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一,如果想连接两个数据库,就需要创建两个SQlSessionFactory实例,每个数据库对应一个

子属性

默认的环境ID(比如:default:"development")development : 开发模式    work : 工作模式

每个 environment 元素定义的环境 ID(比如:id=”development”)。

事务管理器的配置(比如:type="[ JDBC | MANAGED ]") MANAGED不提交和回滚一个连接,默认情况下他会关闭连接

数据源的配置(比如:type=[ UNPOOLED | POOLED | JNDI ])每次请求时打开和关闭连接、连接“池”、能在如EJB或应用服务器这类容器中使用

8.mappers(映射配置)

通过resource加载单个映射文件

    <!-- 加载映射文件 -->
    <mappers>
    <!--通过resource方法一次加载一个映射文件  -->
        <mapper resource="mapper/UserMapper.xml"/>
        <mapper resource="mapper/RoleMapper.xml"/>
    </mappers>

通过mapper接口加载单个映射文件

这种方式必须保证接口名(例如UserMapper)和xml名(UserMapper.xml)相同,还必须在同一个包中

    <!-- 通过mapper接口加载单个映射配置文件
            遵循一定的规范:
            需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;
      -->
         <mapper class="com.mark.mapper.UserMapper"/> 

批量加载mapper(推荐使用)

这种方式必须保证接口名(例如UserMapper)和xml名(UserMapper.xml)相同,还必须在同一个包中

<package name="com.mark.mapper"/> 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值