原始Dao开发方法以及存在的问题
存在的問題:
原始Dao開發中存在以下問題:
1.Dao方法體存在重復代碼:通過SqlSessionFactory創建SqlSession,調用SqlSession的數據庫操作方法
2.調用sqlSession的數據庫操作方法需要指定statement的id,這里存在硬編碼,不得于開發維護。
Dao開發方法:
使用MyBatis開發Dao,通常有兩個方法,即原始Dao開發方法和Mapper動態代理開發方法。這里先介紹原始DAO方法的使用!
SqlSession的使用范圍
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于創建SqlSessionFacoty,SqlSessionFacoty一旦創建完成就不需要SqlSessionFactoryBuilder了,因為SqlSession是通過SqlSessionFactory創建的。所以可以將SqlSessionFactoryBuilder當成一個工具類使用,最佳使用范圍是方法范圍即方法體內局部變量。
SqlSessionFactory
SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用范圍是整個應用運行期間,一旦創建后可以重復使用,通常以單例模式管理SqlSessionFactory。
SqlSession
SqlSession是一個面向用戶的接口,sqlSession中定義了數據庫操作方法。
每個線程都應該有它自己的SqlSession實例。SqlSession的實例不能共享使用,它也是線程不安全的。因此最佳的范圍是請求或方法范圍。絕對不能將SqlSession實例的引用放在一個類的靜態字段或實例字段中。
打開一個 SqlSession;使用完畢就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能執行關閉
如下:
SqlSession session = sqlSessionFactory.openSession(); try {// do work } finally {session.close(); }原始Dao開發方式
原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。
DAO接口:
public interface UserDao {/*** 根據id查詢用戶* * @param id* @return*/User queryUserById(int id);/*** 根據用戶名模糊查詢用戶* * @param username* @return*/List<User> queryUserByUsername(String username);/*** 保存用戶* * @param user*/void saveUser(User user); }DAO實現類:
public class UserDaoImpl implements UserDao {private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {super();this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User queryUserById(int id) {// 創建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 執行查詢邏輯User user = sqlSession.selectOne("queryUserById", id);// 釋放資源sqlSession.close();return user;}@Overridepublic List<User> queryUserByUsername(String username) {// 創建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 執行查詢邏輯List<User> list = sqlSession.selectList("queryUserByUsername", username);// 釋放資源sqlSession.close();return list;}@Overridepublic void saveUser(User user) {// 創建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 執行保存邏輯sqlSession.insert("saveUser", user);// 提交事務sqlSession.commit();// 釋放資源sqlSession.close();} }DAO測試:
public class UserDaoTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws Exception {// 創建SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 加載SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");// 創建SqlsessionFactorythis.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);}@Testpublic void testQueryUserById() {// 創建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 執行查詢User user = userDao.queryUserById(1);System.out.println(user);}@Testpublic void testQueryUserByUsername() {// 創建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 執行查詢List<User> list = userDao.queryUserByUsername("張");for (User user : list) {System.out.println(user);}}@Testpublic void testSaveUser() {// 創建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 創建保存對象User user = new User();user.setUsername("劉備");user.setBirthday(new Date());user.setSex("1");user.setAddress("蜀國");// 執行保存userDao.saveUser(user);System.out.println(user);} }總結
以上是生活随笔為你收集整理的原始Dao开发方法以及存在的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PageUtil
- 下一篇: 找出二维数组中每行的最小数但最小数的列不