日期:2014-05-19  浏览次数:20819 次

JDBCTemplate和Hibernate区别,什么情况下用JDBCTemplate,什么情况下用Hibernate?
如题


JDBCTemplate和Hibernate区别,什么情况下用JDBCTemplate,什么情况下用Hibernate?怎么用?

刚看有人发帖问Spring声明式事物和编程式事物的区别,我也想起来以前的一个问题。

有一次面试人家问我,Spring事物什么时候提交?什么时候回滚?

我回答:异常时候回滚,正常情况下提交.后来想想也太笼统了,说了跟没说一样!

大家就这几个问题讨论下?

ps:Javaeye上查来的资料

关于spring容器事务回滚

Java code
//注解方式声明事务,该事务声明的范围是service中的方法,而一般的事务声明时不是声明在//业务逻辑方法上的,而是声明在单一的数据库操作方法上的 
@Transactional 
public class UserServiceImpl implements UserService{ 

private JdbcTemplate jdbcTemplate; 

@Override 
/* 
* 事务默认情况下如果方法抛出unchecked异常,则事务回滚,如果抛出的是checked异常,则事务不回滚 
* 如果想要让方法抛出checked异常时也回,则可以按照下面的方法 
* @Transactional(rollbackFor=Exception.class) 
* 也可以指定unchecked异常不进行回滚 
* @Transactional(noRollbackFor=RuntimeException.class) 
*/ 
@Transactional(rollbackFor=Exception.class) 
public void delete(int userid) throws Exception{ 
// TODO Auto-generated method stub 
jdbcTemplate.update("delete user where id=?",new Object[]{userid}, 
new int[]{java.sql.Types.INTEGER}); 
throw new Exception("hello"); 
} 
} 

对于在类前用@Transactional声明的事务,则类中所有的方法都被声明了事务,
而@Transactional声明后默认情况下,所有方法如果抛出的是unchecked异常,

也即RuntimeException,则事务回滚,如果抛出的是checked异常,即Exception,则事务不回滚 
因此如果想让方法在抛出checked异常时也回滚,

则可以在方法前加上这样的注释 
@Transactional(rollbackFor=Exception.class),这样则表示该方法抛出checked异常时也回滚,

当然也可以让方法抛出unchecked异常不进行回滚,
只需要在方法前面加上注释 
@Transactional(noRollbackFor=RuntimeException.class)即可



------解决方案--------------------
学习一下
------解决方案--------------------
学习了,呵呵
------解决方案--------------------
直接用jdbc的时候用JDBCTemplate。

------解决方案--------------------

------解决方案--------------------
一个拦截器,方法调用就是那个切面,开始前开启,完成后提交。
和你在方法开始时开始一个事物,方法结束时提交一个意思。
他的回滚需要你配参数,默认只回滚RunTimeException。
------解决方案--------------------
帮你顶一下
------解决方案--------------------
mark
------解决方案--------------------
我在学框架的时候就是这样的,想我用servlet能做的,为什么非得要用struts2呢?我用JDBC可以做数据库,为什么还要学hibernate呢?虽然能实现一样的功能,但是一旦分层,想做大的项目,用框架前期维护起来就会好点吧!我纯属发牢骚
------解决方案--------------------
JDBCTemplate是Spring对jdbc的封装,但sql还是得自己写,一旦要写sql,则会增加灵活和复杂性,当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。
若使用hibernate则不用关心底层的数据库是哪个数据库,在编程方面,也更对象化了,比如
save(Object obj),我们操作的都是对象。hibernate也利用了缓存产生实现与数据库的读取操作,提高了性能。。。太多了,你自己在以后的编程中会发现很多!
------解决方案--------------------
就是切面的问题
异常通知就调用回滚方法 正常就调用提交方法
------解决方案--------------------
顶,恨没早看到!
------解决方案--------------------
学习了
哈哈
顶你!
------解决方案--------------------
JDBCTemplate是Spring对jdbc的封装,但sql还是得自己写,一旦要写sql,则会增加灵活和复杂性,当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。
若使用hibernate则不用关心底层的数据库是哪个数据库,在编程方面,也更对象化了,比如
save(Object obj),我们操作的都是对象。hibernate也利用了缓存产生实现与数据库的读取操作,提高了性能。。。太多了,你自己在以后的编程中会发现很多!
------解决方案--------------------
回滚规则的概念比较重要:它使我们能够指定什么样的异常(和throwable)将导致自动回滚。我们在配置文件中声明式地指定,无须在Java代码中。同时,我们仍旧可以通过调用 TransactionStatus 的 setRollbackOnly() 方法编程式地回滚当前事务。通常,我们定义一条规则,声明 MyApplicationException 必须总是导致事务回滚。这种方式带来了显著的好处,它使你的业务对象不必依赖于事务设施。典型的例子是你不必在代码中导入Spring API,事务等。