mybatis學習記錄------4
一 mybatis開發dao的方法
1 SqlSessionFactoryBuilder:
通過SqlSessionFactoryBuilder建立會話工廠SqlSessionFactory,將SqlSessionFactoryBuilder 當成一個工具類使用即可 ,不需要使用單例管理SqlSessionFactoryBuilder。在需要建立SqlSessionFactory 時候,只需要 new 一次 SqlSessionFactoryBuilder即可。
2 SqlSessionFactory
通過SqlSessionFactory 建立 SqlSession ,使用單例模式管理 sqlSessionFactory (工廠一旦建立,使用一個例項)。 將來 mybatis 和 spring 整合後,使用單例模式管理 sqlSessionFactory 。
3 SqlSession
SqlSession 是一個面向使用者(程式設計師)的介面。 SqlSession 中提供了很多操作資料庫的方法:如: selectOne( 返回單個物件 ) 、 selectList (返回單個或多個物件)。 SqlSession 是執行緒不安全的,在 SqlSesion 實現類中除了有介面中的方法(操作資料庫的方法)還有資料域屬性。
SqlSession 最佳應用場合在方法體內,定義成區域性變數使用。
二 原始dao開發方法(程式設計師需要些dao介面和dao實現類)
1 在src資料夾下新建dao包,在包內新建介面userDao
package pers.czs.mybatis.dao; import pers.czs.mybatis.po.User; 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 在dao包內新建介面實現類userDaoImpl
package pers.czs.mybatis.dao; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import pers.czs.mybatis.po.User; public class userDaoImpl implements userDao{ //需要向dao實現類中注入SqlSessionFactory //這裡通過構造方法注入 private SqlSessionFactory sqlSessionFactory; 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",29); 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.insert("test.deleteUser", id); sqlSession.commit(); sqlSession.close(); } }
3 新建測試類userDaoImplTest
package pers.czs.mybatis.first; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import pers.czs.mybatis.dao.userDao; import pers.czs.mybatis.dao.userDaoImpl; public class userDaoImplTest { @Test public void testFindUserByid() throws Exception { //Mybatis配置檔案 String resource = "SqlMapConfig.xml"; //得到配置檔案流 InputStream inputStream = Resources.getResourceAsStream(resource); //建立會話工廠,傳入配置檔案資訊 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //建立userDao物件 userDao dao = new userDaoImpl(sqlSessionFactory); //呼叫userDao的方法 System.out.println(dao.findUserById(29)); } }
4 執行結果
4 原始dao開發問題
dao 介面實現類方法中存在大量模板方法,設想能否將這些程式碼提取出來,大大減輕程式設計師的工作量。
呼叫 sqlsession 方法時將 statement 的 id 硬編碼了
呼叫 sqlsession 方法時傳入的變數,由於 sqlsession 方法使用泛型,即使變數型別傳入錯誤,在編譯階段也不報錯,不利於程式設計師開發。