MyBatis3框架详解(二)

一、MyBatis全局配置文件

MyBatis的全局配置文件包含设置(settings)和属性(properties)信息,文档结构如下:

 

二、全局配置文件中,引入dtd约束

目的:为了在全局配置文件(mybatis-config.xml)中有代码提示,需要引入dtd约束(dtd文件是用来规定xml中的标签语法规则的)

方式一:联网状态下直接下载

步骤1:打开mybatis的全局配置文件(mybatis-config.xml),ctrl+鼠标移动到配置文件中的dtd网址,即可在线下载dtd文件

步骤2:下载完成后,点击eclipse中Window--->Preference--->XML--->XML Catalog。然后点击Add添加,Key中填写dtd文件网址,Key type选择URI,Location中选择要引入的dtd文件,最后点击ok即可

方式二:未联网状态下解压mybatis的jar包导入

步骤1:找到mybatis-3.4.1.jar包,使用解压缩软件打开,按照mybatis-3.4.1.jar\org\apache\ibatis\builder\xml这个路径,即可找到两个dtd文件,将这两个文件复制出来即可。

步骤2:点击eclipse中Window--->Preference--->XML--->XML Catalog。然后点击Add添加,Key中填写dtd文件网址,Key type选择URI,Location中选择要引入的dtd文件,最后点击ok即可

 

三、properties标签(属性)

properties标签可以引入外部properties配置文件的内容

properties标签有两个参数:

  • 第一个参数(resource):引入类路径下的资源
  • 第二个参数(url):引入网络路径或磁盘路径下的资源

示例:通过properties标签,引入properties文件中的数据源信息

步骤1:创建properties文件(此处在全局配置文件的文件夹下创建)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

步骤2:修改全局配置文件,通过properties标签引入properties文件,并读取数据源信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="dbconfig.properties"></properties>


	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" /> 
			</dataSource>
		</environment>
	</environments>

	<!-- 将sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

注意:与Spring框架整合时,数据源的配置和管理交由Spring来完成,即:properties标签不常使用!

 

四、settings标签(设置)

mybatis中settings是最复杂的配置,它能深刻影响mybatis底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可,比如自动映射,驼峰命名映射,级联规则,是否启动缓存,执行器类型等。

settings标签的配置项说明如下:

配置项作用配置选项默认值
cacheEnabled该配置影响所有映射器中配置缓存的全局开关true|falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 true|falsefalse
aggressiveLazyLoading当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载true|false版本3.4.1 (不包含)  之前 true,之后 false
multipleResultSetsEnabled

是否允许单一语句返回多结果集(需要兼容驱动)

true|falsetrue
useColumnLabel使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果true|falsetrue
useGeneratedKeys允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)true|falsefalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。
NONE 表示取消自动映射。
PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。
FULL 会自动映射任意复杂的结果集(无论是否嵌套)
NONE、PARTIAL、FULLPARTIAL
autoMappingUnknownColumnBehavior指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常NONE、WARNING、FAILINGNONE
defaultExecutorType配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新 SIMPLE、REUSE、BATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数任何正整数Not Set (null)
defaultFetchSize设置数据库驱动程序默认返回的条数限制,此参数可以重新设置任何正整数  Not Set (null)
safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 falsetrue|falsefalse
safeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置falsetrue|falsetrue
mapUnderscoreToCamelCase是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射true|falsefalse
localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。
默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据  
SESSION|STATEMENTSESSION
jdbcTypeForNull当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHERNULL、VARCHAR、OTHER OTHER
lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载equals、clone、hashCode、toString
defaultScriptingLanguage指定动态 SQL 生成的默认语言org.apache.ibatis
.script.ing.xmltags
.XMLDynamicLanguageDriver
callSettersOnNulls指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 nulltrue|falsefalse
logPrefix指定 MyBatis 增加到日志名称的前缀 任何字符串Not set
loglmpl指定 MyBatis 所用日志的具体实现,未指定时将自动査找SLF4J|LOG4J|LOG4J2|JDK_LOGGING
|COMMONS_LOGGING
|ST DOUT_LOGGING|NO_LOGGING
Not set
proxyFactory指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具CGLIB|JAVASSISTJAVASSIST (MyBatis 版本为 3.3 及以上的)
vfsImpl指定 VFS 的实现类  提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔 Not set
useActualParamName允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用)true|falsetrue

示例:mapUnderscoreToCamelCase(是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射

数据库表设计:

数据库表对应的JavaBean:

settings标签中的mapUnderscoreToCamelCase属性,默认是false,即未开启自动驼峰命名规则映射,此时通过mybatis获取数据表中的信息,由于数据库表中last_name和JavaBean中lastName命名不同,不能直接映射,所以查询的字段为null

解决方案:

(1)为数据表中的列定义别名,别名对应JavaBean中的字段名

(2)将settings标签中的mapUnderscoreToCamelCase属性设置为true,即开启自动驼峰命名规则映射

 

五、typeAliases标签(类型别名)

typeAliases标签为某个Java类型起别名

(1)typeAliases标签下的typeAlias标签有两个参数:

  • 第一个参数(type):指定要起别名的类型全类名,默认别名就是类名的小写
  • 第二个参数(alias):指定新的别名

(2)typeAliases标签下的package标签,可以为某个包下的所有类批量起别名

  • 第一个参数(name):指定包名(为当前包以及下面所有的后代包的每一个类起一个默认别名,即类名小写)

(3)批量起别名时,如果有类名冲突,可以使用@Alias注解为某个类指定新的类名

示例1:使用typeAlias标签为某个类起别名

步骤1:在全局配置文件mybatis-config.xml中,为Employee类起别名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="dbconfig.properties"></properties>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<typeAlias type="com.csu.marden.Employee" alias="emp"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" /> 
			</dataSource>
		</environment>
	</environments>

	<!-- 将sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

步骤2:在sql映射文件中,直接使用上述别名即可

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.csu.marden.EmployeeMapper">

 <!-- namespace:名称空间 -->
 <!-- id:唯一标识 -->
 <!-- resultType:返回值类型 -->
 <!-- #{id}:从传递过来的参数中取出id值 -->
  
  
  <!-- 字段不对应的情况,起别名!!! -->
	<select id="getEmpById" resultType="emp">
		select   * from tbl_employee where id = #{id}
	</select>
</mapper>

示例2:使用package标签为包下的所有类起别名

步骤1:在全局配置文件mybatis-config.xml中,为com.csu.marden包下的所有类起别名,默认为类名小写

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="dbconfig.properties"></properties>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<package name="com.csu.marden"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" /> 
			</dataSource>
		</environment>
	</environments>

	<!-- 将sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

步骤2:在sql映射文件中,直接使用上述别名即可

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.csu.marden.EmployeeMapper">

 <!-- namespace:名称空间 -->
 <!-- id:唯一标识 -->
 <!-- resultType:返回值类型 -->
 <!-- #{id}:从传递过来的参数中取出id值 -->
  
  
  <!-- 字段不对应的情况,起别名!!! -->
	<select id="getEmpById" resultType="employee">
		select   * from tbl_employee where id = #{id}
	</select>
</mapper>

 

六、typeHandlers标签(类型处理器)

mybatis中通过typeHandlers标签完成JDBC类型与Java类型的转换。即mybatis在设置预处理语句中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。

类型处理器Java类型JDBC类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的NUMERIC 或BYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的NUMERIC 或SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的NUMERIC 或INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的NUMERIC 或LONG INTEGER
FloatTypeHandlerjava.lang.Float, float数据库兼容的NUMERIC 或FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的NUMERIC 或DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的NUMERIC 或DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR

 

七、plugins标签(插件)

插件是mybatis提供的一个非常强大的机制,我们可以通过插件来修改mybatis的一些核心行为。

插件通过动态代理机制,可以介入下面四大对象的任何一个方法的执行。

mybatis允许在sql映射语句执行过程中的某一点进行拦截调用。默认情况下,mybatis允许使用插件来拦截的方法调用如下:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

 

八、environments标签(环境)

environments标签

  • mybatis可以通过environments标签配置多种环境,比如开发,测试和生产环境需要不同的配置
  • 每种环境使用一个environment标签进行配置并指定唯一标识符
  • 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境(default属性对应environment标签的id属性)

environment标签

  • environment标签用来配置一个具体的环境信息,包括id属性和两个标签
  • id属性:指定当前环境的唯一标识
  • 两个标签:transactionManager标签和dataSource标签

transactionManager标签

  • transactionManager标签用来配置事务管理器,其中type属性用来配置事务管理器的类型
  • type属性:JDBC | MANAGED | 自定义
  • JDBC(JdbcTransactionFactory):使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理实务范围
  • MANAGED(ManagedTransactionFactory):不提交或回滚一个连接,让容器来管理实务的整个生命周期(比如JEE应用服务器的上下文)
  • 自定义:实现TransactionFactory接口,type==全类名/别名

dataSource标签

  • dataSource标签用来配置数据源,其中type属性用来配置数据源类型
  • type属性:UNPOOLED | POOLED | JNDI | 自定义
  • UNPOOLED(UnpooledDataSourceFactory):不适用连接池
  • POOLED(PooledDataSourceFactory):使用连接池
  • JNDI(JndiDataSourceFactory):在EJB或应用服务器这类容器汇总查找指定的数据源
  • 自定义:实现DataSourceFactory接口,定义数据源的获取方式,type==全类名/别名

注意:在environments标签下,尽管可以配置多个环境,但是default只能选择运用某一个环境(开发环境,测试环境,生产环境等)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
	<environments default="dev_mysql">
	
				 <environment id="dev_mysql">
			            <transactionManager type="JDBC"></transactionManager>
			            <dataSource type="POOLED">
			                <property name="driver" value="${jdbc.driver}" />
			                <property name="url" value="${jdbc.url}" />
			                <property name="username" value="${jdbc.username}" />
			                <property name="password" value="${jdbc.password}" />
			            </dataSource>
			        </environment>

		        <environment id="dev_oracle">
		            <transactionManager type="JDBC" />
		            <dataSource type="POOLED">
		                <property name="driver" value="${orcl.driver}" />
		                <property name="url" value="${orcl.url}" />
		                <property name="username" value="${orcl.username}" />
		                <property name="password" value="${orcl.password}" />
		            </dataSource>
		        </environment>
	</environments>

	
	
	<!-- 将sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

注意:数据源的配置与事务管理器的配置都会由整合后的Spring来负责,此处做了解即可。

 

九、databaseIdProvider标签(数据库厂商标识)

mybatis通过databaseIdProvider标签支持多数据厂商,即根据不同的数据库厂商执行不同的语句

type属性是必须的,不配置时会报错,该属性值使用的是DB_VENDOR(VendorDatabaseIdProvider类的别名)。其作用就是得到数据库厂商的标识(数据库驱动自带),mybatis就能根据数据库厂商标识来执行不同的sql语句

property子标签的作用是配置一个数据库,其中name属性就是数据库名称,value属性就是我们自定义的别名,通过别名我们可以在sql语句中表示适用于哪种数据库运行

databaseIdProvider标签的配置: 

 <!--数据库厂商标识 -->
2     <databaseIdProvider type="DB_VENDOR">
3         <property name="Oracle" value="oracle"/>
4         <property name="MySQL" value="mysql"/>
5         <property name="DB2" value="d2"/>
6     </databaseIdProvider>

sql映射文件中使用databaseId属性来标识数据库类型:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.csu.marden.EmployeeMapper">

	<select id="getEmpById" resultType="employee" databaseId="mysql">
		select   * from tbl_employee where id = #{id}
	</select>
	
</mapper>

 

十、mappers标签(映射器)

mappers标签的作用是将sql映射文件注册到全局配置文件中

  • resource属性:引用类路径下的sql映射文件
  • url属性:引用网络路径或磁盘路径下的sql映射文件
  • class属性:直接引用接口(注册接口)。若有sql映射文件,则映射文件名必须和接口同名,并且放在与接口同一目录下。若没有sql映射文件(所有的sql都是利用注解写在接口上)。
  • package子标签:批量注册,引入包下所有的映射接口。映射文件名必须与接口同名,并且映射文件与接口必须放在同一个目录下,name属性写包名。

使用resource属性(使用相对于类路径下的资源):

<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>

使用class属性(直接引用接口):

<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

使用package子标签(引入包下所有的映射接口)

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以将数据库操作与Java对象之间的映射关系进行配置,提供了一种简单且灵活的方式来访问数据库。 在MyBatis中,映射文件是用于定义SQL语句和结果映射的配置文件。下面是映射文件的详解: 1. 命名空间(namespace):映射文件中的命名空间用于对SQL语句进行分类和管理,可以通过命名空间来引用映射文件中定义的SQL语句。 2. 结果映射(resultMap):结果映射用于将查询结果映射到Java对象上。可以通过resultMap标签定义结果映射,指定查询结果与Java对象之间的对应关系。 3. SQL语句(select、insert、update、delete):映射文件中可以定义各种SQL语句,包括查询、插入、更新和删除等操作。可以通过标签(如select、insert、update、delete)来定义SQL语句,并在其中编写具体的SQL语句。 4. 参数映射(parameterType):参数映射用于将Java对象作为参数传递给SQL语句。可以通过parameterType属性指定参数类型,也可以通过parameterMap标签定义参数映射。 5. 返回值映射(resultType):返回值映射用于将查询结果转换为Java对象。可以通过resultType属性指定返回值类型,也可以通过resultMap标签引用已定义的结果映射。 6. 动态SQL:MyBatis支持动态SQL,可以根据条件动态生成SQL语句。可以使用if、choose、when、otherwise等标签来实现动态SQL的编写。 7. 参数传递:映射文件中可以使用#{}或者${}来传递参数。#{}会将参数转义后传递给数据库,${}会直接将参数拼接到SQL语句中。 8. 引用其他映射文件:映射文件可以通过include标签引用其他映射文件,可以将一些通用的SQL语句定义在公共的映射文件中,然后在需要的地方引用。 以上是对MyBatis映射文件的详解,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值