《深入浅出MyBatis技术原理与实战》——3. 配置

要注意的是上面那些层次是不能够颠倒顺序的,否则MyBatis在解析文件的时候就会出现异常。
3.1 properties元素
properties是一个属性配置元素,让我们能在配置文件的上下文中使用它。MyBatis提供3中配置方式:
- property子元素
- properties配置文件
- 程序参数传递
3.1.1 property子元素

这样我们就可以在上下文中使用已经配置好的属性值了:


3.1.2 properties配置文件
更多的时候会使用properties配置文件来配置属性值,以方便我们在多个配置文件中重复使用它们,也方便日后维护和修改。

把这个properties文件放在源包下,只要这样引入这个配置文件即可:

3.1.3 程序参数传递
实际工作中,运维人员会对配置文件中的用户名和密码进行加密,这样我们的配置文件中往往配置的是加密过后的数据库信息,而无法通过加密的字符串去连接数据库,这个时候可以通过编码的形式来满足我们遇到的场景。假设jdbc.properties文件中的username和password连个属性使用了加密的字符串,这个时候我们需要在生成SqlSessionFactory之前将它转化为明文,而系统已经提供了解密的方法decode(str)



3.1.4 优先级
MyBatis支持的3中配置方式可能同时出现,并且属性还会重复。这3种方式的优先级如下:
(1) 在properties元素内指定的属性首先被读取
(2) 根据properties元素中的resource属性读取类路劲下属性文件,或者根据url属性指定的路劲读取属性文件,并覆盖以读取的同名属性
(3) 读取作为方法参数传递的属性,并覆盖以读取的同名属性
3.2 设置




3.3 别名
用一个简短的名称去指代过长的类全限定名,这个名称可以在MyBatis上下文中使用。MyBatis中的别名分为系统定义别名和自定义别名。注意的是在MyBatis中别名是部分大小写的。
3.3.1 系统别名定义
3.3.2 自定义别名
系统自定义的别名往往是不够用的,因为不同的应用有着不同的需要,所以MyBatis允许自定义别名:

如果POJO过多的时候,配置也是非常多的。因此可以通过自动扫描的形式自定义别名:

然后在java代码中使用注解@Alias:

当然配置了包扫描路劲,而没有注解@Alias的,MyBatis也会装载,会将类名的第一个字母变为小写,作为MyBatis的别名,要特别注意避免出现重名的场景,建议使用部分包名加类名的限定。
3.4 typeHandler
MyBatis在预处理语句中设置一个参数时,或者从结果中取出一个值时,都会用注册了的typeHandler进行处理。

typeHandler的作用就是将参数从javaType转化为jdbcType,或者从数据库取出结果时把jdbcType转化为javaType。
3.4.1 系统定义的typeHandler
Mybatis系统内部定义了一系列的typeHandler,我们可以选取一个Mybatis系统自定义的typeHandler,并了解它的具体内容。我们可以看到MyBatis源码包org.apche.ibatis.type下面定义的StringTypeHandler,负责处理String类型:


StringTypeHandler继承了BaseTypeHandler。而BaseTypeHandler实现了接口typeHandler,并且 自己定义了4个抽象方法。所以继承它的时候需要实现其定义的4个抽象方法。setParameter是PreparedStatement对象设置参数,允许我们自己填写变换规则。getResult则分为ResultSet用列名或者列下标来获取数据结果。其中还包括了用CallableStatement(存储过程)获取结果及数据的方法。
3.4.2 自定义typeHandler
一般而言,MyBatis系统定义的typeHandler已经能够应付大部分场景了,但是不能排除不够用的情况。让我们覆盖一个字符串参数的typeHandler试试:
首先配置XML文件,确定我们需要处理什么类型的参数和结果:

然后实现我们的MyStringTypeHandler:




到了这里还不能测试,因为还需要去标识哪些参数或者结果类型去用typeHandler进行转换,在没有任何标识的情况下,MyBatis是不会启用你定义的TypeHandler进行结果转换的,因此还需要修改映射器的配置:

当然了,配置typeHandler的时候也可以进行包配置,然MyBatis扫描包里面的内容,以减少配置工作:

3.4.3 枚举类型
MyBatis中枚举类型的typeHandler有自己特殊的规则,MyBatis内部提供了两个转化枚举类型的typeHandler给我们使用:

其中EnumTypeHandler是使用枚举字符串名称作为参数传递,而EnumOrdinayTypeHandler是使用整数下标作为参数传递的。在大部分情况下我们都不想使用系统的枚举typeHandler而是采用自定义。
3.5 ObjectFactory
当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中可以定制自己的对象工厂,不过一般使用默认的即可。
3.6 插件
3.7 environments配置环境
3.7.1 概述
配置环境可以注册多个数据源,每一个数据源可分为两大部分:一个是数据源的配置,另外一个是数据库事务的配置。关于数据源配置这块,

有的时候需要使用其他的数据源,比如DBCP数据源,这个时候需要我们自定义数据源,需要实现org.apache.ibatis.datasource.DataSourceFactory接口,如:


再配置一下DBCP数据源就可以用了:

3.8 databaseIdProvider数据库厂商标识
3.9 引入映射器的方法
《深入浅出MyBatis技术原理与实战》——3. 配置的更多相关文章
- 《深入浅出MyBatis技术原理与实战》——7. 插件
在第6章讨论了四大运行对象的运行过程,在Configuration对象的创建方法里我们看到了MyBatis用责任链去封装它们. 7.1 插件接口 在MyBatis中使用插件,我们必须使用接口Inter ...
- 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理
MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...
- 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL
4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...
- 《深入浅出MyBatis技术原理与实战》——1.简介,2.入门
1. 简介 Java程序都是通过JDBC连接数据库,但是只定义了接口规范,具体的实现交给各个数据库厂商去实现,因为每个数据库都有其特殊性.所以JDBC是一种桥接模式. 这里为什么说JDBC是一种桥接模 ...
- 深入浅出MyBatis技术原理与实战
第1 章 MyBatis 简介..................................................................................... ...
- 深入浅出Mybatis技术原理与实战(杨开振)(带详细书签) PDF 下载 高清 完整版+源码
(杨开振) 源码 IDE eclipse 建表语句也在里面 电子书+源码地址
- 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解
深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...
- 3MyBatis配置--深入浅出MyBatis技术原理与实践(笔记)
XML 映射配置文件 configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFact ...
- 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)
什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
随机推荐
- HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)
HDOJ(HDU).1114 Piggy-Bank (DP 完全背包) 题意分析 裸的完全背包 代码总览 #include <iostream> #include <cstdio&g ...
- 数据添加到solr索引库后前台如何搜索
主要结构: 查询 Dao: package com.taotao.search.dao.impl; import java.util.ArrayList; import java.util.List; ...
- k好数 数位dp
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- Desert King 最小比率生成树 (好题)
Description David the Great has just become the king of a desert country. To win the respect of his ...
- mapper的前后缀
1.<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=&quo ...
- sql 建表以及查询---复杂查询之成绩排名
废话不说,直接建表 1.表Player USE T4st -- 设置当前数据库为T4st,以便访问sysobjects IF EXISTS(SELECT * FROM sysobjects WHERE ...
- PHP调试的时候出现了警告:
It is not safe to rely on the system解决方法,其实就是时区设置不正确造成的,本文提供了3种方法来解决这个问题. 实际上,从PHP 5.1.0开始当对使用date() ...
- (译)理解python线程
看到一篇老外写的线程文章,很赞,零基础都能看懂.先贴在这里,有时间再翻译出来. http://agiliq.com/blog/2013/09/understanding-threads-in-pyth ...
- css渐变知识知多少
<!DOCTYPE html><html><head><meta charset="utf-8"> <title>教程( ...
- canvas知识03:学写一个字案例
效果