什么是数据访问层?
参考:http://www.cnblogs.com/whitewolf/archive/2012/06/05/2535486.html
J2EE里面的数据访问层这么设计的:
附注:
图片来自:http://www.it-crazy.net/dal-design-on-game/
要想理解这个,我们回到JDBC的理解;
什么是JDBC?
通俗地说:JDBC是java和关系数据库的之间的桥梁;
我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据,一般需要以下七个步骤:
(1) 加载JDBC驱动
Dirver (是驱动程序对象的接口,指向具体数据库驱动程序对象=DriverManager.getDriver(String URL))
(2) 建立并获取数据库连接
Connection (是连接对象接口,指向具体数据库连接对象=Drivermanager.getConnection(String URL))
(3) 创建 JDBC Statements 对象
Statement (执行静态SQL语句接口,=Connection.CreateStatement())
(4) 设置SQL语句的传入参数
(5) 执行SQL语句并获得查询结果
ResultSet (是指向结果集对象的接口,=Statement.excuteXXX())
(6) 对查询结果进行转换处理并将处理结果返回
(7) 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
JDBC事务的处理(JDBC的事务处理简单,在执行多条语句后,加cn.commit()或cn.rollback()就可以)
<1>.关闭Connection的自动提交
connection.setAutoCommit(false);
<2>.执行一系列sql语句:执行新sql前,以前的Statement(或PreparedStatemet)须close
Statement sm ;
sm = cn.createStatement(insert intouser...);
sm.executeUpdate();
sm.close();
sm = cn.createStatement("insertinto corp...);
sm.executeUpdate();
sm.close();
<3>.提交
cn.commit();
<4>.如果发生异常,回滚:
cn.rollback();
可以看出来,用JDBC至少有几点大家深有体会:
1. SQL经常要拼接,而且散布在各个文件类里面;
2. 事务管理非常不方便,还要自己去管理;有多少人写JDBC还去自己手动管理呢?
参考:从JDBC到mybatis原理的分析
http://www.iteye.com/blogs/subjects/mybatis_internals
http://blog.csdn.net/luanlouis/article/details/40422941
回到事务管理的话题上;
首先,看看Spring+hibernate怎么配置事务的:
参考:
http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html
hibernate和mybatis都一样;
简单情况例如:
<tx:methodname="save*" propagation="REQUIRED"/>
这种在service层调用saveXXX方法时候 这个方法就被事务管理,这个save方法里再调用dao层,查询数据时候开启了session ,开启了事务 。当你执行完了这个save方法(这个方法里面可能执行了多个SQL语句,其实就是对应的JDBC的事务管理) ,事务自动关闭,session也自动关闭,这些都是由spring管理的;
当然这些只是从概念层面上去分析,以后如果能深入理解具体怎么实现的,结合设计的思想会理解的更深;