mybatis--開發Dao--原始dao方式和Mapper代理方式
阿新 • • 發佈:2019-02-09
它的作用只是通過配置檔案建立SqlSessionFactory,所以只要創建出SqlSessionFactory,它就可以銷燬了。
所以說,它的生命週期是在方法之內。
SqlSessionFactory
它的作用是建立SqlSession的工廠,工廠一旦建立,除非應用停掉,不要銷燬。
所以說它的生命週期是在應用範圍內。這裡可以通過單例模式來管理它。
在mybatis整合spring之後,最好的處理方式是把SqlSessionFactory交由spring來做單例管理。
SqlSession
SqlSession是一個面向使用者(程式設計師)的介面,它的預設實現是DefaultSqlSession。
Mybatis是通過SqlSession來操作資料庫的。SqlSession中不僅包含要處理的SQL資訊,還包括一些資料資訊,
所以說它是執行緒不安全的,因此它最佳的生命週期範圍是在方法體之內。
UserDao:
package com.itheima.mybatis.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.itheima.mybatis.po.User; /** * * <p> * Title: UserDao */ public interface UserDao { // 1、 根據使用者ID查詢使用者資訊 public User findUserById(int id) throws Exception; // 2、 根據使用者名稱稱模糊查詢使用者列表 public List<User> findUsersByName(String name) throws Exception; // 3、 新增使用者 public void insertUser(User user) throws Exception; }
UserDaoImpl:
需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory建立SqlSession
要注意SqlSession和SqlSessionFactory的生命週期。
package com.itheima.mybatis.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.itheima.mybatis.po.User; /** * Title: UserDaoImpl */ public class UserDaoImpl implements UserDao { // 依賴注入 private SqlSessionFactory sqlSessionFactory; //使用構造方法來初始化SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { // 通過工廠在方法內部獲取sqlsession,這樣可以避免執行緒安全問題 SqlSession sqlSession = sqlSessionFactory.openSession(); // 呼叫SqlSession的增刪改查方法 // 第一個引數:表示statement的唯一標示 User user = sqlSession.selectOne("test.findUserById", id); System.out.println(user); // 關閉資源 sqlSession.close(); return user; } @Override public List<User> findUsersByName(String name) { // 建立SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 呼叫SqlSession的增刪改查方法 // 第一個引數:表示statement的唯一標示 List<User> list = sqlSession.selectOne("test.findUsersByName", name); System.out.println(list); // 關閉資源 sqlSession.close(); return list; } @Override public void insertUser(User user) { // 建立SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 呼叫SqlSession的增刪改查方法 // 第一個引數:表示statement的唯一標示 sqlSession.insert("test.insertUser", user); System.out.println(user.getId()); // 提交事務 sqlSession.commit(); // 關閉資源 sqlSession.close(); } }
UserDaoTest:
public class UserDaoTest {
//宣告全域性的SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
// 1、讀取配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2、根據配置檔案建立SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() {
//構造UserDao物件
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//呼叫UserDao物件的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
@Test
public void testFindUsersByName() {
//構造UserDao物件
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//呼叫UserDao物件的方法
List<User> list = userDao.findUsersByName("小明");
System.out.println(list);
}
@Test
public void testInsertUser() {
//構造UserDao物件
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//構造User物件
User user = new User();
user.setUsername("東哥3");
user.setAddress("清河寶盛西里3");
//呼叫UserDao物件的方法
userDao.insertUser(user);
System.out.println(user.getId());
}
}