1. 程式人生 > >mybatis--開發Dao--原始dao方式和Mapper代理方式

mybatis--開發Dao--原始dao方式和Mapper代理方式

它的作用只是通過配置檔案建立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());
	}

}