写在前面:十分感谢《深入浅出Mybatis技术原理与实战》这本书,大多数地方是书上的话,希望自己能在后面的文章中多写一些自己的理解。而且最重要的是!每次照书无脑敲的时候,都好羞愧啊(害羞脸)。后面一定注意这些问题。最后要感谢点赞、评论以及指正的朋友们,你们是坠吼的!!
MyBatis配置元素
MyBatis配置xml文件的层次结构是不能够颠倒顺序的,在解析的过程中,如果出现什么问题的话可以来这里查看一下下。先看一段文件:
<?xml version"1.0" encoding="UTF-8"?>
<!-- 配置 -->
<configuration>
<!-- 属性 -->
<properties/>
<!-- 设置 -->
<settings/>
<!-- 类型命名 -->
<typeAliases/>
<!-- 类型处理器 -->
<typeHandlers/>
<!-- 对象工厂 -->
<objectFactory/>
<!-- 插件 -->
<plugins/>
<!-- 配置环境 -->
<environments>
<!-- 环境变量 -->
<environment>
<!-- 事务管理器 -->
<transactionManager/>
<!-- 数据源-->
<dataSource/>
</environment>
</environments>
<!-- 数据库厂商标识 -->
<databaseIdProvider/>
<!-- 映射器 -->
<mappers/>
</configuration>
这是MyBatis的全部配置,相信很多人第一眼看完之后会发出和我一样的感慨:雾草!这都是什么东西?但是其实理解后还是蛮简单的,而且很多东西我们在初级的使用中,让它默认就好,我也会在众多的配置方式中,省去繁琐不必要的部分,直接介绍最好用的给大家。那么写这篇文的目的就在于——好好的了解他们一下,简单知道他们分别都是做啥的!接下来不要方,我们一个个的来,嘿嘿嘿。
1.Properties 元素
顾名思义,properties是配置属性的元素。这个呢,是必要的,因为在JDBC我们要设定driver、url、username和password。而在配置中,我们直接把这些东西放到Properties元素中即可,是必要而且简单的东西。
有三种方式供选择:
- property 子元素
- properties 配置文件
- 程序参数传递
第一种方式:property 子元素
<dataSource type="POOLED">
<property name="driver" value=“com.mysql.jdbc.Driver”/>
<property name="url" value=“jdbc:mysql://localhost:端口号/数据库名”/>
<property name="username" value=“数据库用户名“/>
<property name="password" value=“数据库密码”/>
</dataSource>
配置:这个是dataSource了,不知道它在哪里的请看上面那个全部配置元素展示~在dataSource里直接用'$'符号,
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
第二种方式: properties 配置文件
properties文件:
driver= com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:端口号/数据库名
username= 数据库用户名
password= 数据库密码
我们把这个配置文件放在源包下,引入它就可以了。
<properties resource=“jdbc.properties/>
当然还有第三种方式:通过程序参数传递
这里先不写代码了,因为好多啊,而且以现有的知识去研究,不太好理解的,可以等前两个先用6了然后再研究这个,这里先写一下什么情况使用它。
在开发中,数据库的密码往往掌握在运维人员的手中,对搞开发的来说,这些属于机密文件,而这些密码往往都是通过运维人员加密的,我们是没办法通过加密的字符串去直接连接数据库的!那么就要在生成SqlSessionFactory之前通过代码将加密的字符串转化成明文!呐,这是个解码的过程。系统提供的解密方法是decode(str)…不过我倒是感觉吧,每个公司如果要加密的话,解码方法要视情况而定,到时候知道这个途径就随机应变咯。
这里说一下优先级的问题:通过参数传递的属性具有最高优先级,然后是resource/url属性中指定的配置文件,最后是properties属性中指定的属性。
最好还是别混合乱用了,多乱啊。最好的方式就是通过properties文件!如果需要处理加密解密啥的,最好使配置来自同一个配置文件。
2.Settings 元素
Settings的Mybatis最复杂也是最重要的元素,它可以改变Mybatis的运行行为,但是!最重要的但是!即使我们不配置Settings,我们依然可以正常使用Mybatis!Settings的配置内容简直多的令人发指!我相信就算我全写下来,大家也没打个耐心看,就算有那个耐心看,也肯定记不住!(此处省略10000字介绍......)
3.typeAliases 元素
别名是个指代名称。其实很简单的东西如果总结起来就太麻烦了,我们需要知道的是,Mybatis系统定义了一系列经常使用的类型的别名,例如:数值、字符串、日期和集合。比如要用Map了,我们不需要写java.util.Map,直接写map就好啦!
重点要说的是自定义别名,因为我们有很多实体类,如果每次都按照路径去写岂不是很累(滑稽脸)。
<!—定义别名—>
<typeAliases>
<typeAliases alias=“role” type=“com.cream.model.Role”>
</typeAliases>
利用这种途径,我们就可以使用role来代替完整路径,方便很多!
但是如果我们有很多类呢?这样的话,设置起来就很麻烦。所以介绍第二种方式给大家:通过自动扫描的形式自定义别名。
<typeAliases>
<package name=“com.cream.study1.model”/>
<package name=“com.cream.study2.model”/>
</typeAliases>
```
定义别名的方式是使用注解 @Alias,比如:
```
@Alias(“role”)
public class Role {
//coding……
}
```
配合起来之后,Mybatis自动扫描指定的package,注意的是,配置包扫描的路径之后,没有@Alias注解的Mybatis也会被装载,然后把类名的第一个字母变成小写,作为Mybatis的别名。建议使用一部分的包名+类名的格式去限定,以避免出现重名的情况。
####4.typeHandler 元素
typeHandler是类型处理器,,Mybatis在预处理语句中设置参数的时候,从结果集取出值的时候,都会用已注册的typeHandler去处理。
typeHandler允许根据项目的需要去自定义设置Java传递到数据库的参数中。还有从数据库读数据出来的时候,我们也需要进行特殊处理。这些情况都可以通过自定义typeHandler去处理。
其实系统定义的typeHandler就可以实现大部分的功能了,也很多,使用的时候,可以查一查。
注意事项:
数值类型的精度,数据库int、double、decimal与java中的精度、长度是不一样的。
时间精度,取到日:DateOnlyTypeHandler。取到秒:SqlTimerstamp。额,都可以源码查看。想看例子的直接查官方文档就好,忽视其他的英文,直接看代码ok,个人感觉这个是挺复杂的一个东西。
####ObjectFactory元素
ObjectFactory是有结果返回的时候,构造实体类(POJO)的,大部分的场景下我们都不用修改,当然想自定义也可以,恩。。。知道这些就好!下一个!
####Plugins元素
插件很复杂,书上概括下来就是,如果不懂原理,那么就完全无法掌握插件的使用,而且插件用不好的话就会是一个很危险的东西!所以无法简单理解。以后研究研究再单独写一写。
####environments配置环境
它很关键,environments是配置环境,他可以注册多个数据源dataSource,数据源包括数据源的配置和数据库事务(transactionManager)的配置。
配置数据源
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
这里粘的是源码的示例。
- environments中的属性default,标明我们默认启用的数据源配置。
- environment中的id是设置这个数据源的标识。
- transactionManager配置数据库的事务,type有三种配置方式。
1.JDBC:采用jdbc方式管理事务,独立编码中常用。
2.MANAGED:采用容器方式管理事务,在JNDI数据源中常用。
3.自定义:用于特殊应用,自己定义数据库事务管理。
- property 元素是配置数据源的各类属性,比如说可以name处写"autoCommit",value写"false",这样就代表着数据源不自动提交。
- dataSource :配置数据源连接的信息,type属性设置我们对数据库连接方式的配置。
1.UNPOOLED,非连接池数据库。
2.POOLED,连接池数据库。
3.JNDI,JNDI数据源。
4.自定义
这里说一下数据库事务,在Mybaits把事务交由SqlSession控制,我们可以通过SqlSession执行commit提交,或者roolback回滚。
简单打个比方:A去银行转账,余额100块,A要给B转200块,但是A余额不足,转账失败了,这时候就需要回滚事务。否则A虽然失败了,但B却可以收到200块。
大部分工作环境下使用Spring控制。
再来讨论一下数据源:
Mybatis提供了三种数据源连接方式:
1.UNPOOLED:非连接池。
2.POOLED:连接池。
3.JNDI:通过JndiDataSourceFactory获取数据源。
当然我们可以自定义数据源,他必须实现:org.apache.ibatis.datasource.DataSourceFactory
接口,当我们使用了spring框架,配置就会很简单
####databaseIdProvider数据库厂商标识
相同数据库厂商环境下,数据库厂商标识没啥意义。Mybatis如果运行在不同厂商的数据库的话,可以提供标识,但是一般情况下都不会使用多厂商的数据库。
####映射器
简单说一下引入映射器的方法(官方文档代码)
1.用文件路径引入。
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2.用类注册引入映射器。
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
3.用包名引入。
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
4.用xml文件引入。
网友评论