1. 程式人生 > >Mybatis 開發 dao 的方法

Mybatis 開發 dao 的方法

1、分析SqlSession使用範圍

  1.1、SqlSessionFactoryBuilder 

  通過 SqlSessionFactoryBuilder 建立會話工廠 SqlSessionFactory

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

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

 

  1.2、SqlSessionFactory

  通過會話工廠 SqlSessionFactory 建立 SqlSession,通過單例模式管理 SqlSessionFactory(工廠一旦建立,一直使用一個例項)。

  將來 mybatis 和 spring 整合後,通過單例模式管理 SqlSessionFactory。

 

  1.3、SqlSession

  SqlSession 是一個面向使用者(程式設計師)的介面。

  SqlSession 中提供了很多操作資料庫的方法:selectOne(返回單個物件)、selectList(返回單個或多個物件)。

  SqlSession 是執行緒不安全的,在 SqlSession 實現類中除了有介面中的方法(操作資料庫的方法),還有資料域的屬性。

  SqlSession 最佳應用場合在方法體內,定義成區域性變數。

 

 

2、原始 dao 的開發(程式設計師需要些 dao 介面和 dao 實現類)

  2.1、思路:

程式設計師需要些 dao 介面和 dao 實現類。

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

  

  2.2、dao介面:

public interface UserDao {

    // 根據id查詢使用者資訊
    public User findUserById(int
id) throws Exception; // 新增使用者資訊 public void insertUser(User user) throws Exception; // 刪除使用者資訊 public void deleteUser(int id) throws Exception; }

 

  2.3、dao層實現類:

public class UserDaoImpl implements UserDao {

    //向dao實現類中注入 SqlSessionFactory
    //通過構造方法注入
    private SqlSessionFactory sqlSessionFactory;
    
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById", id);
        // 釋放資源
        sqlSession.close();
        return user;
    }

    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 執行插入的操作
        sqlSession.insert("test.insertUser", user);
        
        // 提交事務
        sqlSession.commit();
        
        // 釋放資源
        sqlSession.close();
    }

    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 執行刪除的操作
        sqlSession.insert("test.deleteUser", id);
        
        // 提交事務
        sqlSession.commit();
        
        // 釋放資源
        sqlSession.close();
    }

}

 

  2.4、測試程式碼:

public class UserDaoImplTest {

    private SqlSessionFactory sqlSessionFactory;
    
    // 此方法是在執行 testFindUserById 之前執行
    @Before
    public void setUp() throws Exception{
        //建立sqlSessionFactory
        
        // mybatis配置檔案
        String resource = "config/SqlMapConfig.xml";
        // 得到配置檔案流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 建立會話工廠,傳入mybatis的配置檔案資訊
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    @Test
    public void testFindUserById() throws Exception {
        // 建立UserDao物件
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        
        // 呼叫UserDao的方法 
        User user = userDao.findUserById(1);
        
        System.out.println(user);
    }

}

 

  2.5、總結原始 dao 開發問題

  (1)dao介面實現類方法中存在大量模板方法,設想能否將這些程式碼提取出來,大大減輕程式設計師的工作量。

  (2)呼叫 sqlSession 方法時將 statement 的 id 硬編碼。

  (3)呼叫 sqlSession 方法時傳入的變數,由於sqlSession 方法使用泛型,即使變數型別傳入錯誤,在編譯階段也不報錯。 不利於程式設計師開發。

 

3、mapper代理方法(程式設計師只需要 mapper 介面——相當於 dao 介面)

  3.1、思路:

    程式設計師還需要編寫 mapper.xml 對映檔案(核心)

    程式設計師只需要編寫 mapper 介面需要遵循一些開發規範,mybatis就可以自動生成 mapper 介面實現類代理物件

   

  3.2、mapper 開發規範:

    (1)在 mapper.xml 中,namespace 等於mapper介面的地址

    

    (2)mapper.java 介面中的方法名和 mapper.xml 中 statement 的 id 一致

 

    (3)mapper.java 介面中的方法輸入引數型別 和 mapper.xml 中 statement 的 parameterType 指定的型別一致

      

    (4)mapper.java 介面中的方法返回值型別和 statement 的 resultType 的型別一致

 

      Mapper.xml 對比 Mapper.java

    

        

      

    總結——以上開發規範 主要是 對下邊的程式碼 進行統一生成:

 

sqlSession.selectOne("test.findUserById", id);

sqlSession.selectList("test.findUserById", name);

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

sqlSession.delete("test.deleteUser", id);

 

 

  3.3、mapper.java:

  

 

 

  3.4、mapper.xml:

  

 

  3.5、在 SqlMapConfig.xml 中載入 mapper.xml 檔案