MyBatis學習(一)之MyBatis初識

    MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML 或註解用於配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。    

    1. SqlSessionFactory

	SqlSessionFactory對象是使用MyBatis的應用程序的核心,SqlSession都需要通過SqlSessionFactory實例來獲取。構造SqlSessionFactory有兩種方式, xml和java 兩種方式。
  •     xml構建方式,此方式爲最常用的方式。
            首先創建xml配置文件,一個簡單的配置(以MySQL爲例)
<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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章