mybatis開發dao的方法

mybatis開發dao的方法


1-SqlSession的使用範圍

     1-1:SqlSessionFactoryBuilder(只當成一個工具類即可,不需要使用單例模式管理)

        通過SqlSessionFactoryBuilder創建SqlSessionFactory,

     1-2:SqlSessionFactory

          通過SqlSessionFactory創建SqlSession,使用單例模式管理SqlSessionFactory(工廠)

          將來mybatis和spring整合後喜用單例模式管理SqlSessionFactory

     1-3:SqlSession是一個面向用戶(程序員)的接口。

          

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

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

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

1.1 原始dao開發方法(程序員需要寫dao接口和dao實現類)

1.1.1 思路

程序員需要寫dao接口和dao實現類。

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

2.1.2 dao接口


2.1.3 dao接口實現類

public class UserDaoImplimplements UserDao {

 

// 需要向dao實現類中注入SqlSessionFactory

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

private SqlSessionFactorysqlSessionFactory;

 

public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

this.sqlSessionFactory = sqlSessionFactory;

}

 

@Override

public User findUserById(int id)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

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

 

// 釋放資源

sqlSession.close();

 

return user;

 

}

 

@Override

public void insertUser(User user)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

 

//執行插入操作

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

 

// 提交事務

sqlSession.commit();

 

// 釋放資源

sqlSession.close();

 

}

 

@Override

public void deleteUser(int id)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

 

//執行插入操作

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

 

// 提交事務

sqlSession.commit();

 

// 釋放資源

sqlSession.close();

 

}

 

}

2.1.4 測試代碼:


2.1.5 總結原始 dao開發問題

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

 

2、調用sqlsession方法時將statementid硬編碼了

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


 3.1 mapper代理方法(程序員只需要mapper接口(相當 於dao接口))

 3.2 思路(mapper代理開發規範)

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

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

開發規範:

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



總結:

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

 

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

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

。。。。

3.3 mapper.java



3.4 mapper.xml


3.5 SqlMapConfig.xml中加載mapper.xml


3.6 測試


3.7 一些問題總結

3.7.1代理對象內部調用selectOneselectList

如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢數據庫。

如果mapper方法返回集合對象,代理對象內部通過selectList查詢數據庫。

3.7.2 mapper接口方法參數只能有一個是否影響系統 開發mapper接口方法參數只能有一個,系統是否不利於擴展維護。

系統框架中,dao層的代碼是被業務層公用的。

即使mapper接口只有一個參數,可以使用包裝類型的pojo滿足不同的業務方法的需求。

 

注意:持久層方法的參數可以包裝類型、map。。。,service方法中建議不要使用包裝類型(不利於業務層的可擴展)。



發佈了126 篇原創文章 · 獲贊 145 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章