Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
112 views
in Technique[技术] by (71.8m points)

mybatis解读

1.sqlSession和connection的区别

通俗理解:一个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...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...