5?mybatis開發dao的方法
5.1?SqlSession使用范圍
5.1.1?SqlSessionFactoryBuilder
通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory
將SqlSessionFactoryBuilder當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder。
在需要創建SqlSessionFactory時候,只需要new一次SqlSessionFactoryBuilder即可。
??
5.1.2?SqlSessionFactory
通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦創建,使用一個實例)。
?
將來mybatis和spring整合后,使用單例模式管理sqlSessionFactory。
??
5.1.3?SqlSession
SqlSession是一個面向用戶(程序員)的接口。
SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)、。
?
SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操作數據庫的方法)還有數據域屬性。
【struts中的action,接收參數需要在struts的類中通過成員變量定義來接收參數,如果用戶提交了username屬性,username就是一個數據域它放在成員變量里面就不可能用單例了,因為有可能多線程并發請求的話,每個線程共用了它們成員變量的值,這樣導致我們訪問沖突,所以說是不安全的,struts是多例管理的】
?
SqlSession最佳應用場合在方法體內,定義成局部變量使用。
?
5.2?原始dao開發方法(程序員需要寫dao接口和dao實現類)
5.2.1?思路
程序員需要寫dao接口和dao實現類。
需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession
?
5.2.2?dao接口
??
5.2.3?dao接口實現類
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory;import cn.itcast.mybatis.po.User; /*** dao接口實現類* @author yejin*/ public class UserDaoImpl implements UserDao{//需要向dao實現類中注入SqlSessionFactory//這里通過構造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;} @Overridepublic User findUserById(int id) {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);//釋放資源 sqlSession.close();return user;}@Overridepublic void insertUser(User user) {SqlSession sqlSession = sqlSessionFactory.openSession();//執行插入操作sqlSession.insert("test.insertUser", user);//提交事務 sqlSession.commit();//釋放資源 sqlSession.close();}@Overridepublic void deleteUser(int id) {SqlSession sqlSession = sqlSessionFactory.openSession();//執行插入操作sqlSession.delete("test.deleteUser", id);//提交事務 sqlSession.commit();//釋放資源 sqlSession.close();} }
??
5.2.4?測試代碼:
?
5.2.5?總結原始 dao開發問題
1、dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
?
2、調用sqlsession方法時將statement的id硬編碼了
?
3、調用sqlsession方法時傳入的變量,由于sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利于程序員開發。