精华内容
下载资源
问答
  • Mybatis SqlSession

    2016-03-22 17:41:15
    简介SqlSessionMybatis中对数据库进行操作的基础,一切对于数据库的操作的承载着均是SqlSession1.SqlSession的由来SqlSession是由 SqlSessionFactor通过 sqlSessionFactory.openSession()方法获得,而...

    简介

    SqlSession是Mybatis中对数据库进行操作的基础,一切对于数据库的操作的承载着均是SqlSession

    1.SqlSession的由来

    SqlSession是由 SqlSessionFactor通过 sqlSessionFactory.openSession()方法获得,而SqlSessionFactory创建是通过SqlSessionFactoryBuilder().build(“配置文档”)进行配置创建的
    我们先来看看在配置文档中关于SqlSessionFactory相关信息的创建

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
            PUBLIC ".//mybatis.orgDTD Config.3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--和spring整合后environment配置将废除-->
        <environments default="development">
            <environment id="development">
                <!--使用JDBC事务管理-->
                <transactionManager type="JDBC"></transactionManager>
                <!--数据库连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"></property>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/imooc"></property>
                    <property name="username" value="root"></property>
                    <property name="password" value="root"></property>
    
                </dataSource>
            </environment>
        </environments>
    
    
        <!--加载映射文件-->
        <mappers>
           <mapper resource="Student.xml"></mapper>
        </mappers>
    
    
    
    
    </configuration>

    我们可以看到在这个配置文件中分为两个部分,第一部分为JDBC信息,其中包括连接池信息,数据库连接信息;第二部分是映射文件的加载。
    SqlSessionFactory所需要加载的就是第一部分即JDBC信息(因为mybatis是对ibatis的优化封装而ibatis是对JDBC模块的优化封装)通过框架内部反射将相关信息进行绑定,之后我们便能在我们的程序中使用如下代码来获得SqlSession

    //得到配置文件
    InputStream inputStream= Resources.getResourceAsStream(resource);
    //穿件会话工厂
    SqlSessionFactory sqlSessionFactory = 
    new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂创建Sqlsession
                SqlSession sqlSession = sqlSessionFactory.openSession();

    2.未完待续

    展开全文
  • 关于MyBatis sqlSession的一点整理

    千次阅读 2016-03-07 18:07:33
    原文地址:关于MyBatis sqlSession的一点整理  工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里...

     原文地址:关于MyBatis sqlSession的一点整理

        工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里简单的总结和整理一下。

     

        首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类:

    • SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。

    • SqlSessionFactory:创建SqlSession实例的工厂。

    • SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。

    • SqlSessionTemplate:MyBatis提供的持久层访问模板化的工具,线程安全可通过构造参数或依赖注入SqlSessionFactory实例。

     

        Hibernate是与MyBatis类似的orm框架,这里与Hibernate进行一下对比,Hibernate中对于connection的管理,是通过以下几个重要的类:

    • SessionFactory:创建Session实例的工厂,类似于MyBatis中的SqlSessionFactory。

    • Session:用来执行持久化操作的对象,类似于jdbc中的Connection。

    • HibernateTemplate:Hibernate提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SessionFactory实例。

     

        在日常的开发中,我们经常需要这样对MyBatis和Spring进行集成,把sqlSessionFactory交给Spring管理,通常情况下,我们这样配置:

    ?
    1
    2
    3
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
    </bean>

        通过上面的配置,Spring将自动创建一个SqlSessionFactory对象,其中使用到了org.mybatis.spring.SqlSessionFactoryBean,其 是MyBatis为Spring提供的用于创建SqlSessionFactory的类,将在Spring应用程序的上下文建议一下可共享的 MyBatis SqlSessionFactory实例,我们可以通过依赖注入将SqlSessionFactory传递给MyBatis的一些接口。

     

        如果通过Spring进行事务的管理,我们需要增加Spring注解的事务管理机制,如下配置:

    ?
    1
    2
    3
    4
    5
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
      
    <tx:annotation-driven/>

        

        这样,我们就可以使用Spring @Transactional注解,进行事务的控制,表明所注释的方法应该在一个事务中运行。 Spring将在事务成功完成后提交事务,在事务发生错误时进行异常回滚,而且,Spring会将产生的MyBatis异常转换成适当的 DataAccessExceptions,从而提供具体的异常信息。

     

        下面,我们通过分析SqlSessionUtils中getSession的源码,来详细的了解一下sqlSession的产生过程,源码如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {
      
      notNull(sessionFactory, "No SqlSessionFactory specified");
      notNull(executorType, "No ExecutorType specified");
      
      SqlSessionHolder holder = (SqlSessionHolder) getResource(sessionFactory);
      
      if (holder != null && holder.isSynchronizedWithTransaction()) {
        if (holder.getExecutorType() != executorType) {
          throw new TransientDataAccessResourceException("Cannot change the ExecutorType when there is an existing transaction");
        }
      
        holder.requested();
      
        if (logger.isDebugEnabled()) {
          logger.debug("Fetched SqlSession [" + holder.getSqlSession() + "] from current transaction");
        }
      
        return holder.getSqlSession();
      }
      
      if (logger.isDebugEnabled()) {
        logger.debug("Creating a new SqlSession");
      }
      
      SqlSession session = sessionFactory.openSession(executorType);
      
      // Register session holder if synchronization is active (i.e. a Spring TX is active)
      //
      // Note: The DataSource used by the Environment should be synchronized with the
      // transaction either through DataSourceTxMgr or another tx synchronization.
      // Further assume that if an exception is thrown, whatever started the transaction will
      // handle closing / rolling back the Connection associated with the SqlSession.
      if (isSynchronizationActive()) {
        Environment environment = sessionFactory.getConfiguration().getEnvironment();
      
        if (environment.getTransactionFactory() instanceof SpringManagedTransactionFactory) {
          if (logger.isDebugEnabled()) {
            logger.debug("Registering transaction synchronization for SqlSession [" + session + "]");
          }
      
          holder = new SqlSessionHolder(session, executorType, exceptionTranslator);
          bindResource(sessionFactory, holder);
          registerSynchronization(new SqlSessionSynchronization(holder, sessionFactory));
          holder.setSynchronizedWithTransaction(true);
          holder.requested();
        else {
          if (getResource(environment.getDataSource()) == null) {
            if (logger.isDebugEnabled()) {
              logger.debug("SqlSession [" + session + "] was not registered for synchronization because DataSource is not transactional");
            }
          else {
            throw new TransientDataAccessResourceException(
                "SqlSessionFactory must be using a SpringManagedTransactionFactory in order to use Spring transaction synchronization");
          }
        }
      else {
        if (logger.isDebugEnabled()) {
          logger.debug("SqlSession [" + session + "] was not registered for synchronization because synchronization is not active");
        }
      }
      
      return session;
    }

        上面的getSession方法,会从Spring的事务管理器中获取一个SqlSession或创建一个新的SqlSession,将试图从当前事务中得到一个SqlSession,然后,如果配置有事务管理器的工厂并且Spring 的事务管理器是活跃的,它将会锁定当前事务的SqlSession,保证同步。主要是通过以下几个步骤进行SqlSession的创建:

    1. 它会首先获取SqlSessionHolder,SqlSessionHolder用于在TransactionSynchronizationManager中保持当前的SqlSession。

    2. 如果holder不为空,并且holder被事务锁定,则可以通过holder.getSqlSession()方法,从当前事务中获取sqlSession,即 Fetched SqlSession from current transaction。

    3. 如果不存在holder或没有被事务锁定,则会创建新的sqlSession,即 Creating a new SqlSession,通过sessionFactory.openSession()方法。

    4. 如果当前线程的事务是活跃的,将会为SqlSession注册事务同步,即 Registering transaction synchronization for SqlSession。

    展开全文
  • Mybatis SqlSession的两种使用方式

    千次阅读 2018-10-13 16:34:43
    Mybatis SqlSession的两种使用方式 一,SqlSession.SelectOne(mapper+selectid)/SqlSession.SelectList(mapper+selectid)/SqlSession.SelectMap(mapper+selectid) SqlSession直接调用mapper文件的SQL语句,...

    Mybatis SqlSession的两种使用方式

    一,SqlSession.SelectOne(mapper+selectid)/SqlSession.SelectList(mapper+selectid)/SqlSession.SelectMap(mapper+selectid)

    SqlSession直接调用mapper文件的SQL语句,不需要接口以及接口的实现类,就可以实现对数据库的操作。这种方式中,Mapper的命名空间属性的作用就是区分不同的mapper,保证mapper的唯一性。

     

    二,SqlSession.getMapper(xxxMaper.class).getXXXList()

    面向接口的编程方式,需要接口名与mapper的命名空间属性值保持一致,从而将接口与mapper文件对应起来。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须跟接口同名。

    这里由于路径设置两种思路的不同,常常会引起一些路径名上问题。

    一种思路是,Mapper文件和接口同属于DAO层,故在代码结构上,Mapper文件与该DAO接口应放置在同一package下,并且习惯上都已Mapper结尾。

    还有一种思路是,把Mapper.xml文件看作配置文件,而放在resoures的目录下。如此Mapper.class与Mapper.xml的根路径就不同了,这里一定要注意。

     

     

     

    展开全文
  • mybatis SqlSession事务

    2019-03-30 23:57:00
    mybatis版本:3.4.6。 mybatis默认的SqlSessionFactory是DefaultSqlSessionFactory,它openSession()的源码... public SqlSession openSession() { return this.openSessionFromDataSource(this.configuration.ge...

    mybatis版本:3.4.6。

    mybatis默认的SqlSessionFactory是DefaultSqlSessionFactory,它openSession()的源码是:

        public SqlSession openSession() {
            return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
        }
        private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
            Transaction tx = null;
    
            DefaultSqlSession var8;
            try {
                Environment environment = this.configuration.getEnvironment();
                TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
                tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
                Executor executor = this.configuration.newExecutor(tx, execType);
                var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
            } catch (Exception var12) {
                this.closeTransaction(tx);
                throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
            } finally {
                ErrorContext.instance().reset();
            }
    
            return var8;
        }

    可以看到,mybatis默认每次获取session都会开启一个事务,且不自动提交事务。如果更新操作完成后不手动commit,则在连接断开时会将更新操作回滚。

            SqlSession session = MybatisUtil.getSession();
            UserMapper userMapper = session.getMapper(UserMapper.class);
            try{
                UserDomain newUserDomain = new UserDomain();
                newUserDomain.setAge(10);
                newUserDomain.setName("scp2");
                newUserDomain.setSchool("高中");
                userMapper.insert(newUserDomain);
                session.commit();// 如果不commit,连接断开时操作会被回滚
            }
            catch (Exception e){
                System.out.println(e);
            }
            finally {
                if (null != session) {session.close();}
            }

     

    转载于:https://www.cnblogs.com/suchunping/p/10629832.html

    展开全文
  • 原文地址:Spring Transaction + MyBatis SqlSession事务管理机制研究学习  线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些...
  • 利用sqlSession.getMapper进行数据库操作时,会产生中文乱码问题,如果你是在properties文件中配置的那么jdbc的url要写成这样的方式 jdbc:mysql://localhost:端口号/数据库名?serverTimezone=GMT&useUnicode=...
  • 阅读文章能够收获SqlSessionFactoryBuilder,SqlSessionFactory、SqlSession相关知识 “ 建议结合mybatis 源码[1]、mybatis 官网[2]阅读, 可以下载不同版本的源码, 本文根据3.4.x解读, 不同版本源码存在细微差别 ...
  • MyBatis SqlSession 工具类

    2018-01-29 23:24:00
    MyBatis 使用中,如果没个方法执行时都需要读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象,然后创建SqlSession 对象,这会导致类大量的重复代码。为了简化开发,需要将重复代码封装到一个工具类中...
  • mybatis sqlSession管理工具类

    千次阅读 2017-03-13 18:09:30
    mybatis会话集中管理: 第一:项目目录结构: 第二:工具类的编写:package com.sun.mybatis.utils;import java.io.Reader;...import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.
  • mybatis sqlSession一直出现空指针异常

    千次阅读 2018-06-12 17:17:05
    然后断点调试的时候发现sqlSession=SqlSessionFactoryUtils.openSqlSession();这里出了问题。然后一直抛出空指针异常。网上有各种的方案,但是都没适合我这个问题。这个问题是建立在pojo.xml语句对的情况下的我的...
  • 2019-04-09 @Test public void Test() throws Exception { // 1、读取配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources...
  • SqlSession: 数据库CRUD及事务操作接口 线程不安全,常用于Request范围或method范围 // Request范围,4次sql执行共用一个SqlSession sqlSessionManager.startManagedSession(); try { sqlSessionManager.query1...
  • spring整合mybatis sqlSession释放问题

    千次阅读 2017-10-31 14:20:37
    invoke调用了sqlSession,这个sqlSession实际上是SqlSessionTemplate。这个template的构造函数 public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory , ExecutorType executorType , ...
  • 小狼最近在做mybatis的CURD,发现一个小狼不能接受的问题,当然,小狼是比较懒的,见不得冗余代码 每一个CURD操作,小狼都得写一遍下面的代码,一口老血吐出来了...SqlSessionFactoryBuilder ...
  • sqlSession = getSession(); String members=" 'user01','user02','user03' "; Map map = new HashMap(); map.put("members", members); ArrayList<MemberVO> member_list = (ArrayList<MemberVO>...
  • mybatis获取SqlSession源代码流程
  • mybatissqlsession下的四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。这篇文章主要介绍了MybatisSqlSession下的四大对象之执行器(executor),需要的朋友可以参考下
  • mybatisSqlsession问题

    2017-05-08 11:17:53
    单独使用mybatisSqlsession问题导致的更新,插入数据等不起作用的解决方法
  • 主要介绍了MyBatisSqlSession实现增删改查案例,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • Mybatis创建sqlsession的过程 首先肯定是先读取配置文件,然后可以build一个sqlSessionFactory,通过sqlSessionFactory我们就可以open出一个sqlSession然后用来执行SQL语句了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,302
精华内容 38,520
关键字:

mybatissqlsession