hibernate基础dao类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台
功能:数据库的保存、更新、删除;sql、hql查询;分页查询;调用存储过程
创建hibernate基础dao类:
BaseDao.java
package com.ims.persistence.base;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.hibernate.criterion.DetachedCriteria;
/**
* 统一数据访问接口
*/
public interface BaseDao<T extends Serializable> {
/**
* 保存实体对象
* @param entity 实体对象
*/
public void save(T entity);
/**
* 更新实体对象
* @param 实体对象
*/
public void update(T entity);
/**
* 保存或更新实体对象
* @param entity 实体对象
*/
public void saveOrUpdate(T entity);
/**
* 删除实体对象
* @param entity 实体对象
*/
public void delete(T entity);
/**
* 查询hql语句,返回唯一结果
* @param hql
*/
public Object findUniqueResult(String hql);
/**
* 执行sql语句,更新数据库
* @param sql
*/
public void updateBySql(String sql);
/**
* 通过Criteria对象查询,返回实体对象结果集
* @param detachedCriteria 离线的Criteria对象
* @return 实体对象结果集
*/
public List findByCriteria(DetachedCriteria detachedCriteria);
/**
* 通过sql语句查询,返回map对象结果集
* @param sql
* @return map对象结果集
*/
public List<Map<String, Object>> findBySql(String sql);
/**
* 查询sql语句,返回唯一结果
* @param sql
*/
public Object findUniqueResultBySql(String sql);
/**
* 通过Criteria对象查询,返回结果集的记录数
* @param detachedCriteria 离线的Criteria对象
* @return 结果集的记录数
*/
public long getCount(DetachedCriteria detachedCriteria);
/**
* 通过Criteria对象进行分页查询,返回实体对象结果集
* @param pageNum 第几页
* @param pageSize 每页大小
* @param detachedCriteria 离线的Criteria对象
* @return 实体对象结果集
*/
public List<T> findPage(int pageNum, int pageSize, DetachedCriteria detachedCriteria);
/**
* 通过sql语句,进行分页查询,返回分页对象
* @param pageNum 第几页
* @param pageSize 每页大小
* @param sql
* @return 分页对象
*/
public Pagination findPage(int pageNum, int pageSize, String sql); // 查找分页对象列表
/**
* 调用存储过程,返回单结果集
* @param proceName 存储过程名称
* @param params 输入参数集合
* @return map对象结果集
*/
public List<Map<String, Object>> callProcedure(String proceName, final List<Object> params);
}
BaseDaoImpl.java
package com.ims.persistence.base;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.jdbc.Work;
public class BaseDaoImpl<T extends Serializable> implements BaseDao<T>{
private SessionFactory sessionFactory;
public BaseDaoImpl(){
super();
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 返回数据库session对象
* @return
*/
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
/**
* 保存实体对象
* @param entity 实体对象
*/
@Override
public void save(T entity){
Session session = getSession();
session.save(entity);
session.flush();
session.evict(entity);
}
/**
* 更新实体对象
* @param 实体对象
*/
@Override
public void update(T entity){
Session session = getSession();
session.update(entity);
session.flush();
session.evict(entity);
}
/**
* 保存或更新实体对象
* @param entity 实体对象
*/
@Override
public void saveOrUpdate(T entity) {
Session session = getSession();
session.saveOrUpdate(entity);
session.flush();
session.evict(entity);
}
/**
* 删除实体对象
* @param entity 实体对象
*/
@Override
public void delete(T entity){
Session session = getSession();
session.delete(entity);
session.flush();
session.evict(entity);
}
/**
* 查询hql语句,返回唯一结果
* @param hql
*/
@Override
public Object findUniqueResult(String hql){
Query query = getSession().createQuery(hql);
return query.uniqueResult();
}
/**
* 执行sql语句,更新数据库
* @param sql
*/
@Override
public void updateBySql(final String sql){
getSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.prepareStatement(sql).executeUpdate();
}
});
}
/**
* 通过Criteria对象查询,返回实体对象结果集
* @param detachedCriteria 离线的Criteria对象
* @return 实体对象结果集
*/
@Override
public List findByCriteria(DetachedCriteria detachedCriteria){
Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
List records = criteria.list();
return records;
}
/**
* 通过sql语句查询,返回map对象结果集
* @param sql
* @return map对象结果集
*/
@Override
public List<Map<String, Object>> findBySql(final String sql){
final List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
getSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
ResultSet rs = connection.prepareStatement(sql).executeQuery();
result.addAll(RsHelper.rSToList(rs));
}
});
return result;
}
/**
* 查询sql语句,返回唯一结果
* @param sql
*/
@Override
public Object findUniqueResultBySql(String sql) {
return getSession().createSQLQuery(sql.toString()).uniqueResult();
}
/**
* 通过Criteria对象查询,返回结果集的记录数
* @param detachedCriteria 离线的Criteria对象
* @return 结果集的记录数
*/
@Override
public long getCount(DetachedCriteria detachedCriteria) {
Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
Object object = criteria.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
Long totalRow = Long.valueOf(String.valueOf(object));
return totalRow;
}
/**
* 通过Criteria对象进行分页查询,返回实体对象结果集
* @param pageNum 第几页
* @param pageSize 每页大小
* @param detachedCriteria 离线的Criteria对象
* @return 实体对象结果集
*/
@Override
public List<T> findPage(int pageNum, int pageSize,
DetachedCriteria detachedCriteria){
Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
List<T> records = criteria.setFirstResult((pageNum-1) * pageSize).setMaxResults(pageSize).list();
return records;
}
/**
* 通过sql语句,进行分页查询,返回分页对象
* @param pageNum 第几页
* @param pageSize 每页大小
* @param sql
* @return 分页对象
*/
@Override
public Pagination findPage(final int pageNum, final int pageSize,final String sql){
final Pagination page = new Pagination();
getSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
String countSql = MessageFormat.format("select count(*) from ({0}) page", sql);
ResultSet rs = connection.prepareStatement(countSql).executeQuery();
page.setTotal(Long.valueOf(RsHelper.getUniqueResult(rs).toString()));
long firstResult = (pageNum - 1)*pageSize;
String selectSql = MessageFormat.format("select * from ({0}) page limit {1},{2}", sql, firstResult, firstResult+pageSize);
page.setRows(RsHelper.rSToList(connection.prepareStatement(selectSql).executeQuery()));
}
});
return page;
}
/**
* 调用存储过程,返回单结果集
* @param proceName 存储过程名称
* @param params 输入参数集合
* @return map对象结果集
*/
public List<Map<String, Object>> callProcedure(String proceName, final List<Object> params){
final List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
final StringBuffer sql = new StringBuffer();
sql.append("{call " + proceName + "(");
for(int i=0; params!=null && i<params.size(); i++){
sql.append("?");
if(i+1!=params.size())
sql.append(",");
}
sql.append(")}");
getSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
CallableStatement statement = connection.prepareCall(
sql.toString());
for(int i=0; i<params.size(); i++){
statement.setObject(i+1, params.get(i));//设置参数
}
result.addAll(RsHelper.rSToList(statement.executeQuery()));
}
});
return result;
}
}
Pagination.java
package com.ims.persistence.base;
import java.util.ArrayList;
import java.util.List;
/**
* 分页对象,一般用于响应页面请求
*/
public class Pagination {
/**
* 总记录数
*/
private Long total = 0l;
/**
* 记录集合
*/
private List rows = new ArrayList();
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
}
RsHelper.java
package com.ims.persistence.base;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 数据库结果集帮助器
*/
public class RsHelper {
/**
* 返回结果集中的唯一结果,没有则返回null
* @param rs 结果集
* @return
* @throws SQLException
*/
public static Object getUniqueResult(ResultSet rs) throws SQLException{
if(rs.next()) {
return rs.getObject(1);
}
return null;
}
/**
* 将实体结果集对象转换为map对象结果集
* @param rs 实体结果集对象
* @return map对象结果集
* @throws SQLException
*/
public static List<Map<String,Object>> rSToList(ResultSet rs) throws SQLException {
if (rs == null)
return Collections.EMPTY_LIST;
ResultSetMetaData md = rs.getMetaData(); //得到结果集(rs)的结构信息,比如字段数、字段名等
int columnCount = md.getColumnCount(); //返回此 ResultSet 对象中的列数
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> rowData = new HashMap<String,Object>();
while (rs.next()) {
rowData = new HashMap<String,Object>(columnCount);
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}
}
hibernate基础dao类的更多相关文章
- Hibernate.基础篇《一》.Hibernate工具类.
Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...
- SSH框架整合中Hibernate实现Dao层常用结构
一.疑惑 一直以来,我在使用SSH框架的时候经常会发现后者有疑虑到底使用hibernate的那种方法或者如何配置hibernate来操作数据库,经过 一段时间的学习下面我来总结一下,常用的dao层配置 ...
- springMVC基础controller类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:设置请求.响应对象:session.cookie操作:ajax访问返回json数据: 创建springMVC基础con ...
- [Hibernate] - Generic Dao
使用泛型写了一个通用的Hibernate DAO类. GenericDao接口 package com.my.dao; import java.io.Serializable; import java ...
- hibernate基础(1)
hibernate基础1.hibernate介绍与动手入门体验 问题:模型不匹配(java对象模型与数据库关系模型不匹配) 解决: 1.使用JDBC手工转换 2.使用ORM(Obje ...
- 《项目架构那点儿事》——Hibernate泛型Dao,让持久层简洁起来
[前言]hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据 库.同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么 ...
- Hibernate 基础解析(Configuration,SessionFactory,Session,Transaction,Query,Criteria)
1 框架体系结构 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实 现面向对象编程语言里 ...
- mybatis的基础Dao
话不多说,直接贴代码吧,因为很多博客都需要用到这个基础dao,怕大家不好查询. 这个基类主要是使用了泛型,这样我就不必为每一个实体都写一个dao,大大节省了时间.其中sqlSessionTemplat ...
- Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1
Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...
随机推荐
- javascript判断元素存在和判断元素存在于实时的dom中的方法
今天(周六)下午我在公司加班时不知道要干什么,就打开公司的一个wordpress项目网站,想看下之前自己做的一个网页是否有问题. 打开网站首页,我习惯性的打开了chrome的调试工具,然后鼠标开始滚动 ...
- jQuery-1.9.1源码分析系列(十二) 筛选操作
在前面分析的时候也分析了部分筛选操作(详见),我们接着分析,把主要的几个分析一下. jQuery.fn.find( selector ) find接受一个参数表达式selector:选择器(字符串). ...
- Linux日志定时清理
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- 用CSS3动画特效实现弹窗效果
提示:如果大家觉得本篇实现的弹窗效果有用,可持续关注.接下会添加更多效果并且封装成插件,这样使用就方便了.效果查看: https://heavis.github.io/hidialog/index.h ...
- git学习之冲突解决办法
1.如果本地项目和远程服务器的同一文件都有改动,那么就会产生冲突,导致git pull 失败,报错见下. 解决办法:先执行git stash指令,暂存当前的改动状态,再执行git pull指令,就可以 ...
- C# 判断字符串是否是int/double
using System.Text.RegularExpressions; /// <summary> /// 判断字符串是否是int/double /// </summary> ...
- IIS事件查看器_WebServer事件查看器_帮助查看IIS-Web服务器事件执行日志
IIS服务器是我们常用的Web站点部署工具,而我们有时可能遇到IIS服务器的应用程序池莫名其妙的关闭了,或者是其他未知原因等等,我们这是可以通过微软提供的WebServer(Web服务事件查看器),来 ...
- 纯css3手机页面图标样式代码
全部图标:http://hovertree.com/texiao/css/19/ 先看效果: 或者点这里:http://hovertree.com/texiao/css/19/hoverkico.ht ...
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目 Android-Universal-Image-Loader 或者 ignition 都是个很好的选择. 在这里把原来 ...
- C#写爬虫,版本V2.0
这个版本主要是以百度图片为对象,对其进行爬虫操作,实现了最基本的下载功能,但是缺陷非常多,日后还会对其进行改进. 打开百度图片,同时打开开发者工具,我们会发现,百度图片是通过如下的一段ajax来加载图 ...