从我开始接触代码,我就很怕写配置文件,一般的配置文件我都是直接从上一个项目复制到这个项目来改改,可能有部分同学也有我这种痛吧;
我目前一般的做法,先去找找例子(从网上,从github,从官网)之后再改改,做一些测试就应用到项目中了,这个过程中,很多配置的含义和内容都是一知半解的,导致有时候排查问题的时候,可能到最后才想到配置有问题。
所以我们今天就要拿出100%的精神来学习这个MyBatis的全局配置文件。
编写配置文件的时候,我们也希望可以像写代码那样有智能提示,可以避免写错,MyBatis配置文件中,确实有这样的功能,这个称之为约束。
配置文件的约束
Configuration(根元素)
properties(定义配置外在化)
setting(全局性的配置)
typeAliases(定义别名)
typeHandlers(类型处理)
objectFactory(对象工厂)
plugins(插件)
envionments(配置Mybatis的环境)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(指定映射文件或映射类)
约束文件的作用就是为了在编写配置文件的时候,能够进行智能提示;
1、约束文件可以导入到具体的IDE内(比如MyEclipse,IDEA);
2、一般情况下,可以添加一个Mybatis.Config.XML的模板,那么以后在项目中新建Mybatis配置文件就不用写这个约束了。
Configuration 的作用,是为了说明从这里开始就是Mybatis的配置了,所有的配置都是在这个Configuration下面的,这是一种规定;也
这个一般在都是用在数据库的配置信息放到另外的文件,好处就是项目的运维人员可以方便的进行修改数据库的账号密码等等,也可以进行其他处理(加密字符串)等等。
这里有一点要注意的就是
当属性同名的时候,MyBatis将按照下面的顺序(优先级)来加载
1、在properties 元素体内定义的属性首先被读取
2、读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性
3、读取parameterType传递的属性,它会覆盖已读取的同名属性
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项的意图、默认值等;
具体可以参考MyBatis官网 https://mybatis.org/mybatis-3/zh/configuration.html
这些配置大概的过一遍,下面用到的时候会回来补充。
类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
为每个类型定义别名;
<typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> <typeAlias alias="Comment" type="domain.blog.Comment"/> <typeAlias alias="Post" type="domain.blog.Post"/> <typeAlias alias="Section" type="domain.blog.Section"/> <typeAlias alias="Tag" type="domain.blog.Tag"/> </typeAliases>
为其中某个包定义别名。在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
通过注解的方式进行
@Alias("author") public class Author { ... }
typeHandlers
也叫做类型转换器,主要用在参数转换的地方,哪里进行参数转换呢?
PreparedStatementHandler 在解析 SQL 参数,进行参数设置的时候,需要把 Java Type 转换为 JDBC 类型;
ResultSetHandler 返回的结果集,需要把 JDBC 类型转换为 Java Type ;
到时候,接触到的时候,会详细讲解。
后续介绍
后续介绍
Mybatis可以配置成适应多种环境,这种机制有助于将SQL映射应用月多种数据库中,现实中也有多种理由这么做。例如开发,测试和生产环境需要不同的配置,或者想在具有相同的Schema的多个生产数据中使用相同的SQL映射。有许多类似的使用场景。
不过要记住:尽管可以配置多环境,但每个SqlSessionFactory实例只能选择一种环境。每一个数据库对应一个SqlSessionFactory实例。
为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果忽略了环境参数,那么默认环境将会被加载,如下所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
环境元素定义了如何配置环境。
<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>
注意这里的关键点:
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源具有以下属性。:
作为可选项,你也可以传递属性给数据库驱动。只需在属性名加上“driver.”前缀即可,例如:
这将通过 DriverManager.getConnection(url,driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:
JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:
和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:
这就会在初始上下文(InitialContext)实例化时往它的构造方法传递值为 UTF8 的 encoding属性。
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
<databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
<!-- 使用完全限定资源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
<!-- 使用映射器接口实现类的完全限定类名 --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
原文:https://www.cnblogs.com/gdouzz/p/12058989.html