MyBatis之核心对象及配置文件详解
一、MyBatis核心对象
1. SqlSessionFactory
SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。可以利用SqlSessionFactoryBuilder对象,通过XML配置文件,来构建SqlSessionFactory。
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。所以,在构建SqlSessionFactory实例时,建议使用单例模式。
示范代码:
package com.clzhang.mybatis.mapper; import java.io.*; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * SqlSessionFactory应该在你的应用执行期间都存在,所以定义一个通用类,所以获取SqlSessionFactory句柄的程序都从这儿获取。 * */ public class MyBatisSessionFactory { private static final String MYBATIS_CONFIG_FILENAME = "config/mybatis-config.xml"; private static SqlSessionFactory sqlSessionFactory = null; static { try { InputStream inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_FILENAME); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { throw new RuntimeException("Get resource error:"+MYBATIS_CONFIG_FILENAME, e); } } public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } }
2. SqlSession
SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession 对应数据库会话,它不能被共享,也不是线程安全的。
调用程序片段如下:
@Override public void updateProduct(ProductBean product) { SqlSession session = MyBatisSessionFactory.getSqlSessionFactory().openSession(); try { session.update("ProductMapper.updateProduct", product); session.commit(); } finally { session.close(); } }
SqlSession的常用方法
- T selectOne(String statement);
- List selectList(String statement);
- int insert(String statement);
- int update(String statement);
- int delete(String statement);
- void commit();
- void rollback();
- void close();
- T getMapper(Class type);
- Connection getConnection();
更多方法,参考:https://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1
二、MyBatis配置文件,mybatis-config.xml
configuration为最顶层节点,其余所有的属性都必须嵌套在configuration内
2.1 properties元素
properties是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下:
2.1.1 编写db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=root
2.1.2 在mybatis-config.xml中配置<properties… />属性
<properties resource="db.properties" />
2.1.3 在mybatis-config.xml中配置<dataSource.../>属性
<dataSource type="POOLED"> <!-- 数据库驱动 --> <property name="driver" value="${jdbc.driver}" /> <!-- 连接数据库的url --> <property name="url" value="${jdbc.url}" /> <!-- 连接数据库的用户名 --> <property name="username" value="${jdbc.username}" /> <!-- 连接数据库的密码 --> <property name="password" value="${jdbc.password}" /> </dataSource>
2.2 settings元素
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="autoMappingBehavior" value="PARTIAL" />
</settings>
2.3 typeAliases元素
typeAliases元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
2.3.1 使用元素配置别名的方法如下
<typeAliases> <typeAlias alias="user" type="com.clzhang.mybatis.entity.User"/> </typeAliases>
2.3.2 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:
<typeAliases> <package name="com.clzhang.mybatis.entity"/> </typeAliases>
注意:如果在程序中使用了注解,则别名为其注解的值。
2.4 typeHandler元素
typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。
2.5 objectFactory元素
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
2.6 plugins元素
MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。
2.7 environments元素
environments元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过environments元素配置多种数据源,即配置多种数据库。
2.7.1 使用environments元素进行环境配置的示例如下:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="username" value="mytest"/> <property name="password" value="test001"/> </dataSource> </environment> </environments>
2.7.2 事务管理器的配置(transactionManager)
在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:
- JDBC:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
- MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。
注意: 如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。
2.7.3 数据源的配置(dataSource )
- UNPOOLED 配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
- POOLED 此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速的响应请求,是当前流行的处理方式。
- JNDI 可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
2.8 databaseIdProviderf元素
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。
2.9 mappers元素
mappers元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下:
2.9.1 使用类路径引入
<mappers> <mapper resource="com/clzhang/mybatis/mapper/UserMapper.xml" /> </mappers>
2.9.2 使用本地文件路径引入
<mappers> <mapper url="file:///D:/com/clzhang/mybatis/mapper/UserMapper.xml"/> </mappers>
2.9.3 使用接口类引入
<mappers> <mapper class="com.clzhang.mybatis.mapper.UserMapper"/> </mappers>
2.9.4 使用包名引入
<mappers> <package name="com.clzhang.mybatis.mapper"/> </mappers>
本文参考:
https://www.cnblogs.com/wxdestiny/p/9743686.html
https://blog.csdn.net/lcachang/article/details/86691237