第三章 MyBatis Mapper 的 XML 配置文件

15 篇文章 0 订阅
9 篇文章 0 订阅

第三章 MyBatis  Mapper 的 XML 配置文件

爱玩酷原创(https://www.iplayers.cn

文章来自(第三章 MyBatis  Mapper 的 XML 配置文件)



一、属性(properties properties )


JAVA 属性文件就可以配置直观的、可代替的属性,或者是属性项的子项。比如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
通过动态配置,这些属性都可以用替换整个文件的值。例如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>



二、设置(settings  )



三、类型别名(typeAliases)

类型别名是 Java 类型的简称。
它仅仅只是关联到 XML 配置,简写冗长的 JAVA 类名。例如:
<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>
使用这个配置,“Blog”就能在任何地方代替“domain.blog.Blog”被使用。


还有一些与通用 JAVA 类型建立的别名。它们是大小写敏感的,注意 JAVA 的基本类型,使用了_来命名。

如:

_byte   byte



四、类型句柄(typeHandlers  )


类型句柄                 Java 类型                   JDBC 类型

BooleanTypeHandler Boolean, boolean 任何与 BOOLEAN 兼容的类型
ByteTypeHandler Byte, byte 任何与 NUMERIC or BYTE 兼容的类型
ShortTypeHandler Short, short 任何与 NUMERIC or SHORT INTEGER 兼容的类型
IntegerTypeHandler Integer, int 任何与 NUMERIC or INTEGER 兼容的类型
LongTypeHandler Long, long 任何与 NUMERIC or LONG INTEGER 兼容的类型
FloatTypeHandler Float, float 任何与 NUMERIC or FLOAT 兼容的类型
DoubleTypeHandler Double, double 任何与 NUMERIC or DOUBLE 兼容的类型
BigDecimalTypeHandler BigDecimal 任何与 NUMERIC or DECIMAL 兼容的类型
StringTypeHandler String CHAR, VARCHAR
ClobTypeHandler String CLOB, LONGVARCHAR
NStringTypeHandler String NVARCHAR, NCHAR
NClobTypeHandler String NCLOB
ByteArrayTypeHandler byte[] 任何与字节流兼容的类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler Date (java.util) TIMESTAMP
DateOnlyTypeHandler Date (java.util) DATE
TimeOnlyTypeHandler Date (java.util) TIME
SqlTimestampTypeHandler Timestamp (java.sql) TIMESTAMP
SqlDateTypeHadler Date (java.sql) DATE
SqlTimeTypeHandler Time (java.sql) TIME
ObjectTypeHandler Any 其它未指定的类型
EnumTypeHandler Enumeration Type VARCHAR - 任何与 string 兼容的类型。存储的是枚举编码,而不是枚举索引


你可以重写(loverride)类型句柄或者是创建你自己的方式来处理不支持或者是非标准的类型。只需要
简单地实现 org.mybatis.type 包里的 TypeHandler,并且映射你的新类型句柄类到一个 JAVA 类型,再选
定一个 JDBC 类型。例如:
public class ExampleTypeHandler implements TypeHandler {
public void setParameter(
PreparedStatement ps, int i, Object parameter,JdbcType jdbcType)
throws SQLException {
ps.setString(i, (String) parameter);
}
public Object getResult(
ResultSet rs, String columnName)
throws SQLException {
return rs.getString(columnName);
}
public Object getResult(
CallableStatement cs, int columnIndex)
throws SQLException {
return cs.getString(columnIndex);
}
}


<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>


使用像这样的类型句柄,将会覆盖现有的处理 J AVA String 属性与 VARCHAR 和返回值的类型句柄。注
意,MyBatis 无法省查数据库的元数据从而决定类型,所以你必须指定参数它是一个 VARCHAR 类型,
并且结果映射到正确的类型句柄上。这么做主要是由于 MyBatis 在没有执行语句之类,无法得知数据的
类型。

五、对象工厂(ObjectFactory   )


每次 MyBatis 为结果对象创建一个新实例,都会用到 ObjectFactory。默认的 ObjectFactory 与使用目标类
的构造函数创建一个实例毫无区别,如果有已经映射的参数,那也可能使用带参数的构造函数。如果你
重写 ObjectFactory 的默认操作,你可以创建一下你自己的。比如:
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type);


}
public Object create(
Class type,
List<Class> constructorArgTypes,
List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArg
}
public void setProperties(Properties properties) {
super.setProperties(properties);
}


}


<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>


ObjectFactory 接口非常简单,只包含两个方法,一个是构造函数,一个是带参数的构造函数。最后,
setProperties 方法也可以使用 ObjectFactory 来配置。可以在 ObjectFactory 实例化后,通过 setProperties
方法,在对象工厂中定义属性。

六、插件(plugins )

MyBatis 允许你在映射语句执行过程中某点上拦截调用。默认的,MyBatis 允许插件拦截以下调用:
� Executor
(update, query, flushStatements, commit, rollback, getTransaction, close,
isClosed)
� ParameterHandler
(getParameterObject, setParameters)
� ResultSetHandler
(handleResultSets, handleOutputParameters)
� StatementHandler
(prepare, parameterize, batch, update, query)


这些类的细节在每个方法签名中均可以找到,源代码在 MyBatis 每次发布时都可以下载。如果你要做的
事不仅仅是调用,而是重写(overriding)方法,那你需要了解你要重写的方法的动作。如果你试图修改
或者重写既定方便的动作,你最好深入到 MyBatis 的核心。因为这些方法和类都底层的架构,所以使用
插件时要格外小心。


使用插件是非常简单而又有用的。只需要简单地实现这个 Interceptor 接口,确定好你要拦截的标识即可。
@Intercepts({@Signature(
type= Executor.class,

method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}


<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的这个插件可以在执行器上拦截所有“update”方法的调用,这里的执行器,是一个映射语句内部
对象的深架构的执行器。
重写 Configuration 类
附加说明一下,对于使用插件修改 MyBatis 的内核动作,你也可以重写整个 Configuration 类。简单地继
承或者重写所有的方法,然后把它做为参数代入 sqlSessionFactoryBuilder.build(myConfig)中。再次强调,
这会引起 MyBatis 动作的严重冲突,慎用。



七、环境(environments  )

MyBatis 可以配置多个环境。这可以帮助你 SQL 映射对应多种数据库等。比如说,你想为开发、测试、
发布产品配置不用的环境。或者,你想为多个数据库产品共享相同的模式,或者也想使用相同的 SQL
映射。等等。
需要记住一个重要的事情:虽然你可以配置多重环境,你也可以只选择一对一


sqlSessionFactoryBuilder.build(reader,eennvironment);

环境元素定义这些环境是如何被配置的。x
<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>

注意这些关键段:� 设定一个默认环境 ID� 这个环境 ID 对每个环境都起作用� 配置事务管理器� 配置数据源默认的环境和环境 ID 是对自己起作用,你可以随意起你想叫的名字,只是他们是不重复的就可以了。

事务管理器MyBatis 有两个事情管理类型:� JDBC - 这个类型直接全部使用 JDBC 的提交和回滚功能。它依靠使用连接的数据源来管理事务的作用域。� MANAGED MANAGED MANAGED - 这个类型什么不做,它从不提交、回滚和关闭连接。而是让窗口来管理事务的全部生命周期。(比如说 Spring 或者 JAVAEE 服务器)它们俩都不需要任何的属性。然而,既然它们是类型别名,你就直接把你的类名称或者类型别名指向你的 TransactionFactory 接口实现类就可以了。


数据源数据源元素是用来配置使用 JDBC 数据源接口的 JDBC 连接对象的源。大部分的 MyBatis 应用像上面例子中那样配置数据源。但是,这并不是必须的。需要清楚的是:只要使用了懒加载,才必须使用数据源。数据源类型有三种:UNPOOLED,POOLED,JNDI。

 UNPOOLED NPOOLED - 这个数据源实现只是在每次请求的时候简单的打开和关闭一个连接。虽然这有点慢,但作为一些不需要性能和立即响应的简单应用来说,不失为一种好选择。不同的数据库在性能方面也有所不同,所以相对于连接池来说倒是不重要,这个配置倒是蛮理想。UNPOOLED 数据源有几个属性:� driver - 指定 JDBC 驱动器的 JAVA 类,而不是数据类。� url - 连接数据库实例的 URL 路径� username - 登录数据库的用户名� password - 登录数据库的密码� defaultTransactionsolationLevel - 指定连接的默认事务隔离层另外,你也可以为数据驱动器设置属性。只需要简单取‘driver.’开头就行了,比如说:� driver.encoding=UTF8这就会把属性为‘encoding’,值为‘UTF-8’,通过 DriverManager.getConnection(url, driverProperties) 方法传递能数据库驱动器。


POOLED - 这个数据源缓存 JDBC 连接对象用于避免每次都要连接和生成连接实例而需要的验证时间。对于并发 WEB 应用,这种方式非常流行因为它有最快的响应时间。


JNDI - 这个数据源实现是为了准备和 Spring 或应用服务一起使用,可以在外部也可以在内部配置这个数据源,然后在 JNDI 上下文中引用它。这个数据源配置只需要两上属性:� initial_context - 这 个 属 性 是 被 用 于 上 下 文 从 InitialContext 中 ( 比 如 :initialContext.lookup(initial_context))查找。这个属性是可选的,如果被省略,InitialContext 将会直接查找 data_source 属性。� data_source - 这是数据源实例能搜索到的上下文路径。它会直接查找 initial_context 搜索返回的值,如果 initial_context 没有值的庆,直接使用 InitialContext 查找。


像数据源其它配置一样,可以使用以‘env.’属性直接设给 InitialContext,例如:� env.encoding=UTF8这样就可以把值为‘UTF8’的属性直接代入 InitialContext 实例化的构造器。


八、映射器(Mappers )


现在 MyBatis 的动作已经通过以上的步骤配置好了。我们现在开始定义我们的映射 SQL 语句。首先,我们需要告诉 MyBatis 去哪儿寻找。JAVA 在自动发现上没有什么好的方法,所以最好的方式就是直接告诉 MyBatis 去哪发现映射文件。你可以使用类路径中的资源引用,或者使用字符,输入确切的 URL 引用.


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


// Using url fully qualified paths
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值