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。故多线程情况下不存在事务的传播行为
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。