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開發問題
1、dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
2、調用sqlsession方法時將statement的id硬編碼了
3、調用sqlsession方法時傳入的變量,由於sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利於程序員開發。
3.1 mapper代理方法(程序員只需要mapper接口(相當 於dao接口))
3.2 思路(mapper代理開發規範)
程序員還需要編寫mapper.xml映射文件
程序員編寫mapper接口需要遵循一些開發規範,mybatis可以自動生成mapper接口實現類代理對象。
開發規範:
1、在mapper.xml中namespace等於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代理對象內部調用selectOne或selectList
如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢數據庫。
如果mapper方法返回集合對象,代理對象內部通過selectList查詢數據庫。
3.7.2 mapper接口方法參數只能有一個是否影響系統 開發mapper接口方法參數只能有一個,系統是否不利於擴展維護。
系統框架中,dao層的代碼是被業務層公用的。
即使mapper接口只有一個參數,可以使用包裝類型的pojo滿足不同的業務方法的需求。
注意:持久層方法的參數可以包裝類型、map。。。,service方法中建議不要使用包裝類型(不利於業務層的可擴展)。