Transaction与SqlSession,Connection 存在什么关系?他们为什么而存在?
回顾ConnectionTransactionSqlSession总结
回顾
JDBC
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();
Connection
JDBC 是我们用来与数据库交互最基础的API。
Connection 作为一个特定数据库的会话,在一个连接的上下文中,sql语句被执行,然后结果被返回。
我们在一次Connection上下文中可以执行多个操作。
但是默认情况下,一个connection被创建时,默认是auto-commit模式,statement执行完sql后自动commit。这样,虽然多个操作在同一个Connection上下文中执行,他们自己只和自己有关系,但是他们之间没有什么关系。
如果我们想多个操作,同时成功或同时失败,那就要设置禁止auto-commit模式,然后手动commit 。 这样一次Connection 中的几个操作,就具有同时成功或者同时失败的关系。
Connection 隐藏的概念也就清晰可见:
- 操作
- 操作与操作之间的关系
Transaction
事务(Transaction) ,正是对N(N>=1)个操作执行时,同时成功或同时失败的关系的具象。
有操作,必定有事务。操作与事务相生相随
可以看出事务在Connection上的边界是Commit/rollback.
SqlSession
SqlSession 扮演什么角色呢?
我们对数据库的操作无非就是增上改查,Connection 中操作的概念主要体现在SQL上,select|insert|update|delete语句。
SqlSession是Mybatis 中定义的,用来表示与关系数据库的一次会话,会话定义了各种具体的操作,
查询、数据更新(包含保存、更新、删除)操作。而这些操作都在与数据库建立会话的基础上进行的
SqlSession 可以看作是对Connection 更加高级的抽象,从其方法上更加可以看出他具有更加明显的操作特征。
void select(String statement, ResultHandler handler); int insert(String statement, Object parameter); int update(String statement); int delete(String statement, Object parameter);
总结
- Connection 是基础。
- Transaction 是对多个操作,同时成功或同时失败的关系的具象化
- SqlSession 是对Connection操作的高级封装。
- Transaction ,SqlSession 都得依靠Connection
- SqlSession ,Connection 的操作又伴随着Transaction