Mybatis 開發 dao 的方法
1、分析SqlSession使用範圍
1.1、SqlSessionFactoryBuilder
通過 SqlSessionFactoryBuilder 建立會話工廠 SqlSessionFactory
將 SqlSessionFactoryBuilder 當成一個工具類使用即可,不需要使用單例管理 SqlSessionFactoryBuilder。
在需要建立 SqlSessionFactory 時候,只需要 new 一次 SqlSessionFactoryBuilder 即可。
1.2、SqlSessionFactory
通過會話工廠 SqlSessionFactory 建立 SqlSession,通過單例模式管理 SqlSessionFactory(工廠一旦建立,一直使用一個例項)。
將來 mybatis 和 spring 整合後,通過單例模式管理 SqlSessionFactory。
1.3、SqlSession
SqlSession 是一個面向使用者(程式設計師)的介面。
SqlSession 中提供了很多操作資料庫的方法:selectOne(返回單個物件)、selectList(返回單個或多個物件)。
SqlSession 是執行緒不安全的,在 SqlSession 實現類中除了有介面中的方法(操作資料庫的方法),還有資料域的屬性。
SqlSession 最佳應用場合在方法體內,定義成區域性變數。
2、原始 dao 的開發(程式設計師需要些 dao 介面和 dao 實現類)
2.1、思路:
程式設計師需要些 dao 介面和 dao 實現類。
需要向 dao 實現類 中注入 SqlSessionFactory,在方法體內通過 SqlSessionFactory 建立 SqlSession
2.2、dao介面:
public interface UserDao {
// 根據id查詢使用者資訊
public User findUserById(int id) throws Exception;
// 新增使用者資訊
public void insertUser(User user) throws Exception;
// 刪除使用者資訊
public void deleteUser(int id) throws Exception;
}
2.3、dao層實現類:
public class UserDaoImpl implements UserDao {
//向dao實現類中注入 SqlSessionFactory
//通過構造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
// 釋放資源
sqlSession.close();
return user;
}
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 執行插入的操作
sqlSession.insert("test.insertUser", user);
// 提交事務
sqlSession.commit();
// 釋放資源
sqlSession.close();
}
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 執行刪除的操作
sqlSession.insert("test.deleteUser", id);
// 提交事務
sqlSession.commit();
// 釋放資源
sqlSession.close();
}
}
2.4、測試程式碼:
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
// 此方法是在執行 testFindUserById 之前執行
@Before
public void setUp() throws Exception{
//建立sqlSessionFactory
// mybatis配置檔案
String resource = "config/SqlMapConfig.xml";
// 得到配置檔案流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 建立會話工廠,傳入mybatis的配置檔案資訊
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
// 建立UserDao物件
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
// 呼叫UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
}
2.5、總結原始 dao 開發問題
(1)dao介面實現類方法中存在大量模板方法,設想能否將這些程式碼提取出來,大大減輕程式設計師的工作量。
(2)呼叫 sqlSession 方法時將 statement 的 id 硬編碼。
(3)呼叫 sqlSession 方法時傳入的變數,由於sqlSession 方法使用泛型,即使變數型別傳入錯誤,在編譯階段也不報錯。 不利於程式設計師開發。
3、mapper代理方法(程式設計師只需要 mapper 介面——相當於 dao 介面)
3.1、思路:
程式設計師還需要編寫 mapper.xml 對映檔案(核心)
程式設計師只需要編寫 mapper 介面需要遵循一些開發規範,mybatis就可以自動生成 mapper 介面實現類代理物件
3.2、mapper 開發規範:
(1)在 mapper.xml 中,namespace 等於mapper介面的地址
(2)mapper.java 介面中的方法名和 mapper.xml 中 statement 的 id 一致
(3)mapper.java 介面中的方法輸入引數型別 和 mapper.xml 中 statement 的 parameterType 指定的型別一致
(4)mapper.java 介面中的方法返回值型別和 statement 的 resultType 的型別一致
Mapper.xml 對比 Mapper.java
總結——以上開發規範 主要是 對下邊的程式碼 進行統一生成:
sqlSession.selectOne("test.findUserById", id);
sqlSession.selectList("test.findUserById", name);
sqlSession.insert("test.insertUser", user);
sqlSession.delete("test.deleteUser", id);
3.3、mapper.java:
3.4、mapper.xml:
3.5、在 SqlMapConfig.xml 中載入 mapper.xml 檔案