1.使用工具類獲取sqlSession實例對象
在上一個demo中瘦棋,處理了多個namespace的問題蛇尚,那么我們可以看到代碼還是會有一定的冗余啼肩,比如下面這段代碼中我們每一個增刪改查操作都需要讀取一遍配置文件:
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
public void insertStu(Student student) {
try {
InputStream inputStream;
inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
sqlSession=sqlSessionFactory.openSession();
sqlSession.insert("mapper1.insertStudent",student);
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}
我們的思路應該是寫一個工具類來替我們獲取配置文件的信息亿笤,只要返回一個sqlSession實例就可以了净当。所以就有了MyBatisUtils.class,下面這樣的方式内斯,只要使用sqlSession=MyBatisUtils.getSqlSession();
就可以獲取到sqlsession的實例。
public class MyBatisUtils {
public SqlSession getSqlSession(){
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis.xml");
return new SqlSessionFactoryBuilder().build(is).openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
但是以上的方式并不是最好的蚯瞧,還是會浪費資源嘿期,如果sqlsession已經(jīng)存在了,這段代碼還是會去創(chuàng)建一個新的實例對象埋合。我們知道sqlsession沒有可修改的屬性备徐,是線程安全的,所以我們需要把它改寫成單例模式甚颂。
public class MyBatisUtils {
static private SqlSessionFactory sqlSessionFactory;
// 單例模式
static public SqlSession getSqlSession() {
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis.xml");
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
return sqlSessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
使用的時候只需要獲取即可
sqlSession=MyBatisUtils.getSqlSession();
2.DB配置改造成讀取配置文件
現(xiàn)在我們需要將DB使用配置文件讀取蜜猾,不是用xml配置,很多人會問振诬,為什么這樣做蹭睡,有人可能會回答是因為改動的時候容易改,但是xml改動的時候不是挺容易改么赶么?
其實肩豁,寫到屬性文件的原因與上面的一樣,就是為了更好改辫呻,要是上線了需要該數(shù)據(jù)庫我們只需要改動<properties resource="jdbc_mysql.properties">
這一個地方就可以了清钥,xml文件就變得更加簡潔清晰了。
原來在mybatis.xml文件里配置的是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置運行環(huán)境 -->
<!-- default 表示默認使用哪一個環(huán)境放闺,可以配置多個祟昭,比如開發(fā)時的測試環(huán)境,上線后的正式環(huán)境等 -->
<environments default="mysqlEM">
<environment id="mysqlEM">
<!--事務管理器-->
<transactionManager type="JDBC">
</transactionManager>
<!--數(shù)據(jù)源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注冊映射文件 -->
<mappers>
<mapper resource="mapper/mapper.xml"/>
<mapper resource="mapper/mapper1.xml"/>
</mappers>
</configuration>
現(xiàn)在我們定義一個jdbc-mysql.properties文件怖侦,將數(shù)據(jù)庫連接的屬性直接寫進屬性文件里(我們可以有好幾個不一樣的.properties文件,配置著不同的數(shù)據(jù)庫):
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.password=123456
將mybatis.xml改造成(注意下面需要配置屬性文件篡悟,然后才能在environment標簽里面使用谜叹,直接使用key就可以了,屬性文件配置是按照key-value的模式配置的):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置數(shù)據(jù)庫文件 -->
<properties resource="jdbc_mysql.properties">
</properties>
<!-- 配置運行環(huán)境 -->
<!-- default 表示默認使用哪一個環(huán)境搬葬,可以配置多個荷腊,比如開發(fā)時的測試環(huán)境,上線后的正式環(huán)境等 -->
<environments default="mysqlEM">
<environment id="mysqlEM">
<transactionManager type="JDBC">
</transactionManager>
<environment type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注冊映射文件 -->
<mappers>
<mapper resource="mapper/mapper.xml"/>
<mapper resource="mapper/mapper1.xml"/>
</mappers>
</configuration>
【作者簡介】:
秦懷急凰,公眾號【秦懷雜貨店】作者停局,技術之路不在一時,山高水長香府,縱使緩慢,馳而不息码倦。這個世界希望一切都很快企孩,更快,但是我希望自己能走好每一步袁稽,寫好每一篇文章勿璃,期待和你們一起交流。
此文章僅代表自己(本菜鳥)學習積累記錄推汽,或者學習筆記补疑,如有侵權(quán),請聯(lián)系作者核實刪除歹撒。人無完人莲组,文章也一樣,文筆稚嫩暖夭,在下不才锹杈,勿噴,如果有錯誤之處迈着,還望指出竭望,感激不盡~