乐趣区

关于mybatis: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…

退出移动版