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

WYhack 2010-04-23 12:12:43
如题


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

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

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

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

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

ps:Javaeye上查来的资料

关于spring容器事务回滚

//注解方式声明事务,该事务声明的范围是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)即可

...全文
1723 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
X技术交流X 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

JDBCTemplate是Spring对jdbc的封装,但sql还是得自己写,一旦要写sql,则会增加灵活和复杂性,当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。
若使用hibernate则不用关心底层的数据库是哪个数据库,在编程方面,也更对象化了,比如
save(Object obj),我们操作的都是对象。hibernate也利用了缓存产生实现与数据库的读取操作,提高……
[/Quote]
这位童鞋说的不错.~
liuzhengkang 2010-04-29
  • 打赏
  • 举报
回复
顶,学习了...
WYhack 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 silence_smile 的回复:]

顶,恨没早看到!
[/Quote]

也可以发表下意见啊!
javaee_ssh 2010-04-28
  • 打赏
  • 举报
回复
Spring 提供了JDBCTemplate,HibernateTemplate,对JDBC和Hibernate做了一层封装而已,用JDBC的时间就用JDBCTemplate,用Hibernte的时间也可以用HibernateTemplate,Spring好像还有Ibatis的模版
亲努力啊 2010-04-28
  • 打赏
  • 举报
回复
回滚规则的概念比较重要:它使我们能够指定什么样的异常(和throwable)将导致自动回滚。我们在配置文件中声明式地指定,无须在Java代码中。同时,我们仍旧可以通过调用 TransactionStatus 的 setRollbackOnly() 方法编程式地回滚当前事务。通常,我们定义一条规则,声明 MyApplicationException 必须总是导致事务回滚。这种方式带来了显著的好处,它使你的业务对象不必依赖于事务设施。典型的例子是你不必在代码中导入Spring API,事务等。

那个有例子发出来看哈啊 搞不懂...
米尤人 2010-04-28
  • 打赏
  • 举报
回复
JDBCTemplate 是对数据源的管理,这是它的侧重点,而hibernate主要是数据库和实体对象的映射
diacainiao 2010-04-27
  • 打赏
  • 举报
回复
学习一下
水中影子 2010-04-27
  • 打赏
  • 举报
回复
路过,顶
重返春季 2010-04-27
  • 打赏
  • 举报
回复
JDBCTemplate是Spring对jdbc的封装,但sql还是得自己写,一旦要写sql,则会增加灵活和复杂性,当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。
若使用hibernate则不用关心底层的数据库是哪个数据库,在编程方面,也更对象化了,比如
save(Object obj),我们操作的都是对象。hibernate也利用了缓存产生实现与数据库的读取操作,提高了性能。。。太多了,你自己在以后的编程中会发现很多!
小栗色兔子 2010-04-27
  • 打赏
  • 举报
回复
学习了
哈哈
顶你!
Silence_Smile 2010-04-27
  • 打赏
  • 举报
回复
顶,恨没早看到!
WYhack 2010-04-27
  • 打赏
  • 举报
回复
有点眉目!
javazjs 2010-04-27
  • 打赏
  • 举报
回复
就是切面的问题
异常通知就调用回滚方法 正常就调用提交方法
zcl198715 2010-04-26
  • 打赏
  • 举报
回复
JDBCTemplate是Spring对jdbc的封装,但sql还是得自己写,一旦要写sql,则会增加灵活和复杂性,当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。
若使用hibernate则不用关心底层的数据库是哪个数据库,在编程方面,也更对象化了,比如
save(Object obj),我们操作的都是对象。hibernate也利用了缓存产生实现与数据库的读取操作,提高了性能。。。太多了,你自己在以后的编程中会发现很多!
angel 2010-04-26
  • 打赏
  • 举报
回复
我在学框架的时候就是这样的,想我用servlet能做的,为什么非得要用struts2呢?我用JDBC可以做数据库,为什么还要学hibernate呢?虽然能实现一样的功能,但是一旦分层,想做大的项目,用框架前期维护起来就会好点吧!我纯属发牢骚
WYhack 2010-04-26
  • 打赏
  • 举报
回复
我再顶!
NOKIA5320XM 2010-04-26
  • 打赏
  • 举报
回复
mark
colin_pxx 2010-04-26
  • 打赏
  • 举报
回复
帮你顶一下
WYhack 2010-04-26
  • 打赏
  • 举报
回复
自己顶!
charles361 2010-04-23
  • 打赏
  • 举报
回复
学习一下
加载更多回复(7)

67,518

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧