SqlSession 使用范圍
- SqlSessionFactoryBuilder
通過SqlSessionFactoryBuilder 創(chuàng)建會話工廠SqlSessionFactory
將SqlSessionFactoryBuilder當(dāng)成一個工具類使用即可,不需要使用單例管理。
在需要創(chuàng)建SqlSessionFactory時候,只需要new一次SqlSessionFactoryBuilder即可。
- SqlSessionFactory
通過SqlSessionFactory 創(chuàng)建 SqlSession, 通過單例模式管理SqlSessionFactory(工廠一旦創(chuàng)建,一直使用一個實(shí)例,不銷毀)
將來和 spring 整合之后,使用單例模式管理SqlSessionFactory
- SqlSession
SqlSession是一個面向用戶的接口。提供了很多操作數(shù)據(jù)庫的方法,如:selectOne、selectList。
SQLSession是線程不安全的。在SQLSession實(shí)現(xiàn)類中除了有接口中的方法(操作數(shù)據(jù)庫的方法)還有數(shù)據(jù)域?qū)傩浴?/p>
SQLSession最佳應(yīng)用場合在方法體內(nèi),定義成局部變量。
原始dao開發(fā)方法(需要編寫dao接口和dao實(shí)現(xiàn)類)
- 思路:
編寫dao接口和dao實(shí)現(xiàn)類。
需要向dao實(shí)現(xiàn)類中注入SqlSessionFactory,在方法體內(nèi)通過SqlSessionFactory創(chuàng)建SQLSession
- dao接口

- dao 接口實(shí)現(xiàn)類
public class UserDaoiImpl implements UserDao{
//向dao實(shí)現(xiàn)類注入SqlSessionFactory
//這里通過構(gòu)造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoiImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
User user = sqlSession.selectOne("user.findUserById", id);
sqlSession.close();
return user;
}
@Override
public void addUser(User user) throws Exception {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
sqlSession.insert("user.insertUser", user);
sqlSession.commit();
sqlSession.close();
}
@Override
public void deleteUserById(int id) throws Exception {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
sqlSession.delete("user.deleteUserById", id);
sqlSession.commit();
sqlSession.close();
}
@Override
public void updateUser(User user) throws Exception {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
sqlSession.update("user.updateUser", user);
sqlSession.commit();
sqlSession.close();
}
}
- 測試代碼
public class UserDaoiImplTest {
private SqlSessionFactory buildFactory;
@Before
public void setUp() throws Exception {
//創(chuàng)建工廠
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
buildFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
}
@Test
public void testFindUserById() throws Exception {
UserDao userDao = new UserDaoiImpl(buildFactory);
User user = userDao.findUserById(2);
System.out.println(user);
}
@Test
public void testAddUser() throws Exception {
UserDao userDao = new UserDaoiImpl(buildFactory);
User user = new User();
user.setUsername("李小飛");
user.setAddress("山東泰安");
user.setBirthday(new Date());
user.setSex("女");
userDao.addUser(user);
}
}
mapper代理方法(只需要編寫mapper接口,相當(dāng)于dao接口)
- 思路 :
需要編寫mapper.xml映射文件
需要編寫mapper接口,遵循一些開發(fā)規(guī)范,mybatis可以自動生成mapper接口實(shí)現(xiàn)類代理對象。
開發(fā)規(guī)范:
1、在mapper.xml 中 namespace 等于 mapper接口的地址

2、mapper.java 接口中的方法名和mapper.xml 中statement的id一致
3、mapper.java 接口中方法的輸入?yún)?shù)類型和mapper.xml 中statement的 parameterType指定的類型一致
4、mapper.java 接口中方法的返回值類型和mapper.xml 中statement的resultType指定的類型一致
舉例:


-
總結(jié):
以上開發(fā)規(guī)范主要是對下邊代碼進(jìn)行統(tǒng)一生成:
User user = sqlSession.selectOne("user.findUserById", id); sqlSession.insert("user.insertUser", user); ... mapper.java
public interface UserMapper {
//根據(jù)id查詢用戶
public User findUserById(int id) throws Exception;
//新增一個用戶
public void insertUser(User user) throws Exception;
//刪除用戶信息
public void deleteUserById(Integer id) throws Exception;
//修改某個用戶信息
public void updateUser(User user) throws Exception;
}
- mapper.xml

- 在SqlMapConfig.xml中加載mapper.xml文件

- 測試
