代码间接放在 Github 仓库【https://github.com/Damaer/Myb…】,可间接运行,就不占篇幅了。
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 曾经存在了,这段代码还是会去创立一个新的实例对象。咱们晓得 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 配置革新成读取配置文件
当初咱们须要将 DB 应用配置文件读取,不是用 xml 配置,很多人会问,为什么这样做,有人可能会答复是因为改变的时候容易改,然而 xml 改变的时候不是挺容易改么?
其实,写到属性文件的起因与下面的一样,就是为了更好改,要是上线了须要该数据库咱们只须要改变 <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 文件, 配置着不同的数据库):
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>
<!-- 配置数据库文件 -->
<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>
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使迟缓,驰而不息。这个世界心愿所有都很快,更快,然而我心愿本人能走好每一步,写好每一篇文章,期待和你们一起交换。
此文章仅代表本人(本菜鸟)学习积攒记录,或者学习笔记,如有侵权,请分割作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有谬误之处,还望指出,感激不尽~