hibernate4 baseDao的封装
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate4 baseDao的封装相关的知识,希望对你有一定的参考价值。
1.BaseDao.java 基础类接口
package
com.itv.launcher.util;
import
java.io.Serializable;
import
java.util.Collection;
import
java.util.List;
/**
* @ClassName: IBaseDao
* @Description: Dao封装接口
* @author yz
* @date 2014年6月16日17:05:17
*/
public
interface
IBaseDao<T, ID
extends
Serializable> {
/**
* <保存实体>
* <完整保存实体>
* @param t 实体参数
*/
public
abstract
void
save(T t);
/**
* <保存或者更新实体>
* @param t 实体
*/
public
abstract
void
saveOrUpdate(T t);
/**
* <load>
* <加载实体的load方法>
* @param id 实体的id
* @return 查询出来的实体
*/
public
abstract
T load(ID id);
/**
* <get>
* <查找的get方法>
* @param id 实体的id
* @return 查询出来的实体
*/
public
abstract
T get(ID id);
/**
* <contains>
* @param t 实体
* @return 是否包含
*/
public
abstract
boolean
contains(T t);
/**
* <delete>
* <删除表中的t数据>
* @param t 实体
*/
public
abstract
void
delete(T t);
/**
* <根据ID删除数据>
* @param Id 实体id
* @return 是否删除成功
*/
public
abstract
boolean
deleteById(ID Id);
/**
* <删除所有>
* @param entities 实体的Collection集合
*/
public
abstract
void
deleteAll(Collection<T> entities);
/**
* <执行Hql语句>
* @param hqlString hql
* @param values 不定参数数组
*/
public
abstract
void
queryHql(String hqlString, Object... values);
/**
* <执行Sql语句>
* @param sqlString sql
* @param values 不定参数数组
*/
public
abstract
void
querySql(String sqlString, Object... values);
/**
* <根据HQL语句查找唯一实体>
* @param hqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询实体
*/
public
abstract
T getByHQL(String hqlString, Object... values);
/**
* <根据SQL语句查找唯一实体>
* @param sqlString SQL语句
* @param values 不定参数的Object数组
* @return 查询实体
*/
public
abstract
T getBySQL(String sqlString, Object... values);
/**
* <根据HQL语句,得到对应的list>
* @param hqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询多个实体的List集合
*/
public
abstract
List<T> getListByHQL(String hqlString, Object... values);
/**
* <根据SQL语句,得到对应的list>
* @param sqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询多个实体的List集合
*/
public
abstract
List<T> getListBySQL(String sqlString, Object... values);
/**
* 由sql语句得到List
* @param sql
* @param map
* @param values
* @return List
*/
public
List findListBySql(
final
String sql,
final
RowMapper map,
final
Object... values);
/**
* <refresh>
* @param t 实体
*/
public
abstract
void
refresh(T t);
/**
* <update>
* @param t 实体
*/
public
abstract
void
update(T t);
/**
* <根据HQL得到记录数>
* @param hql HQL语句
* @param values 不定参数的Object数组
* @return 记录总数
*/
public
abstract
Long countByHql(String hql, Object... values);
/**
* <HQL分页查询>
* @param hql HQL语句
* @param countHql 查询记录条数的HQL语句
* @param pageNo 下一页
* @param pageSize 一页总条数
* @param values 不定Object数组参数
* @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
*/
public
abstract
PageResults<T> findPageByFetchedHql(String hql, String countHql,
int
pageNo,
int
pageSize, Object... values);
}
2.BaseDao.java 基础实现类
package
com.itv.launcher.util;
import
java.io.Serializable;
import
java.lang.reflect.ParameterizedType;
import
java.math.BigDecimal;
import
java.sql.Connection;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.sql.Timestamp;
import
java.sql.Types;
import
java.util.ArrayList;
import
java.util.Collection;
import
java.util.Date;
import
java.util.List;
import
org.hibernate.Query;
import
org.hibernate.ScrollableResults;
import
org.hibernate.Session;
import
org.hibernate.SessionFactory;
import
org.hibernate.jdbc.Work;
import
org.springframework.beans.factory.annotation.Autowired;
/**
* @ClassName: BaseDao
* @Description: baseDao实现
* @author yz
* @date 2014年6月16日17:09:52
*
*/
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
public
class
BaseDao<T, ID
extends
Serializable>
implements
IBaseDao<T, ID> {
@Autowired
private
SessionFactory sessionFactory;
protected
Class<T> entityClass;
public
BaseDao() {
}
protected
Class getEntityClass() {
if
(entityClass ==
null
) {
entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[
0
];
}
return
entityClass;
}
/**
* <保存实体>
* <完整保存实体>
* @param t 实体参数
* @see com.itv.launcher.util.IBaseDao#save(java.lang.Object)
*/
@Override
public
void
save(T t) {
this
.getSession().save(t);
}
/**
* <保存或者更新实体>
* @param t 实体
* @see com.itv.launcher.util.IBaseDao#saveOrUpdate(java.lang.Object)
*/
@Override
public
void
saveOrUpdate(T t) {
this
.getSession().saveOrUpdate(t);
}
/**
* <load>
* <加载实体的load方法>
* @param id 实体的id
* @return 查询出来的实体
* @see com.itv.launcher.util.IBaseDao#load(java.io.Serializable)
*/
@Override
public
T load(ID id) {
T load = (T)
this
.getSession().load(getEntityClass(), id);
return
load;
}
/**
* <get>
* <查找的get方法>
* @param id 实体的id
* @return 查询出来的实体
* @see com.itv.launcher.util.IBaseDao#get(java.io.Serializable)
*/
@Override
public
T get(ID id) {
T load = (T)
this
.getSession().get(getEntityClass(), id);
return
load;
}
/**
* <contains>
* @param t 实体
* @return 是否包含
* @see com.itv.launcher.util.IBaseDao#contains(java.lang.Object)
*/
@Override
public
boolean
contains(T t) {
return
this
.getSession().contains(t);
}
/**
* <delete>
* <删除表中的t数据>
* @param t 实体
* @see com.itv.launcher.util.IBaseDao#delete(java.lang.Object)
*/
@Override
public
void
delete(T t) {
this
.getSession().delete(t);
}
/**
* <根据ID删除数据>
* @param Id 实体id
* @return 是否删除成功
* @see com.itv.launcher.util.IBaseDao#deleteById(java.io.Serializable)
*/
@Override
public
boolean
deleteById(ID Id) {
T t = get(Id);
if
(t ==
null
){
return
false
;
}
delete(t);
return
true
;
}
/**
* <删除所有>
* @param entities 实体的Collection集合
* @see com.itv.launcher.util.IBaseDao#deleteAll(java.util.Collection)
*/
@Override
public
void
deleteAll(Collection<T> entities) {
for
(Object entity : entities) {
this
.getSession().delete(entity);
}
}
/**
* <执行Hql语句>
* @param hqlString hql
* @param values 不定参数数组
* @see com.itv.launcher.util.IBaseDao#queryHql(java.lang.String, java.lang.Object[])
*/
@Override
public
void
queryHql(String hqlString, Object... values) {
Query query =
this
.getSession().createQuery(hqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <执行Sql语句>
* @param sqlString sql
* @param values 不定参数数组
* @see com.itv.launcher.util.IBaseDao#querySql(java.lang.String, java.lang.Object[])
*/
@Override
public
void
querySql(String sqlString, Object... values) {
Query query =
this
.getSession().createSQLQuery(sqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <根据HQL语句查找唯一实体>
* @param hqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询实体
* @see com.itv.launcher.util.IBaseDao#getByHQL(java.lang.String, java.lang.Object[])
*/
@Override
public
T getByHQL(String hqlString, Object... values) {
Query query =
this
.getSession().createQuery(hqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return
(T) query.uniqueResult();
}
/**
* <根据SQL语句查找唯一实体>
* @param sqlString SQL语句
* @param values 不定参数的Object数组
* @return 查询实体
* @see com.itv.launcher.util.IBaseDao#getBySQL(java.lang.String, java.lang.Object[])
*/
@Override
public
T getBySQL(String sqlString, Object... values) {
Query query =
this
.getSession().createSQLQuery(sqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return
(T) query.uniqueResult();
}
/**
* <根据HQL语句,得到对应的list>
* @param hqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询多个实体的List集合
* @see com.itv.launcher.util.IBaseDao#getListByHQL(java.lang.String, java.lang.Object[])
*/
@Override
public
List<T> getListByHQL(String hqlString, Object... values) {
Query query =
this
.getSession().createQuery(hqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return
query.list();
}
/**
* <根据SQL语句,得到对应的list>
* @param sqlString HQL语句
* @param values 不定参数的Object数组
* @return 查询多个实体的List集合
* @see com.itv.launcher.util.IBaseDao#getListBySQL(java.lang.String, java.lang.Object[])
*/
@Override
public
List<T> getListBySQL(String sqlString, Object... values ) {
Query query =
this
.getSession().createSQLQuery(sqlString);
if
(values !=
null
)
{
for
(
int
i =
0
; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return
query.list();
}
/**
* 由sql语句得到List
* @param sql
* @param map
* @param values
* @return List
* @see com.itv.launcher.util.IBaseDao#findListBySql(java.lang.String, com.itv.launcher.util.RowMapper, java.lang.Object[])
*/
@Override
public
List findListBySql(
final
String sql,
final
RowMapper map,
final
Object... values) {
final
List list =
new
ArrayList();
// 执行JDBC的数据批量保存
Work jdbcWork =
new
Work()
{
public
void
execute(Connection connection)
throws
SQLException
{
PreparedStatement ps =
null
;
ResultSet rs =
null
;
try
{
ps = connection.prepareStatement(sql);
for
(
int
i =
0
; i < values.length; i++)
{
setParameter(ps, i, values[i]);
}
rs = ps.executeQuery();
int
index =
0
;
while
(rs.next())
{
Object obj = map.mapRow(rs, index++);
list.add(obj);
}
}
finally
{
if
(rs !=
null
)
{
rs.close();
}
if
(ps !=
null
)
{
ps.close();
}
}
}
};
this
.getSession().doWork(jdbcWork);
return
list;
}
/**
* <refresh>
* @param t 实体
* @see com.itv.launcher.util.IBaseDao#refresh(java.lang.Object)
*/
@Override
public
void
refresh(T t) {
this
.getSession().refresh(t);
}
/**
* <update>
* @param t 实体
* @see com.itv.launcher.util.IBaseDao#update(java.lang.Object)
*/
@Override
public
void
update(T t) {
this
.getSession().update(t);
}
/**
* <根据HQL得到记录数>
* @param hql HQL语句
* @param values 不定参数的Object数组
* @return 记录总数
* @see com.itv.launcher.util.IBaseDao#countByHql(java.lang.String, java.lang.Object[])
*/
@Override
public
Long countByHql(String hql, Object... values) {
Query query =
this
.getSession().createQuery(hql);
if
(values !=
null
){
for
(
int
i =
0
; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return
(Long) query.uniqueResult();
}
/**
* <HQL分页查询>
* @param hql HQL语句
* @param countHql 查询记录条数的HQL语句
* @param pageNo 下一页
* @param pageSize 一页总条数
* @param values 不定Object数组参数
* @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
* @see com.itv.launcher.util.IBaseDao#findPageByFetchedHql(java.lang.String, java.lang.String, int, int, java.lang.Object[])
*/
@Override
public
PageResults<T> findPageByFetchedHql(String hql, String countHql,
int
pageNo,
int
pageSize, Object... values) {
PageResults<T> retValue =
new
PageResults<T>();
Query query =
this
.getSession().createQuery(hql);
if
(values !=
null
){
for
(
int
i =
0
; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
int
currentPage = pageNo >
1
? pageNo :
1
;
retValue.setCurrentPage(currentPage);
retValue.setPageSize(pageSize);
if
(countHql ==
null
)
{
ScrollableResults results = query.scroll();
results.last();
retValue.setTotalCount(results.getRowNumber() +
1
);
// 设置总记录数
}
else
{
Long count = countByHql(countHql, values);
retValue.setTotalCount(count.intValue());
}
retValue.resetPageNo();
List<T> itemList = query.setFirstResult((currentPage -
1
) * pageSize).setMaxResults(pageSize).list();
if
(itemList ==
null
)
{
itemList =
new
ArrayList<T>();
}
retValue.setResults(itemList);
return
retValue;
}
/**
* @return the sessionFactory
*/
public
SessionFactory getSessionFactory() {
return
sessionFactory;
}
/**
* @param sessionFactory the sessionFactory to set
*/
public
void
setSessionFactory(SessionFactory sessionFactory) {
this
.sessionFactory = sessionFactory;
}
/**
*
* @return session
*/
public
Session getSession() {
//需要开启事物,才能得到CurrentSession
return
sessionFactory.getCurrentSession();
}
/**
*
* 设置每行批处理参数
*
* @param ps
* @param pos ?占位符索引,从0开始
* @param data
* @throws SQLException
* @see [类、类#方法、类#成员]
*/
private
void
setParameter(PreparedStatement ps,
int
pos, Object data)
throws
SQLException
{
if
(data ==
null
)
{
ps.setNull(pos +
1
, Types.VARCHAR);
return
;
}
Class dataCls = data.getClass();
if
(String.
class
.equals(dataCls))
{
ps.setString(pos +
1
, (String)data);
}
else
if
(
boolean
.
class
.equals(dataCls))
{
ps.setBoolean(pos +
1
, ((Boolean)data));
}
else
if
(
int
.
class
.equals(dataCls))
{
ps.setInt(pos +
1
, (Integer)data);
}
else
if
(
double
.
class
.equals(dataCls))
{
ps.setDouble(pos +
1
, (Double)data);
}
else
if
(Date.
class
.equals(dataCls))
{
Date val = (Date)data;
ps.setTimestamp(pos +
1
,
new
Timestamp(val.getTime()));
}
else
if
(BigDecimal.
class
.equals(dataCls))
{
ps.setBigDecimal(pos +
1
, (BigDecimal)data);
}
else
{
// 未知类型
ps.setObject(pos +
1
, data);
}
}}
3.PageResults.java
package
com.itv.launcher.util;
import
java.util.List;
/**
* 分页封装类
* 用于做分页查询的基础类,封装了一些分页的相关属性
* @author 闫洲
* @version v1.0
* @param <T>
*/
public
class
PageResults<T> {
// 下一页
private
int
pageNo;
// 当前页
private
int
currentPage;
// 每页个个数
private
int
pageSize;
// 总条数
private
int
totalCount;
// 总页数
private
int
pageCount;
// 记录
private
List<T> results;
public
int
getPageCount() {
return
pageCount;
}
public
void
setPageCount(
int
pageCount) {
this
.pageCount = pageCount;
}
public
int
getPageNo() {
if
(pageNo <=
0
) {
return
1
;
}
else
{
return
pageNo > pageCount ? pageCount : pageNo;
}
}
public
void
setPageNo(
int
pageNo) {
this
.pageNo = pageNo;
}
public
List<T> getResults() {
return
results;
}
public
void
setResults(List<T> results) {
this
.results = results;
}
public
int
getCurrentPage() {
return
currentPage;
}
public
void
setCurrentPage(
int
currentPage) {
this
.currentPage = currentPage;
}
public
int
getPageSize() {
return
pageSize;
}
public
void
setPageSize(
int
pageSize) {
this
.pageSize = pageSize <=
0
?
10
: pageSize;
}
public
int
getTotalCount() {
return
totalCount;
}
public
void
setTotalCount(
int
totalCount) {
this
.totalCount = totalCount;
}
public
void
resetPageNo() {
pageNo = currentPage +
1
;
pageCount = totalCount % pageSize ==
0
? totalCount / pageSize
: totalCount / pageSize +
1
;
}
}
4.RowMapper.java
package
com.itv.launcher.util;
import
java.sql.ResultSet;
import
java.sql.SQLException;
/**
* RowMapper
* @author yanzhou
* @version v1.0
*/
public
interface
RowMapper
{
public
Object mapRow(ResultSet rs,
int
index)
throws
SQLException;
}
以上是关于hibernate4 baseDao的封装的主要内容,如果未能解决你的问题,请参考以下文章
SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
JAVAEE——SSH项目实战02:客户列表和BaseDao封装