Mybatis学习(五)-数据库连接池与事务控制

一、数据库连接池

Mybatis有自己的连接池技术。在 Mybatis 的主配置文件中,通过<dataSource type=”pooled”>来实现 Mybatis 中连接池的配置

1.1、连接池分类

image

0700e11809bef4d78c17383abf86b894fbc.jpg

mybatis支持三种内置的数据源类型:

  • Pooled:实现dataSource接口,并且使用了池的思想。
  • UNPooled:同样也是实现了dataSource接口,但是该类型并没有使用池的思想。
  • JDNI:采用服务器提供的JDNI技术实现的,并且在不同服务器之间获取的连接池是不一样的。

注意:如果项目不是web或者maven的war工程,则是无法使用的。比如Tomcat服务器采用的就是DBCP连接池

1.2、连接池数据源配置

<!-- 配置 mybatis 的环境 -->
<environments default="development">
    <!-- 配置 mysql 的环境 -->
    <environment id="development">
        <!-- 配置事务的类型 -->
        <transactionManager type="JDBC"/>
        <!-- 配置连接数据库的信息:用的是数据源(连接池) -->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

1.3、PooledDataSource源码分析流程图

参考文章:https://my.oschina.net/mengyuankan/blog/2664784

二、Mybatis事务管理

Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制

运行之前的代码:


package com.dianchou.test;

import com.dianchou.dao.UserMapper;
import com.dianchou.domain.QueryVo;
import com.dianchou.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;


public class MybatisTest {
    private InputStream in = null;
    private SqlSessionFactoryBuilder builder =null;
    private SqlSessionFactory factory = null;
    private SqlSession sqlSession = null;
    private UserMapper mapper = null;

    @Before
    public void init() throws IOException {
        //1.读取配置文件
        in = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建SqlSessionFactory构建者对象
        builder= new SqlSessionFactoryBuilder();
        //3.创建SqlSessionFactory
        factory = builder.build(in);
        //4.使用 SqlSessionFactory 生产 SqlSession 对象
        sqlSession = factory.openSession();
        //5.使用 SqlSession 创建 dao 接口的代理对象
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void testSaveUser2(){
        User user = new User();
        user.setUsername("AA");
        user.setAddress("shenzhen");
        user.setSex("");
        user.setBirthday(new Date());
        System.out.println("保存之前: " + user );
        mapper.saveUser(user);
        System.out.println("保存之后: " + user );

    }
    @After
    public void destroy() throws IOException {
        //事务提交
        sqlSession.commit();

        //7.释放资源
        sqlSession.close();
        in.close();
    }
}

image

设置自动提交事务(不常用):

image

image

posted @ 2020-07-13 15:11  运维人在路上  阅读(644)  评论(0编辑  收藏  举报