1. SqlSessionFactory
SqlSessionFactory對象是使用MyBatis的應用程序的核心,SqlSession都需要通過SqlSessionFactory實例來獲取。構造SqlSessionFactory有兩種方式, xml和java 兩種方式。
- xml構建方式,此方式爲最常用的方式。
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="xxxxxx"></property>
</dataSource>
</environment>
</environments>
</configuration>
這裏我們創建了SqlSessionFactory可以依賴的環境(包括數據源和事務管理),可以創建多個environment,但需要指定其中的一個爲默認的環境。
簡要說明下transactionManager和dataSource的type代表的意思,
transactionManager的type可選值爲:
JDBC #代表 org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory
MANAGED #代表 org.apache.ibatis.transaction.managed.ManagedTransactionFactory
dataSource的type可選值爲:
JNDI #代表org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
POOLED #代表org.apache.ibatis.datasource.pooled.PooledDataSourceFactory
UNPOOLED #代表 org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory
配置文件裏面還可以配置其他很多地方,在以後的章節我們再做描述。
根據xml配置構建SqlSessionFactory, 我們這裏使用SqlSessionFactoryBuilder來構建SqlSessionFactory。
String configurationResource = "mybatis-configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(configurationResource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
inputStream.close();
- Java 方式創建SqlSessionFactory(其實就是將xml中配置的信息轉換到Java代碼裏)
DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test","root","123456");
Environment environment = new Environment("develop",new JdbcTransactionFactory(),dataSource);
Configuration configuration = new Configuration(environment);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
2. SqlSession
SqlSession 提供了以數據庫爲背景的所有SQL操作的方法。SqlSession可以從SqlSessionFactory中獲取,SqlSessionFactory提供了多種方式來獲取一個SqlSession。
SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);
這裏我們直接使用默認的SqlSession獲取方法:
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
List<Map> list = sqlSession.selectList("org.antstudio.mybatis.test.ConfigurationTest.selectTest");
}finally{
sqlSession.close();
}
這裏我們使用sqlSession查詢出了一個列表,注意,sqlSession爲非線程安全的對象,其使用範圍最好爲一個請求或者一個方法範圍內。
3. MappedStatement
MyBatis將sql語句、參數、結果處理等一系列相關的元素封裝成一個一個的已映射的sql(MappedStatement), 在上面我們通過sqlSession來查詢了一個列表,要使這段代碼正常運行,還需要配置或者定義相關的MappedStatement。 MappedStatement可以通過xml配置或者Java方式顯示添加。
- xml的配置MappedStatement.
新建一個ConfigurationTestMapper.xml.xml
<?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="org.antstudio.mybatis.test.ConfigurationTest">
<select id="selectTest" resultType="HashMap">
select * from tab_user
</select>
</mapper>
每一個MappedStatement的唯一標示爲namespace+id,如果註冊重複的MappedStatement則會拋出異常。
然後在mybatis-configuration.xml配置文件中添加如下語句:
<mappers>
<mapper resource="ConfigurationTestMapper.xml"></mapper>
</mappers>
將配置的映射添加進來。
- java添加MappedStatement
如同SqlSessionFactory的java構造一樣,需要提供xml構造時的所有的信息。
SqlSource sqlSource1 = new StaticSqlSource(configuration,"select * from tab_user");
final ResultMap resultMap = new ResultMap.Builder(configuration,"org.antstudio.mybatis.test.Configuration.selectTest",HashMap.class,new ArrayList<ResultMapping>()).build();
MappedStatement mappedStatement = new MappedStatement.Builder(configuration,"org.antstudio.mybatis.test.Configuration.selectTest",sqlSource, SqlCommandType.SELECT)
.resultMaps(new ArrayList<ResultMap>(){{add(resultMap);}}).build(); //定義一個mappedStatement,每行用HashMap包裝--》等同於xml中的resultType="HashMap"
configurationWithoutXml.addMappedStatement(mappedStatement);//添加到configuration
這樣就具備了MyBatis可以簡單運行的所有必備元素,這裏主要簡單介紹了MyBatis的基本的元素和配置。具體源碼見:https://gist.github.com/gavincook/4471c06138976bf1284c