jdbctemplate 事务_JdbcTemplate和HibernateTemplate

今天把程序开发中常用的两种JDBC方法整理一下,以后做CRUD开发时,对于什么样的sql语句选用什么方法来实现也有个可遵循的依据。

基于Spring框架,要支持JDBC,需要关注的一个核心接口就是DaoSupport

b62a2d30a0e33ff5e53746e94a69b42a.png

DaoSupport常用的三种dao支持有:

HibernateDaoSupport

JdbcDaoSupport

TopLinkDaoSupport

今天主要介绍HibernateDaoSupport和JdbcDaoSupport提供的方法。

HibernateDaoSupport提供getSession()和.getHibernateTemplate()支持CURD操作;

JdbcDaoSupport提供getJdbcTemplate()支持CURD操作。

JdbcTemplate是spring-jdbc的,HibernateTemplate是spring-orm的。

38acd7761e15232c21d65cb212fa93d6.png

HibernateTemplate和jdbcTemplate

HibernateTemplate的优点是能够加快开发效率,使用Hibernate的时候,开发更简洁,更便利,统一的声明事务,让Hibernate对事务的处理大大简化。

但是在处理大批量数据查询的时候,Hibernate的查询效率不尽人意。有人做过测试,在高并发查询的时候,hibernate的查询效率,仅仅相当于使用jdbcTemplate效率70%左右不到80%,这对于速度要求较高的互联网应用来说,不得不说是个瓶颈,所以现在很多项目采用jdbcTemplate和Hibernate混用的方式,这时有3个注意事项:

1.如果采用JDBCTemplate的部分只涉及到查询,则可以使用Hibernate的应用缓存,即二级缓存。

2.如果采用JDBCTemplate的部分涉及到对数据库的更新操作,即增删改,则不能开启Hibernate的二级缓存。

3.在使用Spring作为容器的系统中,混用JDBCTemplate和Hibernate,事务管理使用统一的TransactionManager,JDBCTemplate和Hibernate共用一个DataSource。

7963acdf0de1507aad27a882a5b6c321.png

jdbcTemplate

//使用BatchPreparedStatementSetter接口实现批量    public void batchAdd(final List list)         this.jdbcTemplate.batchUpdate(batch_insert_sql, new BatchPreparedStatementSetter(){           @Override            public int getBatchSize() {                return list.size();            }            @Override            public void setValues(PreparedStatement ps, int arg1) throws SQLException {                User item = list.get(arg1);                ps.setString(1, item.getUserId());                ps.setString(2, item.getAge());                ps.setString(3, item.getName());            }        });    }//使用RowMapper作为参数List modelList =jdbcTemplate.query(sql, new Object[]{userId},new BeanPropertyRowMapper(User.class));

getHibernateTemplate

//基于HibernateCallback回调方法的新增public void batchAdd(final List list) {getHibernateTemplate().execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session) throws HibernateException, SQLException {for (int i = 0; i < list.size(); i++) {session.save(list.get(i));}return null;}});}StringBuilder hql = new StringBuilder("from com.ck.model.User where 1=1 ");->getHibernateTemplate().find(hql, values);

seesion

//分页查询:public List query(final String hql, final int firstResult, final int maxResult, final Object... values) {return (List) this.getHibernateTemplate().execute(new HibernateCallback() {public T doInHibernate(Session session) throws HibernateException {Query query = createQuery(session, hql, values);query.setFirstResult(firstResult);query.setMaxResults(maxResult);return (T) query.list();}});}private Query createQuery(Session session, String hql, Object... values) {Query query = session.createQuery(hql);if (values != null) {for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}}return query;}
//支持多表联查,支持*final StringBuffer sql = new StringBuffer("SELECT ac.*,a.* FROM User ac LEFT JOIN Book a on a.user_id=ac.user_id where 1=1 ");SQLQuery sqlQuery = session.createSQLQuery(sql.toString());sqlQuery.addEntity(User.class).addEntity(Book.class);getSqlQueryByMap(sqlQuery, params);//默认返回对象的list集合,可以设置返回类型为MAP//sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);List list = sqlQuery.list();//基于Criterion的查询Criterion[] criterion= {Restrictions.eq("userId",id)};public List find(Criterion... criterions) {return this.createCriteria(criterions).list();}protected Criteria createCriteria(Criterion... criterions) {Criteria criteria = this.getSession().createCriteria(this.getClass());Criterion[] arr$ = criterions;int len$ = criterions.length;for (int i$ = 0; i$ < len$; ++i$) {Criterion c = arr$[i$];criteria.add(c);}return criteria;}//分批提交public void batchSave(final List list) {getHibernateTemplate().execute(new HibernateCallback() {@Overridepublic Object doInHibernate(Session session) throws HibernateException, SQLException {Transaction ts = session.beginTransaction();for (int i = 0; i < list.size(); i++) {session.save(list.get(i));if (i % 50 == 0) {session.flush();session.clear();}}ts.commit();return null;}});}
d1f1cabd93b3a70e373b792a1b0eca43.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值