代碼直接放在Github倉庫【 https://github.com/Damaer/Myb... 】,可直接運行,就不佔篇幅了。
在上一個demo中,處理了多個namespace的問題,那麼咱們能夠看到代碼仍是會有必定的冗餘,好比下面這段代碼中咱們每個增刪改查操做都須要讀取一遍配置文件:java
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的實例。mysql
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已經存在了,這段代碼仍是會去建立一個新的實例對象。咱們知道sqlsession沒有可修改的屬性,是線程安全的,因此咱們須要把它改寫成單例模式。git
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; } }
使用的時候只須要獲取便可github
sqlSession=MyBatisUtils.getSqlSession();
如今咱們須要將DB使用配置文件讀取,不是用xml配置,不少人會問,爲何這樣作,有人可能會回答是由於改動的時候容易改,可是xml改動的時候不是挺容易改麼?sql
其實,寫到屬性文件的緣由與上面的同樣,就是爲了更好改,要是上線了須要該數據庫咱們只須要改動<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> <!-- 配置運行環境 --> <!-- default 表示默認使用哪個環境,能夠配置多個,好比開發時的測試環境,上線後的正式環境等 --> <environments default="mysqlEM"> <environment id="mysqlEM"> <!--事務管理器--> <transactionManager type="JDBC"> </transactionManager> <!--數據源--> <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>
如今咱們定義一個jdbc-mysql.properties文件,將數據庫鏈接的屬性直接寫進屬性文件裏(咱們能夠有好幾個不同的.properties文件,配置着不一樣的數據庫):session
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的模式配置的):mybatis
<?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> <!-- 配置數據庫文件 --> <properties resource="jdbc_mysql.properties"> </properties> <!-- 配置運行環境 --> <!-- default 表示默認使用哪個環境,能夠配置多個,好比開發時的測試環境,上線後的正式環境等 --> <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>
【做者簡介】:
秦懷,公衆號【秦懷雜貨店】做者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界但願一切都很快,更快,可是我但願本身能走好每一步,寫好每一篇文章,期待和大家一塊兒交流。app
此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者覈實刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~