具体不说了,看上一篇。
开发框架spring4.2.9-springmvc-hibernate4.3.11Final,需要包的可以在我的资源里找。
由于这些类都要封装进dao基类中,所以就不交给spring管理了,注解都去掉。
方便大家参考依赖,保留import,看别人的代码不贴上依赖,那么多同名的包,谁知道要用哪个。
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import …….util.localcache.LocalCacheUtil;
/**
* 主键生成基类
* @author 疯狂的蚯蚓
*
*/
public class IdGenerator
{
/**
* AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。
*/
protected AtomicInteger value;
protected String time;
/**
* 读写锁
*/
protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public String getSplitString()
{
return "";
}
public int getInitial()
{
return 0;
}
public String getPrefix()
{
String result = null;
try
{
//查询服务器的配置文件
result = (String)LocalCacheUtil.query(PropertiesFileIOUtil.MECHINE_CODE_KEY);
if(result==null)
{
Map<String, String> map = PropertiesFileIOUtil.loadProps();
if(map==null || !map.containsKey(PropertiesFileIOUtil.MECHINE_CODE_KEY))
{
return "";
}
//服务器号
result = map.get(PropertiesFileIOUtil.MECHINE_CODE_KEY);
//加入本地缓存
LocalCacheUtil.put(PropertiesFileIOUtil.MECHINE_CODE_KEY, result);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException("获取主键前缀失败");
}
return result;
}
public int getRollingInterval()
{
return 1;
}
}
/**
* Id生成器配置接口
* @author 疯狂的蚯蚓
*
*/
public interface IdGeneratorConfig {
/**
* 获取分隔符
* @return
*/
String getSplitString();
/**
* 获取初始值
* @return
*/
int getInitial();
/**
* 获取ID前缀
* @return
*/
String getPrefix();
/**
* 获取滚动间隔, 单位: 秒
* @return
*/
int getRollingInterval();
}
import java.util.Map;
import …….util.localcache.LocalCacheUtil;
/**
* 主键生成配置实现类
* @author 疯狂的蚯蚓
*
*/
public class DefaultIdGeneratorConfig implements IdGeneratorConfig
{
@Override
public String getSplitString()
{
return "";
}
@Override
public int getInitial()
{
return 1;
}
@Override
public String getPrefix()
{
String result = null;
try
{
//查询服务器的配置文件
result = (String)LocalCacheUtil.query(PropertiesFileIOUtil.MECHINE_CODE_KEY);
if(result==null)
{
Map<String, String> map = PropertiesFileIOUtil.loadProps();
if(map==null || !map.containsKey(PropertiesFileIOUtil.MECHINE_CODE_KEY))
{
return "";
}
//服务器号
result = map.get(PropertiesFileIOUtil.MECHINE_CODE_KEY);
//加入本地缓存
LocalCacheUtil.put(PropertiesFileIOUtil.MECHINE_CODE_KEY, result);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException("获取主键前缀失败");
}
return result;
}
@Override
public int getRollingInterval()
{
return 1;
}
}
缓存啥的就自己去研究了,很简单,没几行代码,以下是配置文件的读取,当然其他方法都行,不一定要存文件
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 读取配置文件工具类
* @author 疯狂的蚯蚓
*
*/
public class PropertiesFileIOUtil
{
/**
* 机器号代码
*/
public static final String MECHINE_CODE_KEY = "MechineCode";
public static Properties props;
public static Map<String, String> loadProps()
{
Map<String, String> result = new HashMap<String, String>();
props = new Properties();
InputStream in = null;
try
{
//第一种,通过类加载器进行获取properties文件流
//in = PropertyUtil.class.getClassLoader().getResourceAsStream("sysConfig.properties");
//第二种,通过类进行获取properties文件流
in = PropertiesFileIOUtil.class.getClassLoader().getResourceAsStream("config/mechineCode.properties");
props.load(in);
String mechineCode = props.getProperty(MECHINE_CODE_KEY);
// System.out.println("mechineCode="+mechineCode);
result.put(MECHINE_CODE_KEY, mechineCode);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
//logger.error("sysConfig.properties文件未找到");
}
catch (IOException e)
{
e.printStackTrace();
//logger.error("出现IOException");
}
finally
{
try
{
if(null != in)
{
in.close();
}
}
catch (IOException e)
{
//logger.error("sysConfig.properties文件流关闭出现异常");
}
}
//logger.info("加载properties文件内容完成...........");
//logger.info("properties文件内容:" + props);
return result;
}
public String getProperty(String key)
{
if(null == props)
{
loadProps();
}
return props.getProperty(key);
}
public String getProperty(String key, String defaultValue)
{
if(null == props)
{
loadProps();
}
return props.getProperty(key, defaultValue);
}
}
以下是dao基类接口
import java.io.Serializable;
import java.util.List;
import …….vo.ComboBox;
import …….vo.Pagination;
/**
* 通用Dao接口
*
* @param <T> 实体对象类
* @param <PK> 主键
*/
public interface GenericDao<T, PK extends Serializable> {
/**
* 根据主键获得一个实体对象
*
* @param id
* @return
*/
public T findById(PK id);
/**
* 获得表中的所有实体对象
*
* @return
*/
public List<T> findAll();
/**
* 新增一个实体对象
*
* @param entity
* @return
*/
public T save(T entity);
/**
* 更新一个实体对象
*
* @param entity
*/
public void update(T entity);
/**
* 删除一个实体对象
*
* @param entity
*/
public void delete(T entity);
/**
* 根据HQL语句和查询条件,获得具体数量
*
* @param hql 不需要也不能写select count(*),直接从from开始写
* @param params
* @return
*/
public Long countByHQL(String hql, Object[] params);
/**
* 根据HQL语句和查询条件,获得一个实体对象
*
* @param hql
* @param params
* @return
*/
public T getEntityByHQL(String hql, Object[] params);
/**
* 根据HQL语句和查询条件,获得多个实体对象
*
* @param hql
* @param params
* @return
*/
public List<T> listEntityByHQL(String hql, Object[] params);
/**
* 根据HQL语句和查询条件,获得多个实体对象,分页显示,可排序
*
* @param hql
* 必须是查询整个model类的信息,不能只查询部分字段 正确写法:from 类名 where 条件 order by
* 错误写法:select 表名(字段名) from 类名 where 条件
* @param params
* @param pageSize
* 每页显示记录数
* @param pageNumber
* 当前第几页
* @return
*/
public Pagination listEntityByHQL(String hql, Object[] params,Integer pageSize, Integer pageNumber);
public Pagination listEntityByHQL1(String hql, Object[] params,
Integer pageSize, Integer pageNumber);
public Pagination listEntityByHQLbox(String hql, Object[] params,
Integer pageSize, Integer pageNumber);
/**
* 根据SQL语句和查询条件,获得多个实体对象,分页显示,可排序
*
* @param sql
* @param params
* @param pageSize
* 每页显示记录数
* @param pageNumber
* 当前第几页
* @return
*/
public Pagination listEntityBySQL(String sql, Object[] params,Integer pageSize, Integer pageNumber);
/**
* 执行删除或者更新的HQL语句
*
* @param hql
* @param params
* @return
*/
public Integer updateByHQL(String hql, Object[] params);
/**
* 执行删除或者更新的SQL语句
*
* @param sql
* @param params
* @return
*/
public Integer updateBySQL(String sql, Object[] params);
/**
* 根据任意的select语句,获得对应列的对象数组
* @param hql
* @param params
* @return
*/
public List<Object[]> listEntityBySelect(String hql, Object[] params);
/**
* 根据HQL语句和查询条件,获得实体对象中一个字段的所有值的集合
* @param hql
* @param params
* @return easyui-combobox格式的vo类
*/
public List<ComboBox> listFieldByHQL(String hql, Object[] params);
/**
* 通过sql语句,查询结果映射成实体
* @param sql
* @param c 结果要映射的实体对象
* @return
*/
@SuppressWarnings("rawtypes")
List listEntityBySql(String sql,Class c);
/**
* 获取下一个主键,默认是从1开始递增,如果有特殊需求需要在dao实现中重写该方法
* @return
*/
public String next();
}
主键生成方法在该类的最底部,还有不完善的大家直接去修修补补,优化提升import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.HibernateTemplate;
import …….dao.GenericDao;
import …….idgenerator.IdGenerator;
import …….vo.ComboBox;
import …….vo.Pagination;
public class GenericDaoHibernate<T, PK extends Serializable> extends IdGenerator
implements GenericDao<T, PK> ,Runnable
{
private final Class<T> clazz;
protected HibernateTemplate hibernateTemplate;
@SuppressWarnings("unchecked")
public GenericDaoHibernate() {
clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
value = new AtomicInteger(getInitial());
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource()
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
@Override
public T findById(PK id) {
return this.hibernateTemplate.get(clazz, id);
}
@SuppressWarnings("unchecked")
@Override
public List<T> findAll() {
return (List<T>) this.hibernateTemplate.find("from " + clazz.getName());
}
@Override
public T save(T entity) {
this.hibernateTemplate.persist(entity);
return entity;
}
@Override
public void update(T entity) {
this.hibernateTemplate.merge(entity);
}
@Override
public void delete(T entity) {
this.hibernateTemplate.delete(entity);
}
/**
* 根据HQL语句和查询条件,获得一个对象
* 例:分页时查询出总的记录数
*
* @param hql
* @param params
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private Object queryObjectByHQL(final String hql, final Object[] params) {
Object obj = this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return query.uniqueResult();
}
});
return obj;
}
/**
* 根据SQL语句和查询条件,获得一个对象
* 例:分页时查询出总的记录数
*
* @param hql
* @param params
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private Object queryObjectBySQL(final String sql, final Object[] params) {
Object obj = this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createSQLQuery(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return query.uniqueResult();
}
});
return obj;
}
@Override
public Long countByHQL(String hql, Object[] params) {
// 拼接成新的hql字符串,用于查询总共多少条数据, 如果有order by要截取掉,因为有的数据库不支持
String nhql = "select count(*) " + hql.split(" order by")[0];
return (Long) this.queryObjectByHQL(nhql, params); // 获得总的记录数
}
public Long countBySQL(String sql, Object[] params) {
// 拼接成新的hql字符串,用于查询总共多少条数据, 如果有order by要截取掉,因为有的数据库不支持
String nhql = "select count(*) from (" + sql.split(" order by")[0] + ")";
/*
* 获得总的记录数
* Hibernate 执行SQL语句的count函数返回类型
* oracle :BigDecimal
* db2 : Integer
*/
Object obj = this.queryObjectBySQL(nhql, params);
String objName = obj.getClass().getName();
if("java.math.BigDecimal".equals(objName)) {
BigDecimal bq = (BigDecimal) obj;
return bq.longValue();
}else if("java.lang.Integer".equals(objName)){
Integer bq = (Integer) this.queryObjectBySQL(nhql, params);
return bq.longValue();
}else {
return 0L;
}
}
@Override
public T getEntityByHQL(String hql, Object[] params)
{
@SuppressWarnings("unchecked")
List<T> list = (List<T>) this.hibernateTemplate.find(hql, params);
if (list != null && list.size() > 0)
{
return list.get(0);
}
else
{
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<T> listEntityByHQL(String hql, Object[] params)
{
return (List<T>) this.hibernateTemplate.find(hql, params);
}
/**
* 分页查询
*
* @param hql
* @param params
* @param pageSize
* @param pageNumber
* @param totalCount
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private Pagination getPaginationByHQL(final String hql, final Object[] params, final Integer pageSize,
final Integer pageNumber, final Long totalCount) {
return (Pagination) this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Pagination pagination = new Pagination(pageSize, pageNumber, totalCount);
Query query = session.createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
query.setFirstResult(pageSize * (pageNumber - 1));
query.setMaxResults(pageSize);
pagination.setList(query.list());
return pagination;
}
});
}
/**
* 分页查询
*
* @param sql
* @param params
* @param pageSize
* @param pageNumber
* @param totalCount
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private Pagination getPaginationBySQL(final String sql, final Object[] params, final Integer pageSize,
final Integer pageNumber, final Long totalCount) {
return (Pagination) this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Pagination pagination = new Pagination(pageSize, pageNumber, totalCount);
Query query = session.createSQLQuery(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
query.setFirstResult(pageSize * (pageNumber - 1));
query.setMaxResults(pageSize);
pagination.setList(query.list());
return pagination;
}
});
}
@Override
public Pagination listEntityByHQL(String hql, Object[] params, Integer pageSize, Integer pageNumber) {
long totalCount = this.countByHQL(hql, params);
return this.getPaginationByHQL(hql, params, pageSize, pageNumber, totalCount);
}
@Override
public Pagination listEntityBySQL(String hql, Object[] params, Integer pageSize, Integer pageNumber) {
long totalCount = this.countBySQL(hql, params);
return this.getPaginationBySQL(hql, params, pageSize, pageNumber, totalCount);
}
@Override
public Pagination listEntityByHQL1(String hql, Object[] params, Integer pageSize, Integer pageNumber) {
String nhql = "select count(*) from (select distinct ij.docserialnum,ir.docname,ir.scanuser,ir.orgcode,ir.cartonno,ir.boxno,to_char(ir.scantime, 'yyyy-mm-dd hh24:mi:ss'),count(ir.docname) " + hql.substring((hql.split("from")[0].length()-1)<0?0:(hql.split("from")[0].length()-1), hql.length()-1).split(" order by")[0]+")";
Integer totalCount = Integer.parseInt(this.queryObject1(nhql, params).toString());
return this.getPagination1(hql, params, pageSize, pageNumber, totalCount);
}
@Override
public Pagination listEntityByHQLbox(String hql, Object[] params, Integer pageSize, Integer pageNumber) {
String nhql = "select count(*) from (select distinct ij.docserialnum,to_char(ij.creationtime, 'yyyy-mm-dd hh24:mi:ss'),ij.maindocname,ir.scanuser,ir.orgcode,ir.cartonno,ir.boxno,count(ir.docname) " + hql.substring((hql.split("from")[0].length()-1)<0?0:(hql.split("from")[0].length()-1), hql.length()-1).split(" order by")[0]+")";
Integer totalCount = Integer.parseInt(this.queryObject1(nhql, params).toString());
return this.getPagination1(hql, params, pageSize, pageNumber, totalCount);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object queryObject1(final String hql, final Object[] params) {
Object obj = this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createSQLQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return query.uniqueResult();
}
});
return obj;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Pagination getPagination1(final String hql, final Object[] params, final Integer pageSize, final Integer pageNumber, final Integer totalCount) {
return (Pagination) this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Pagination pagination = new Pagination(pageSize, pageNumber, totalCount);
Query query = session.createSQLQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
query.setFirstResult(pageSize * (pageNumber - 1));
query.setMaxResults(pageSize);
pagination.setList(query.list());
return pagination;
}
});
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private Integer updateEntity(final String hql, final Object[] params) {
Integer i = (Integer) this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
Integer count = query.executeUpdate();
return count;
}
});
return i;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private Integer updateEntityBySQL(final String sql, final Object[] params) {
Integer i = (Integer) this.hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createSQLQuery(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
Integer count = query.executeUpdate();
return count;
}
});
return i;
}
@Override
public Integer updateByHQL(String hql, Object[] params) {
return updateEntity(hql, params);
}
@Override
public Integer updateBySQL(String sql, Object[] params) {
return updateEntityBySQL(sql, params);
}
@SuppressWarnings("unchecked")
@Override
public List<Object[]> listEntityBySelect(String hql, Object[] params) {
return (List<Object[]>) this.hibernateTemplate.find(hql, params);
}
@Override
public List<ComboBox> listFieldByHQL(String hql, Object[] params) {
@SuppressWarnings("unchecked")
List<String> objects = (List<String>) hibernateTemplate.find(hql, params);
List<ComboBox> lists = new ArrayList<ComboBox>();
for (String obj: objects) {
ComboBox cb = new ComboBox();
cb.setText(obj);
cb.setValue(obj);
lists.add(cb);
}
return lists;
}
@SuppressWarnings("rawtypes")
@Override
public List listEntityBySql(String sql, Class c) {
SQLQuery query=hibernateTemplate.getSessionFactory().getCurrentSession().createSQLQuery(sql).addEntity(c);
return query.list();
}
@Override
public void run()
{
while (true)
{
try
{
Thread.sleep(1000 * getRollingInterval());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
String now = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
if (!now.equals(time)){
lock.writeLock().lock();
time = now;
value.set(getInitial());
lock.writeLock().unlock();
}
}
}
@Override
public String next()
{
lock.readLock().lock();
int index = value.getAndIncrement();
if(index==999999999)
{
value.set(0);
}
String num = String.valueOf(index);
time = String.valueOf(System.currentTimeMillis());
StringBuilder number = new StringBuilder();
int maxLength = 9;
if(num.length()<maxLength)
{
for(int i=0;i<(maxLength-num.length());i++)
{
number.append("0");
}
}
number.append(num);
StringBuffer sb = new StringBuffer(getPrefix()).append(getSplitString()).append(time).append(getSplitString()).append(number.toString());
lock.readLock().unlock();
return sb.toString();
}
}
每个dao大体情况:
@Repository("XXXDao")
public class XXXDaoHibernate extends GenericDaoHibernate<XXX(这个是实体), String> implements
XXXDao {
//这里有需要就重写next(),没需要直接在service层用XXXDao.next()调用拿到主键
}