myBatis的Dao開發(4)

前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!

      myBatis的Dao開發

使用Mybatis開發Dao,通常有兩個方法,即 原始Dao開發方法和Mapper接口開發方法。

     SqlSession的使用範圍

         SqlSession中封裝了對數據庫的操作,如:查詢、插入、更新、刪除等。

通過SqlSessionFactory創建SqlSession,而SqlSessionFactory是通過SqlSessionFactoryBuilder進行創建。

 SqlSessionFactoryBuilder

   通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory

   將SqlSessionFactoryBuilder當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder。

   在需要創建SqlSessionFactory時候,只需要new一次SqlSessionFactoryBuilder即可。

  SqlSessionFactory

SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用範圍是整個應用運行期間,一旦創建後可以重複使用,通常以單例模式管理SqlSessionFactory。

通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦創建,使用一個實例)。

將來mybatis和spring整合後,使用單例模式管理sqlSessionFactory。

  SqlSession

SqlSession是一個面向用戶(程序員)的接口,

sqlSession中定義了數據庫操作,默認使用DefaultSqlSession實現類。

SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)。

SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操作數據庫的方法)還有數據域屬性。

SqlSession最佳應用場合在方法體內,定義成局部變量使用。

執行過程如下:

1、  加載數據源等配置信息

Environment environment = configuration.getEnvironment();

2、  創建數據庫鏈接

3、  創建事務對象

4、  創建Executor,SqlSession所有操作都是通過Executor完成,mybatis源碼如下:

if (ExecutorType.BATCH == executorType) {

      executor = new BatchExecutor(this, transaction);

 } else if (ExecutorType.REUSE == executorType) {

      executor = new ReuseExecutor(this, transaction);

 } else {

      executor = new SimpleExecutor(this, transaction);

 }

if (cacheEnabled) {

      executor = newCachingExecutor(executor, autoCommit);

    }

5、  SqlSession的實現類即DefaultSqlSession,此對象中對操作數據庫實質上用的是Executor

結論:

         每個線程都應該有它自己的SqlSession實例。SqlSession的實例不能共享使用,它也是線程不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將SqlSession實例的引用放在一個類的靜態字段或實例字段中。

         打開一個SqlSession;使用完畢就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。如下:

         SqlSession session = sqlSessionFactory.openSession();

         try {

                  // do work

         } finally {

                session.close();

         }

    原始Dao開發方法

     原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。

    思路

                 需要向dao實現類中注入SqlSessionFactory在方法體內通過SqlSessionFactory創建SqlSession

  Dao接口

Public interface UserDao {

    public User getUserById(int id) throws Exception;

    public void insertUser(User user)throws Exception;

}

  Dao接口實現類

Public class UserDaoImplimplements UserDao {

    //注入SqlSessionFactory,這裏通過構造方法注入

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){

       this.setSqlSessionFactory(sqlSessionFactory);

    }

    private SqlSessionFactorysqlSessionFactory;

    @Override

    public UsergetUserById(int id)throws Exception {

       SqlSession session = sqlSessionFactory.openSession();

       User user = null;

       try {

           //通過sqlsession調用selectOne方法獲取一條結果集

           //參數1:指定定義的statementid,參數2:指定向statement中傳遞的參數

           user = session.selectOne("test.findUserById", 1);

           System.out.println(user);             

       } finally{

           session.close();

       }

       return user;

    }

    @Override

    Public void insertUser(User user)throws Exception {

       SqlSession  sqlSession= sqlSessionFactory.openSession();

       try {

           sqlSession.insert("insertUser", user);

           sqlSession.commit();

       } finally{

           session.close();

       }

    }

}

  總結原始Dao開發問題

1、dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。

2、調用sqlsession方法時將statement的id硬編碼了

3、調用sqlsession方法時傳入的變量,由於sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利於程序員開發。

  Mapper代理方法開發Dao

  思路(Mapper代理開發規範)

             程序員還需要編寫mapper.xml映射文件

             程序員編寫mapper接口需要遵循一些開發規範,mybatis可以自動生成mapper接口實現類代理對象。

開發規範:

1、mapper.xmlnamespace等於mapper接口地址


2、mapper.java接口中的方法名和mapper.xmlstatementid一致

3、mapper.java接口中的方法輸入參數類型和mapper.xmlstatementparameterType指定的類型一致。

4、mapper.java接口中的方法返回值類型和mapper.xmlstatementresultType指定的類型一致。


總結:

以上開發規範主要是對下邊的代碼進行統一生成:

User user = sqlSession.selectOne("test.findUserById",id);

sqlSession.insert("test.insertUser",user); 


Mapper.java(接口文件)--------------接口定義有如下特點:

1、Mapper接 口方法名和Mapper.xml中定義的statement的id相同

2、  Mapper接口方法的輸入參數類型和mapper.xml中定義的statement的parameterType的類型相同

3、  Mapper接口方法的輸出參數類型和mapper.xml中定義的statement的resultType的類型相同

Mapper.xml(映射文件)

定義mapper映射文件UserMapper.xml(內容同Users.xml),需要修改namespace的值爲 UserMapper接口路徑。將UserMapper.xml放在classpath 下mapper目錄 下

 在SqlMapConfig.xml中加載mapper.xml

修改SqlMapConfig.xml文件:

 <!--加載映射文件 -->

 <mappers>

   <mapperresource="mapper/UserMapper.xml"/>

  </mappers>





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章