前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!
myBatis的Dao開發
使用Mybatis開發Dao,通常有兩個方法,即 原始Dao開發方法和Mapper接口開發方法。
SqlSession的使用範圍
SqlSession中封裝了對數據庫的操作,如:查詢、插入、更新、刪除等。
通過SqlSessionFactory創建SqlSession,而SqlSessionFactory是通過SqlSessionFactoryBuilder進行創建。
SqlSessionFactoryBuilder
通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory
將SqlSessionFactoryBuilder當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder。
在需要創建SqlSessionFactory時候,只需要new一次SqlSessionFactoryBuilder即可。
SqlSessionFactory
SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用範圍是整個應用運行期間,一旦創建後可以重複使用,通常以單例模式管理SqlSessionFactory。
通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦創建,使用一個實例)。
將來mybatis和spring整合後,使用單例模式管理sqlSessionFactory。
SqlSession
SqlSession是一個面向用戶(程序員)的接口,
sqlSession中定義了數據庫操作,默認使用DefaultSqlSession實現類。
SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)。
SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操作數據庫的方法)還有數據域屬性。
SqlSession最佳應用場合在方法體內,定義成局部變量使用。
執行過程如下:
1、 加載數據源等配置信息
Environment environment = configuration.getEnvironment();
2、 創建數據庫鏈接
3、 創建事務對象
4、 創建Executor,SqlSession所有操作都是通過Executor完成,mybatis源碼如下:
if (ExecutorType.BATCH == executorType) {
executor = new BatchExecutor(this, transaction);
} else if (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = newCachingExecutor(executor, autoCommit);
}
5、 SqlSession的實現類即DefaultSqlSession,此對象中對操作數據庫實質上用的是Executor
結論:
每個線程都應該有它自己的SqlSession實例。SqlSession的實例不能共享使用,它也是線程不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將SqlSession實例的引用放在一個類的靜態字段或實例字段中。
打開一個SqlSession;使用完畢就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。如下:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
原始Dao開發方法
原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。
思路
需要向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession。
Dao接口
Public interface UserDao {
public User getUserById(int id) throws Exception;
public void insertUser(User user)throws Exception;
}
Dao接口實現類
Public class UserDaoImplimplements UserDao {
//注入SqlSessionFactory,這裏通過構造方法注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.setSqlSessionFactory(sqlSessionFactory);
}
private SqlSessionFactorysqlSessionFactory;
@Override
public UsergetUserById(int id)throws Exception {
SqlSession session = sqlSessionFactory.openSession();
User user = null;
try {
//通過sqlsession調用selectOne方法獲取一條結果集
//參數1:指定定義的statement的id,參數2:指定向statement中傳遞的參數
user = session.selectOne("test.findUserById", 1);
System.out.println(user);
} finally{
session.close();
}
return user;
}
@Override
Public void insertUser(User user)throws Exception {
SqlSession sqlSession= sqlSessionFactory.openSession();
try {
sqlSession.insert("insertUser", user);
sqlSession.commit();
} finally{
session.close();
}
}
}
總結原始Dao開發問題
1、dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
2、調用sqlsession方法時將statement的id硬編碼了
3、調用sqlsession方法時傳入的變量,由於sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利於程序員開發。
Mapper代理方法開發Dao
思路(Mapper代理開發規範)
程序員還需要編寫mapper.xml映射文件
程序員編寫mapper接口需要遵循一些開發規範,mybatis可以自動生成mapper接口實現類代理對象。
開發規範:
1、在mapper.xml中namespace等於mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。
4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。
總結:
以上開發規範主要是對下邊的代碼進行統一生成:
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.insert("test.insertUser",user);
Mapper.java(接口文件)--------------接口定義有如下特點:
1、Mapper接 口方法名和Mapper.xml中定義的statement的id相同
2、 Mapper接口方法的輸入參數類型和mapper.xml中定義的statement的parameterType的類型相同
3、 Mapper接口方法的輸出參數類型和mapper.xml中定義的statement的resultType的類型相同
Mapper.xml(映射文件)
定義mapper映射文件UserMapper.xml(內容同Users.xml),需要修改namespace的值爲 UserMapper接口路徑。將UserMapper.xml放在classpath 下mapper目錄 下在SqlMapConfig.xml中加載mapper.xml
修改SqlMapConfig.xml文件:
<!--加載映射文件 -->
<mappers>
<mapperresource="mapper/UserMapper.xml"/>
</mappers>