《深入浅出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 ...
随机推荐
- Linux回收站(改写rm防止误删文件无法恢复)
rm -rf 慎用 命令敲得多了,常在河边走,难免会湿鞋 昨天,一个手误,敲错了命令,把原本想要留的文件夹给rm -rf掉了 几天心血全木有了,靠,死的心都有了 经百度,google以及尝试无果,哎, ...
- 洛谷:P3809 【模板】后缀排序(后缀数组模板)
P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...
- ACM.hdu1025
to get the ans of how many roads at most that can be built between two line without intersection of ...
- lightoj 1214
lightoj 1214 Large Division (大数除法) 链接:http://www.lightoj.com/volume_showproblem.php?problem=1214 题意 ...
- kafka 命令笔记
以下命令都是在kafka根目录下 启动自带的zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties 启动kafka(启动 ...
- POJ 3255 Roadblocks (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- [POI2009]WIE-Hexer
https://www.luogu.org/problem/show?pid=3489 题目描述 Byteasar has become a hexer - a conqueror of monste ...
- java 7修改文件权限
Full control over file attributes is available in Java 7, as part of the "new" New IO faci ...
- 【usaco-Liars and Truth Tellers, 2013 Jan真假奶牛】并查集
题解: 原先我看错题了,以为是任意选择k个使得它们不矛盾. 这样的话怎么做呢?我想M^2判断,把它们分成若干个集合,集合里面两两不矛盾这个集合里所有的话就不矛盾了. 但是这样是错的.为什么呢? 每一句 ...
- VSCode Web Developement for Javascript. Must have plugins.
Es6 Javascript front-end web developemnt must have plugins Prettier - Code Formatter Javascript (ES6 ...