mybatis知识总结(三)配置分析

来源:互联网 发布:暴漫淘宝 编辑:程序博客网 时间:2024/06/05 09:40
每一个Mybatis应该都是以一个SqlSessionFactory实例为中心的,一个SqlSessionFactory实例都可以使用SqlSessionFactoryBuilder来创造。从配置类中创造的定制SqlSessionFactoryBuilder 实例,可以使用XML配置文件来生成一个SqlSessionFactory 实例。
1.       从xml中创造SqlSessionFactory
MyBatis 有一个Resources 通用类,类中有许多方法可以简单地从类路径和其他地址中加载资源。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
 
XML 文件包含了许多MyBatis 的核心设置,包括一个获取数据库连接(Connection)实例的数据源(DataSource),一个决定事务作用域和操作的TransactionManager。全部的XML 配置文件的内容将在以后提到,先给出一个简单的样子。
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<mappers>
<mapper resource="org/mybatis/example/XXMapper.xml"/>
</mappers>
</configuration>
2.       不使用xml文件新建SqlSessionFactory
DataSource dataSource = DataSourceFactory.getDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment =
new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(XXMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
3.       使用SqlSessionFactory获取SqlSession
通过一个SqlSessionFactory,就可以获取一个SqlSession实例,SqlSession包含了针对数据库执行语句的每一个方法,直接使用SqlSession执行已经映射的每一个SQL语句:
SqlSession session = sqlSessionFactory.openSession();
try {
XXMapper mapper = session.getMapper(XXMapper.class);
XX  xx= mapper.selectXx (101);
} finally {
session.close();
五.探究SQL映射语句
接下来先看一个简单的demo,来完成SqlSession的调用过程
<?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.coin.dao.PersonDao">
         <select id="getPerson" resultType="Person" parameterType="long">
            SELECT id,name
            FROM T_Person
            WHERE id = #{id}
</select></mapper>
可以用下列语句简单地针对Mapper 接口进行调用上面文件,代码如下:
PersonDao mapper = session.getMapper(PersonDao.class);
Person p= mapper.getPerson (1);
 
还有一个关于Mapper 类的技巧。它们的映射语句完全不需要使用XML 来配置,可以使用JAVA 注解方式来取代。比如,上面的XML 语句可以替换为:
public interface PersonDao {
@Select("SELECT id,name
            FROM T_Person
            WHERE id = #{id}
")
Person  getPerson (int id);
 
总结:注解是非常简单明了的,但是JAVA 注解既有局限性,在语句比较复杂的情况下又比较容易混乱。所以,如果你的语句比较复杂,最好还是使用XML 来映射语句。
六.作用域和生命周期
1.       SqlSessionFactoryBuilder
这个类可以被初始,使用和丢弃,因为如果已经创建好一个SqlSessionFactory后就不用再保留它,所以SqlSessionFactoryBuilder的最好作用域是方法体内的。
2.       SqlSessionFactory
一旦创建,SqlSessionFactory 就会在整个应用过程中始终存在。所以没有理由去销毁和再创建它,一个应用运行中也不建议多次创建SqlSessionFactory。因此SqlSessionFactory最好的作用域是Application。可以结合使用Google Guice 或Spring 来进行依赖反射。这些框架允许你生成管理器来管理SqlSessionFactory 的单例生命周期。
3.       SqlSession
每个线程都有自己的SqlSession 实例,SqlSession 实例是不能被共享,也是不是线程安全的。因此最好使用Request 作用域或者方法体作用域。比如说在Servlet 中的HttpSession 中。如果你正在使用WEB 框架,应该让SqlSession 跟随HTTP 请求的相似作用域。也就是说,在收到一个HTTP 请求过后,打开SqlSession,等返回一个回应以后,立马关掉这个SqlSession。关闭SqlSession 是非常重要的。你必须要确保SqlSession 在finally 方法体中正常关闭。可以使用下面的标准方式来关闭:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
使用这种模式来贯穿你的所有代码,以确保所有数据库资源都被完全关闭。[这是假定不是使用你自己的数据库连接,而是使用MyBatis 来管理你的数据库连接资源]。
4.       Mapper实例
Mapper是一种创建用于绑定映射语句的接口。Mapper接口的实例是用SqlSession来获得的,所以Mapper 实例作用域像SqlSession 一样,使用请求作用域。在方法被调用的时候调用Mapper实例,然后使用后,就会自动销毁掉,而不需要使用明确的注销。下面例子演示如何操作:
SqlSession session = sqlSessionFactory.openSession();
try {
PersonDao mapper = session.getMapper(PersonDao.class);
// do work
} finally {
session.close();
七.Mapper的XML配置文件
Mapper的XML配置文件包含一些设置和属性,用于增强Mybatis的动作。Configuration的各个节点配置如下:
mybatis_4
1.       属性(properties)
JAVA 属性文件就可以配置直观的、可代替的属性,或者是属性项的子项。比如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="test"/>
<property name="password" value="test/>
</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>
例子中的usrname 和password 将被属性文件中设置的值所替换, driver 和value 属性也将被config.properties 文件中值所替换,这为配置提供了多种选择。
属性值也可以设入到SqlSessionBuilder.build()方法中,例如:
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory =
sqlSessionFactoryBuilder.build(reader, environment, props);
如果一个属性项在多个地方出现,那MyBatis 将按以下顺序加载:
0 0
原创粉丝点击