要注意的是上面那些层次是不能够颠倒顺序的,否则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. 配置的更多相关文章

  1. 《深入浅出MyBatis技术原理与实战》——7. 插件

    在第6章讨论了四大运行对象的运行过程,在Configuration对象的创建方法里我们看到了MyBatis用责任链去封装它们. 7.1 插件接口 在MyBatis中使用插件,我们必须使用接口Inter ...

  2. 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理

    MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...

  3. 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL

    4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...

  4. 《深入浅出MyBatis技术原理与实战》——1.简介,2.入门

    1. 简介 Java程序都是通过JDBC连接数据库,但是只定义了接口规范,具体的实现交给各个数据库厂商去实现,因为每个数据库都有其特殊性.所以JDBC是一种桥接模式. 这里为什么说JDBC是一种桥接模 ...

  5. 深入浅出MyBatis技术原理与实战

    第1 章 MyBatis 简介..................................................................................... ...

  6. 深入浅出Mybatis技术原理与实战(杨开振)(带详细书签) PDF 下载 高清 完整版+源码

    (杨开振) 源码 IDE eclipse 建表语句也在里面 电子书+源码地址

  7. 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解

    深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...

  8. 3MyBatis配置--深入浅出MyBatis技术原理与实践(笔记)

    XML 映射配置文件 configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFact ...

  9. 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

随机推荐

  1. Linux回收站(改写rm防止误删文件无法恢复)

    rm -rf 慎用 命令敲得多了,常在河边走,难免会湿鞋 昨天,一个手误,敲错了命令,把原本想要留的文件夹给rm -rf掉了 几天心血全木有了,靠,死的心都有了 经百度,google以及尝试无果,哎, ...

  2. 洛谷:P3809 【模板】后缀排序(后缀数组模板)

    P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...

  3. ACM.hdu1025

    to get the ans of how many roads at most that can be built between two line without intersection of ...

  4. lightoj 1214

    lightoj 1214 Large Division  (大数除法) 链接:http://www.lightoj.com/volume_showproblem.php?problem=1214 题意 ...

  5. kafka 命令笔记

    以下命令都是在kafka根目录下 启动自带的zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties 启动kafka(启动 ...

  6. POJ 3255 Roadblocks (次短路模板)

    Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS   Memory Limit: 65536K       Descriptio ...

  7. [POI2009]WIE-Hexer

    https://www.luogu.org/problem/show?pid=3489 题目描述 Byteasar has become a hexer - a conqueror of monste ...

  8. java 7修改文件权限

    Full control over file attributes is available in Java 7, as part of the "new" New IO faci ...

  9. 【usaco-Liars and Truth Tellers, 2013 Jan真假奶牛】并查集

    题解: 原先我看错题了,以为是任意选择k个使得它们不矛盾. 这样的话怎么做呢?我想M^2判断,把它们分成若干个集合,集合里面两两不矛盾这个集合里所有的话就不矛盾了. 但是这样是错的.为什么呢? 每一句 ...

  10. VSCode Web Developement for Javascript. Must have plugins.

    Es6 Javascript front-end web developemnt must have plugins Prettier - Code Formatter Javascript (ES6 ...