《深入浅出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 ...
随机推荐
- UVA.11464 Even Parity (思维题 开关问题)
UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...
- bzoj1297: [SCOI2009]迷路(矩阵乘法+拆点)
题目大意:有向图里10个点,点与点之间距离不超过9,问从1刚好走过T距离到达n的方案数. 当时看到这题就想到了某道奶牛题(戳我).这两道题的区别就是奶牛题问的是走T条边,这道题是每条边都有一个边权求走 ...
- The database cluster was initialized with RELSEG_SIZE 1048576, but the server was compiled with RELSEG_SIZE 8388608
由于一次误操作,将线上机器的数据库程序目录删除,虽然不影响程序的正常使用,数据也未丢失,但后面如果出现服务器宕机或数据库宕机,数据库将无法启动,而且数据库对应的编译参数也已无法查看,所以征得开发同意后 ...
- POJ 2976 二分
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12515 Accepted: 4387 D ...
- java删除目录下符合条件的文件
自己做的一个小程序,目的是:删除某个目录下所有的文件大小为0的文件.同理其他的条件也可以,只需修改delFile()方法中的判断条件即可. 下面是代码,有需要的同学可以参考下,如有错误请指出,不胜感激 ...
- springboot以jar包方式启动、关闭、重启脚本
springboot以jar包方式启动.关闭.重启脚本 启动 编写启动脚本startup.sh #!/bin/bash echo Starting application nohup java -ja ...
- Spring 学习笔记之整合Hibernate
Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心SQ ...
- 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑, ...
- 2、MySQL常见数据库引擎及比较?
MySQL存储引擎简介 MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: MyISAM管理非事务表.它提供高速存储和检索,以及 ...
- Caffe学习笔记4图像特征进行可视化
Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...