mybatis解读

1.sqlSession和connection的区别 【mybatis解读】通俗理解:一个sqlSession对应一个connection,sqlSession是用来操作connection的
Connection 作为一个特定数据库的会话,在一个连接的上下文中,sql语句被执行,然后结果被返回。我们在一次Connection上下文中可以执行多个操作。但是默认情况下,一个connection被创建时,默认是auto-commit模式,statement执行完sql后自动commit。这样,虽然多个操作在同一个Connection上下文中执行,他们自己只和自己有关系,但是他们之间没有什么关系。如果我们想多个操作,同时成功或同时失败,那就要设置禁止auto-commit模式,然后手动commit 。这样一次Connection中的几个操作,就具有同时成功或者同时失败的关系。

1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 2.获取数据库连接 Connection conn=DriverManager.getConnection(url,user,p); 3.创建向数据发送sql 的statement对象 Statement stmt = conn.CreateStatement(); 4.向数据库发送sql ResultSet rs= stmt.executeQuery(sql)//select语句 int updateaSum = stmt.executeUpdate(sql)//insert,update delete语句5. 处理结果集 while(rs.next()){ rs.getString(列名) rs.getInt(列名) } 6. 关闭资源 rs.close(); stmt.close(); conn.close();

SqlSession 可以看作是对Connection 更加高级的抽象,从其方法上更加可以看出他具有更加明显的操作特征。
void select(String statement, ResultHandler handler); int insert(String statement, Object parameter); int update(String statement); int delete(String statement, Object parameter)

2.sqlSession的原理 一个sqlsession一般对应一个connection,并且mybatis默认每次获取session都会开启一个事务,且不自动提交事务。如果更新操作完成后不手动commit,则在连接断开时会将更新操作回滚,一个sqlSession(一个transaction)中可以多次commit,commit后cache和statement刷新(一般一个事务(transaction)只对应一个sqlseesion,也即一个connection,分布式一个事务可以对应多个connection),只有close后同时关闭sqlsession和transaction(transaction可以由factory关闭)并返回connection。mybatis的transaction基本没添加什么功能,大部分仅状态判断后交由connection(再由jdbc)执行。可能是为了给spring等框架容易组转自己的事务管理机制
思考 2.1为什么每次都要执行sql结束都会出发sqlSession.close()?同一个线程使用ThreadLocal中只保存一份不好吗?
Connection对象是线程不安全的,为避免多个线程才做同一个connection对象,可以采用ThreadLocal机制。
sqlSession是对connection的进一步封装。事务存在的情况下,sqlSession会存在复用以确保事务的正常运行和回滚。事务不存在的情况下,sqlSession对象是可以一直使用ThreadLocal中与该线程绑定的同一个connection,但是此种方式并不优雅,mybatis也并没有采用。理由如下:connection对象可以被看为一种可复用的资源,使用连接池技术更加合理,否则,同一个sqlSession一直持有同一个connection不释放,在不进行DB操作时也占用着该链接,将会很耗费资源,而mybatis是采用链接池记述,看似“create”,实为复用同一个链接对象。看似“close”,实为释放回链接池,很好的解决啦资源浪费,又保证了设计原则
2.2 事务是怎么实现的?事务的传播行为又是怎样的
事务是通过sqlSessionHolder等类实现的,事务实现的基础是事务中的所有持久化操作使用的是同一个connection。故多线程情况下不存在事务的传播行为
参考文献:https://blog.csdn.net/hcy5421...
https://cloud.tencent.com/dev...

    推荐阅读