前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis【3】-- 封装工具类读取数据库配置以及获取SqlSession对象

Mybatis【3】-- 封装工具类读取数据库配置以及获取SqlSession对象

作者头像
秦怀杂货店
发布2022-02-15 14:25:10
4510
发布2022-02-15 14:25:10
举报
文章被收录于专栏:技术杂货店技术杂货店

代码直接放在Github仓库【https://github.com/Damaer/Mybatis-Learning】,mybatis-02可直接运行,就不占篇幅了。

1.使用工具类获取sqlSession实例对象

在上一个demo中,处理了多个namespace的问题,那么我们可以看到代码还是会有一定的冗余,比如下面这段代码中我们每一个增删改查操作都需要读取一遍配置文件:

代码语言:javascript
复制
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的实例。

代码语言:javascript
复制
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没有可修改的属性,是线程安全的,所以我们需要把它改写成单例模式。

代码语言:javascript
复制
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;
    }
}

使用的时候只需要获取即可

代码语言:javascript
复制
sqlSession=MyBatisUtils.getSqlSession();
2.DB配置改造成读取配置文件

现在我们需要将DB使用配置文件读取,不是写在xml里面,很多人会问,为什么这样做,有人可能会回答是因为改动的时候容易改,但是xml改动的时候不是挺容易改么?

其实,写到属性文件的原因与上面的一样,就是为了更好改,要是上线了需要该数据库我们只需要改动<properties resource="jdbc_mysql.properties">这一个地方就可以了,xml文件就变得更加简洁清晰了。

原来在mybatis.xml文件里配置的是:

代码语言:javascript
复制
<?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文件,配置着不同的数据库):

代码语言:javascript
复制
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的模式配置的):

代码语言:javascript
复制
<?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>

【作者简介】: 秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秦怀杂货店 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.使用工具类获取sqlSession实例对象
  • 2.DB配置改造成读取配置文件
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档