代码直接放在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
此文章仅表明本身(本菜鸟)学习积累记录,或者学习笔记,若有侵权,请联系做者核实删除。人无完人,文章也同样,文笔稚嫩,在下不才,勿喷,若是有错误之处,还望指出,感激涕零~