百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

JdbcTemplate和HibernateTemplate

lipiwang 2024-11-17 13:25 9 浏览 0 评论

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

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


DaoSupport常用的三种dao支持有:

HibernateDaoSupport

JdbcDaoSupport

TopLinkDaoSupport

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

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

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

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

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。

jdbcTemplate

//使用BatchPreparedStatementSetter接口实现批量
    public void batchAdd(final List<User> 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<User> modelList =jdbcTemplate.query(sql, new Object[]{userId},new BeanPropertyRowMapper(User.class));

getHibernateTemplate

//基于HibernateCallback回调方法的新增
public void batchAdd(final List<User> list) {
		getHibernateTemplate().execute(new HibernateCallback<Object>() {
			@Override
			public 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<T> query(final String hql, final int firstResult, final int maxResult, final Object... values) {
		return (List<T>) this.getHibernateTemplate().execute(new HibernateCallback<T>() {
			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<T> 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<T> list) {
		getHibernateTemplate().execute(new HibernateCallback<Object>() {
			@Override
			public 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;
			}
		});
	}

相关推荐

微软Office Open XML中的数字签名漏洞

MicrosoftOffice是最广泛使用的办公文档应用程序之一。对于重要文件,如合同和发票,可以对其内容进行签名,以确保其真实性和完整性。自2019年以来,安全研究人员发现了针对PDF和ODF等其...

Javaweb知识 day12 XML(javaweb中xml作用)

一、XML:1.1概念:ExtensibleMarkupLanguage可扩展标记语言*可扩展:标签都是自定义的。<user><student>1.2功能:...

易筋洗髓功——内外同修方可致远(易筋洗髓功口诀)

达摩祖师所传易筋、洗髓两经,一分为二,二实为一,无非以方便法门接引众生,而归于慈悲清净之心地。修炼《易筋经》是为强身健体,修炼《洗髓经》是为修心养性,此二者相辅相成,内外兼修,缺一不可。这是一套传统中...

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 4

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 5

道家洗髓功修炼要义,洗髓功如何做到丹田聚气?

不管是道家洗髓功,还是洗髓经,其修炼的关键点就在于得气、行气、聚气...那么,作为洗髓功修炼者,具体该怎么做呢?在实际修炼中,就洗髓功的修炼方法来讲,我们可以简单的归纳为修炼三部曲,其具体表现如下:一...

「清风聊练功」师门传我易筋经:聊聊我的学习经历和正身图感受

一个人的眼界认识,是随着是自身的知识积累和水平不断成长的。开篇为什么要说这么一句呢?是从我的学习经历上感受明显的这句话:一处不到一处迷。我们学传统武术,内功功法,也是从小白到明白一步步走的,走的越远,...

内功外练功介绍(练内功 外功)

这里介绍我练习的两套动功心得体会。是老道长的八部金刚功、长寿功和增演易筋洗髓经。八部金刚功外练奇经八脉,练出健康强壮的好身体还是可以的,长寿功也是内练功法。这部功法很好的预防效果。这个大家都认同的。说...

孔德易筋洗髓大全注解(下)(孔德易筋经教学视频)

...

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 1

少林空悟老师珍藏

国术典籍:《增演易筋洗髓内功图说》【2024年8月编校】

《增演易筋洗髓内功图说》系养生气功著作,全书共十八卷。清周述官编撰于光绪二十一年(1895年)。清光绪十九年(1893年),僧人静一空悟将少林功法传授于周述官,并将《增益易筋洗髓内功图说》十二卷(按,...

小说:自媒体小白的修道之路-洗髓(自媒体小白运营技巧)

谁应了谁的劫,谁又变成了谁的执念。当沧海遗忘了桑田,这世间又多了一个不回家的人!异域空间中,知生缓缓起身,目光扫了一下小帝后,又转身看向画板上的那朵白色蒲公英,自言道:“白瑛,这一世我们莫要再辜负了!...

这才是少林洗髓经真相:它是静功和导引术与八段锦暗合

不少朋友误解易筋经和洗髓经,将其简单归为强力呼吸的吐纳功以及为了提升房中的关窍功。事实上易筋经和洗髓经是两部功法:易筋经主要为炼体,包含以膜论为核心的十二月怕打筋膜法,以及辅助的呼吸、导引功法;洗髓经...

孔德易筋洗髓大全注解(上)(孔德易筋经洗髓经视频)

...

洗髓经传承与心得(二)(《洗髓经》)

...

取消回复欢迎 发表评论: