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年(清)周述官撰 1
-
少林空悟老师珍藏
- 国术典籍:《增演易筋洗髓内功图说》【2024年8月编校】
-
《增演易筋洗髓内功图说》系养生气功著作,全书共十八卷。清周述官编撰于光绪二十一年(1895年)。清光绪十九年(1893年),僧人静一空悟将少林功法传授于周述官,并将《增益易筋洗髓内功图说》十二卷(按,...
- 小说:自媒体小白的修道之路-洗髓(自媒体小白运营技巧)
-
谁应了谁的劫,谁又变成了谁的执念。当沧海遗忘了桑田,这世间又多了一个不回家的人!异域空间中,知生缓缓起身,目光扫了一下小帝后,又转身看向画板上的那朵白色蒲公英,自言道:“白瑛,这一世我们莫要再辜负了!...
- 这才是少林洗髓经真相:它是静功和导引术与八段锦暗合
-
不少朋友误解易筋经和洗髓经,将其简单归为强力呼吸的吐纳功以及为了提升房中的关窍功。事实上易筋经和洗髓经是两部功法:易筋经主要为炼体,包含以膜论为核心的十二月怕打筋膜法,以及辅助的呼吸、导引功法;洗髓经...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)