映射器实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和SqlSession相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。下面的示例就展示了这个实例:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
XML映射配置文件
MyBatis的XML配置文件包含了影响MyBatis行为甚深的设置和属性信息。XML文档的高层级结构如下:
configuration配置
properties属性
settings设置
typeAliases类型命名
typeHandlers类型处理器
objectFactory对象工厂
plugins插件
environments环境
environment环境变量
transactionManager事务管理器
dataSource数据源
映射器
properties
这些是外部化的,可替代的属性,这些属性也可以配置在典型的Java属性配置文件中,或者通过properties元素的子元素来传递。例如:
<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>
这个例子中的username和password将会由properties元素中设置的值来替换。driver和url属性将会从包含进来的config.properties文件中的值来替换。这里提供很多配置的选项。
属性也可以被传递到SqlSessionBuilder.build()方法中。例如:
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, environment, props);
如果在这些地方,属性多于一个的话,MyBatis按照如下的顺序加载它们:
在properties元素体内指定的属性首先被读取。
从类路径下资源或properties元素的url属性中加载的属性第二被读取,它会覆盖已经存在的完全一样的属性。
作为方法参数传递的属性最后被读取,它也会覆盖任一已经存在的完全一样的属性,这些属性可能是从properties元素体内和资源/url属性中加载的。
因此,最高优先级的属性是那些作为方法参数的,然后是资源/url属性,最后是properties元素中指定的属性。
Settings
这些是极其重要的调整,它们会修改MyBatis在运行时的行为方式。
一个设置信息元素的示例,完全的配置如下所示:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
typeAliases
类型别名是为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>
使用这个配置,“Blog”可以任意用来替代“domain.blog.Blog”所使用的地方。
对于普通的Java类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。
typeHandlers
无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。例如:
// ExampleTypeHandler.java
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);
}
}
// MapperConfig.xml
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
使用这样的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。
objectFactory
MyBatis每次创建结果对象新的实例时,它使用一个ObjectFactory实例来完成。如果参数映射存在,默认的ObjectFactory不比使用默认构造方法或带参数的构造方法实例化目标类做的工作多。如果你想重写默认的ObjectFactory,你可以创建你自己的。比如:
// ExampleObjectFactory.java
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, constructorArgs);
}
public void setProperties(Properties properties) {
super.setProperties(properties);
}
}
// MapperConfig.xml
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory接口非常简单。它包含两个用于创建的方法,一个是默认构造方法,另外一个是处理带参数的构造方法。最终,setProperties方法可以被用来配置ObjectFactory。在初始化你的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的发行包中。你应该理解你所覆盖方法的行为,假设你所做的要比监视调用要多。如果你尝试修改或覆盖一个给定的方法,你可能会打破MyBatis的核心。这是低层次的类和方法,要谨慎使用插件。
使用插件是它们提供的非常简单的力量。简单实现拦截器接口,要确定你想拦截的指定签名。
// ExamplePlugin.java
@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) {
}
}
// MapperConfig.xml
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
environments
MyBatis可以配置多种环境。这会帮助你将SQL映射应用于多种数据库之中。例如,你也许为开发要设置不同的配置,测试和生产环境。或者你可能有多种生产级数据库却共享相同的模式,所以你会想对不同数据库使用相同的SQL映射。这种用例是很多的。
要记得一个很重要的问题:你可以配置多种环境,但你只能为每个SqlSessionFactory实例选择一个。
所以,如果你想连接两个数据库,你需要创建两个SqlSessionFactory实例,每个数据库对应一个。而如果是三个数据库,你就需要三个实例,以此类推。记忆起来很简单:
每个数据库对应一个SqlSessionFactory
为了明确创建哪种环境,你可以将它作为可选的参数传递给SqlSessionFactoryBuilder。可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
如果环境被忽略,那么默认环境将会被加载,如下进行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = 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>
注意这里的关键部分:
默认的环境ID(比如:default=”development”)。
每个environment元素定义的环境ID(比如:id=”development”)。
事务管理器的配置(比如:type=”JDBC”)。
数据源的配置(比如:type=”POOLED”)。
默认的环境和环境ID是自我解释的。你可以使用你喜欢的名称来命名,只要确定默认的要匹配其中之一。
transactionManager
在MyBatis中有两种事务管理器类型(也就是type=”[JDBC|MANAGED]”):
JDBC – 这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
这两种事务管理器都不需要任何属性。然而它们都是类型别名,要替换使用它们,你需要放置将你自己的类的完全限定名或类型别名,它们引用了你对TransacFactory接口的实现类。
public interface TransactionFactory {
void setProperties(Properties props);
Transaction newTransaction(Connection conn, boolean autoCommit);
}
任何在XML中配置的属性在实例化之后将会被传递给setProperties()方法。你的实现类需要创建一个事务接口的实现,这个接口也很简单:
public interface Transaction {
Connection getConnection();
void commit() throws SQLException;
void rollback() throws SQLException;
void close() throws SQLException;
}
使用这两个接口,你可以完全自定义MyBatis对事务的处理。
dataSsource
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源。
许多MyBatis的应用程序将会按示例中的例子来配置数据源。然而它并不是必须的。要知道为了方便使用延迟加载,数据源才是必须的。
有三种内建的数据源类型(也就是type=”???”):
UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的。UNPOOLED类型的数据源仅仅用来配置以下5种属性:
driver – 这是JDBC驱动的Java类的完全限定名(如果你的驱动包含的有,它也不是数据源类)。
url – 这是数据库的JDBC URL地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
作为可选项,你可以传递数据库驱动的属性。要这样做,属性的前缀是以“driver.”开头的,例如:
driver.encoding=UTF8
这样就会传递以值“UTF8”来传递 “encoding” 属性,它是通过DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动。
POOLED – 这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。这是一种当前Web应用程序用来快速响应请求很流行的方法。
除了上述(UNPOOLED)的属性之外,还有很多属性可以用来配置POOLED数据源:
poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连接的数量。默认值:10
poolMaximumIdleConnections – 任意时间存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认值:20000毫秒(也就是20秒)
poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败)。默认值:20000毫秒(也就是20秒)
poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。默认是“NO PING QUERY SET”,这会引起许多数据库驱动连接由一个错误信息而导致失败。
poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置poolPingQuery属性。默认值:false。
poolPingConnectionsNotUsedFor – 这是用来配置poolPingQuery多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:0(也就是所有连接每一时刻都被侦测-但仅仅当poolPingEnabled为true时适用)。
JNDI – 这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这个数据源配置只需要两个属性:
initial_context – 这个属性用来从初始上下文中寻找环境(也就是initialContext.lookup(initial——context))。这是个可选属性,如果被忽略,那么data_source属性将会直接以initialContext为背景再次寻找。
data_source – 这是引用数据源实例位置的上下文的路径。它会以由initial_context查询返回的环境为背景来查找,如果initial_context没有返回结果时,直接以初始上下文为环境来查找。
和其他数据源配置相似,它也可以通过名为“env.”的前缀直接向初始上下文发送属性。比如:
env.encoding=UTF8
在初始化之后,这就会以值“UTF8”向初始上下文的构造方法传递名为“encoding”
的属性。
mappers
既然MyBatis的行为已经由上述元素配置完了,我们现在就要定义SQL映射语句了。但是,首先我们需要告诉MyBatis到哪里去找到这些语句。Java在这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis到哪里去找映射文件。你可以使用相对于类路径的资源引用,或者字符表示,或url引用的完全限定名(包括file:///URLs)。例如:
// 使用相对于类路径的资源
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// 使用完全限定路径
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>
这些语句简单告诉了MyBatis去哪里找映射文件。其余的细节就是在每个SQL映射文件中了,下面的部分我们来讨论SQL映射文件。
相关推荐
综上所述,MyBatis 的 XML 配置文件是实现 SQL 映射和 Java 代码解耦的关键。通过定义映射文件,我们可以方便地管理数据库操作,提高代码的可读性和可维护性。在 "mybatis_test01" 这个例子中,你可以进一步学习如何...
在本高级映射实例中,我们将深入探讨如何使用XML方式编写Mapper文件,以及如何利用关联嵌套和鉴别器(Discriminator)功能。 首先,让我们了解MyBatis中的Mapper文件。Mapper文件是MyBatis的核心组件之一,它定义了...
通过这个实例项目,开发者可以从实践中学习MyBatis的使用,掌握如何配置MyBatis,如何编写Mapper接口和XML映射文件,以及如何在Java代码中调用Mapper接口进行数据操作。同时,结合Maven的使用,可以理解项目构建和...
这个实例中的"mybatis整合spring实例(完整版)"文件可能包含了上述所有步骤的源代码,包括Spring的配置文件、MyBatis的配置文件、Mapper接口、XML文件以及相关的Java类。通过仔细阅读和理解这些代码,开发者可以...
2. **Mapper接口与XML映射文件** - 明白如何定义SQL语句,以及如何在Java代码中调用它们。 3. **动态SQL** - 了解MyBatis的动态SQL功能,如`<if>`,`<choose>`,`<when>`,`<otherwise>`等标签,使SQL更具灵活性。 4...
1. **配置文件**(mybatis-config.xml):这是MyBatis的全局配置文件,用于设置数据库连接信息、事务管理器等。例如: ```xml ``` 2. **实体类**:根据数据库表结构创建对应的Java对象...
7. **注解式编程**:除了XML映射,Mybatis还支持在Java类和方法上使用注解,简化配置,提高开发效率。 8. **事务管理**:Mybatis支持手动和自动两种事务管理模式。在多条SQL操作时,事务控制确保数据的一致性。 9....
在SpringMVC的配置中,你需要定义视图解析器,如InternalResourceViewResolver,以及处理请求的处理器映射器和适配器。Mybatis的XML配置文件则用来设置数据源、事务管理策略,以及扫描Mapper接口的位置。 6. **最佳...
SQL 映射文件用于定义 SQL 语句,包括增删改查操作,参数映射和结果集映射。MyBatis 配置文件则是整个框架的配置中心,它包含了数据源、事务管理、SqlSessionFactory 和 SqlSession 的配置等。 1. **MyBatis 配置...
配置MyBatis的核心配置文件`mybatis-config.xml`,包括数据源、事务管理器等信息。 2. **创建数据库和表** 为了运行实例,你需要一个数据库,例如MySQL,并创建相应的表。例如,创建一个名为`users`的表,包含`id...
2. **配置MyBatis**:在Spring的上下文配置文件中,配置MyBatis的SqlSessionFactory,包括数据源、事务管理器和MyBatis的配置文件路径。 3. **创建Mapper接口和XML配置**:为数据库操作创建Mapper接口,并在对应的...
3. **Mapper接口与注解**:除了XML映射文件,Mybatis还支持使用注解来简化配置。例如,可以在Mapper接口的方法上使用`@Select`, `@Insert`, `@Update`, `@Delete`注解,直接写入SQL语句。 4. **增删改查(CRUD)...
2. 编写Mapper接口和对应的XML映射文件,定义SQL语句。 3. 创建Mapper接口的实现类,通常不需要实现任何方法,因为MyBatis会自动生成。 4. 使用SqlSessionFactoryBuilder读取配置文件生成SqlSessionFactory。 5. ...
如果你使用Spring框架,需要在Spring的配置文件中配置MyBatis的SqlSessionFactory和Mapper扫描器,使Spring能自动管理Mapper接口的实例。 7. **测试连接**: 在Eclipse中创建一个JUnit测试类,注入`TestService`...
首先,MyBatis的核心是SQL映射文件,这些文件是XML格式的,定义了SQL语句及其相关的参数映射和结果映射。在`mybatis-3_master.zip`中可能包含了MyBatis的源码,这有助于理解其内部工作原理。通过XML配置,我们可以...
- 创建MyBatis的全局配置文件`mybatis-config.xml`,设置数据源、事务管理等信息。 - 编写Mapper XML文件,定义SQL语句和结果映射。 ### 4. 配置MyBatis-Spring - 在Service层使用`@Autowired`注解注入Mapper接口,...
在Spring的配置文件中,引入Mybatis的配置,配置SqlSessionFactoryBean,然后通过MapperScannerConfigurer扫描指定包下的Mapper接口,自动将它们与XML映射文件关联。 4. **使用注解简化配置** 使用Spring的@...
Mybatis的Mapper接口和XML映射文件负责SQL的编写和执行,它们定义了数据库操作的方法并映射到具体的SQL语句。 最后,编写Controller层的代码,处理HTTP请求,调用Service层进行业务逻辑处理。Service层进一步调用...
创建`mybatis-config.xml`配置文件,配置MyBatis的基本信息,包括映射文件的位置等: ```xml <mapper resource="com/example/mapper/UserMapper.xml"/> ``` 定义实体类,例如`User`,并创建对应的接口`...
MyBatis是一个轻量级的Java持久...这个实例展示了如何配置MyBatis,创建Mapper接口,编写XML映射文件,并在测试类中运行SQL。了解这些基础知识后,可以进一步探索MyBatis的高级特性,如动态SQL、缓存机制、级联映射等。