示例:实现basedao
package com.cn.base.dao.impl; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.fang.base.dao.IBaseDao; import com.fang.util.HibernateSessionFactory; import com.fang.util.Page; public abstract class BaseDaoImpl<T> implements IBaseDao<T> { private Log log = LogFactory.getLog(this.getClass()); private Class<T> entityClass; @SuppressWarnings("unchecked") public BaseDaoImpl() { //1、尝试基本的获取对象实体类对象方法 entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; /*2、或尝试这个关于代理的如果有T的实例t,创建代理后的实例proxiedT,你拿到proxiedT 后怎么 才能拿到 t? 通过代理生成的类应该是继承了被代理的类,所以getGenericSuperclass只是取到被代理类的Type。 正常应该是要取到被代理类所继承的父类的Type, 所以要先getSuperclass取到被代理类再getGenericSuperclass取到父类的Type才成*/ /*Type type = getClass().getGenericSuperclass(); if(!(type instanceof ParameterizedType)){ type = getClass().getSuperclass().getGenericSuperclass(); } entityClass = (Class<T>)((ParameterizedType)type).getActualTypeArguments()[0];*/ } public Session getSession() { return HibernateSessionFactory.getSession(); } public void closeSession(){ HibernateSessionFactory.closeSession(); } @Override public void save(T instance) { log.debug("saving "+instance+" instance"); Transaction tx = getSession().beginTransaction(); try { getSession().save(instance); tx.commit(); log.debug("save successful"); } catch (RuntimeException re) { tx.rollback(); log.error("save failed", re); throw re; } finally{ closeSession(); } } @Override public void delete(T instance) { log.debug("deleting "+instance+" instance"); Transaction tx = getSession().beginTransaction(); try { getSession().delete(instance); tx.commit(); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } finally{ closeSession(); } } @Override public void update(T instance) { log.debug("updating "+instance+" instance"); Transaction tx = getSession().beginTransaction(); try { getSession().update(instance); tx.commit(); log.debug("update successful"); } catch (RuntimeException re) { tx.rollback(); log.error("update failed", re); throw re; } finally{ closeSession(); } } @SuppressWarnings("rawtypes") @Override public Object findById(Class clazz, Integer id) { log.debug("getting "+clazz+" instance with id: " + id); try { //Hibernate.initialize(District.class); Object o = getSession().get(clazz,id); return o; } catch (RuntimeException re) { log.error("get failed", re); throw re; } finally{ closeSession(); } } @SuppressWarnings("unchecked") @Override public List<T> findAll() { log.debug("getting "+entityClass+" List All "); try { String hql = "FROM "+entityClass; Query queryObject = getSession().createQuery(hql); return queryObject.list(); } catch (RuntimeException re) { log.error("find by HQL ", re); throw re; } finally{ closeSession(); } } /** * 根据class类查询数据 * @param class */ @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public List findAll(Class clazz) { log.debug("getting "+clazz+" List All "); try { String c = clazz.toString(); String hql = "FROM "+c.substring(c.lastIndexOf(".")+1,c.length()); Query queryObject = getSession().createQuery(hql); return queryObject.list(); } catch (RuntimeException re) { log.error("find by HQL ", re); throw re; } finally{ closeSession(); } } /** * 根据对象名和对象属性查询数据 * @param className * @param propertyName * @param value * @return 实体对象列表 */ @SuppressWarnings("unchecked") public List<T> findByProperty(String className,String propertyName, Object value) { log.debug("finding "+className+" instance with property: " + propertyName + ", value: " + value); try { String hql = "FROM "+className+" as o WHERE o."+propertyName+" = ?"; Query queryObject = getSession().createQuery(hql); queryObject.setParameter(0, value); return queryObject.list(); } catch (RuntimeException re) { log.error("find by property name failed", re); throw re; } finally{ closeSession(); } } /** * 根据HQL查询数据 * @param hql * @return 实体对象列表 */ @SuppressWarnings("rawtypes") public List findByHql(String hql) { log.debug(hql); try { Query queryObject = getSession().createQuery(hql); return queryObject.list(); } catch (RuntimeException re) { log.error("find by HQL ", re); throw re; } finally{ closeSession(); } } /** * 方案一、获取分页对象,实现分页获取数据的功能 * @param hql 查询数据的HQL * @param page 需要显示数据的页码 * @param pageSize 每页数据量 * @return Object[0]当前页的数据列表List ,Object[1]总页数,Object[2]总数量 */ @SuppressWarnings("rawtypes") public Object[] findPageByHql(final String hql, String hqlCount, final int page, final int pageSize) { log.debug(hql); List list = new ArrayList(); //总记录数 Long total = new Long(0); //总页数 Integer totalPage = 0; try { //1、根据hql语句查询指定数据 Query qList = getSession().createQuery(hql); qList.setFirstResult(page * pageSize); qList.setMaxResults(pageSize); list = qList.list(); //2、根据hql语句查询总记录数 List listCount = findByHql(hqlCount); if(listCount!=null && listCount.size()>0){ total = (Long)listCount.get(0); } //3、根据总记录数计算出总页数,ceil进1 totalPage = (int) Math.ceil((double) total.longValue() / pageSize); } catch (Exception e) { e.printStackTrace(); }finally{ closeSession(); } return new Object[] { list, totalPage, total }; } /** * 方案二、通过分页对象,实现分页获取数据的功能 * @param hql 查询数据的HQL * @param page 分页对象 * @return page 分页对象 */ @SuppressWarnings({ "rawtypes", "unchecked" }) public Page findPageByHql(final String hql, String hqlCount, Page page) { log.debug(hql); try { if(page != null){ //1、根据hql语句查询指定数据 Query qList = getSession().createQuery(hql); qList.setFirstResult(page.getStartRow()); qList.setMaxResults(page.getSize()); page.setList(qList.list());//将数据集合保存到page对象 //2、根据hql语句查询总记录数 List listCount = findByHql(hqlCount); if(listCount!=null && listCount.size()>0){ page.setTotalCount(Integer.parseInt(String.valueOf(listCount.get(0))));//将总记录数保存到page对象 } } } catch (Exception e) { e.printStackTrace(); }finally{ closeSession(); } return page; } }
------------------------------
public class BaseDaoImpl<T>{ // 保存当前运行类的参数化类型中的实际的类型 private Class clazz; // 表名 private String tableName; // 构造函数: 1. 获取当前运行类的参数化类型; 2. 获取参数化类型中实际类型的定义(class) public BaseDaoImpl(){ // this 表示当前运行类 (假设是AccountDao或AdminDao) // this.getClass() 当前运行类的字节码(AccountDao.class或AdminDao.class) // this.getClass().getGenericSuperclass(); 当前运行类的父类,即为BaseDaoImpl<Account> // 其实就是“参数化类型”, ParameterizedType Type type = this.getClass().getGenericSuperclass(); // 强制转换为“参数化类型” 【BaseDaoImpl<Account>】 ParameterizedType pt = (ParameterizedType) type; // 获取参数化类型中,实际类型的定义 【new Type[]{Account.class}】 Type types[] = pt.getActualTypeArguments(); // 获取数据的第一个元素:Accout.class clazz = (Class) types[0]; // 表名 (与类名一样,只要获取类名就可以) tableName = clazz.getSimpleName(); }
相关推荐
以下是关于这个主题的详细解释。 **BaseDao接口** BaseDao是一个接口,它定义了一系列通用的数据库操作方法,如查询、保存、更新和删除。这些方法是基于Hibernate或其他ORM框架的API设计的。通过在项目中引入...
java数据库基础操作类,hibernate框架基础
更多使用示例见博客: http://blog.csdn.net/lk_blog 早期版本AHibernate1.0下载地址:http://download.csdn.net/detail/lk_blog/4222048 本版主要修改的内容: 1.修改bug,实体类的属性定义为int时自动生成Id正常,定义...
5. **添加BaseDao与BaseDaoImpl**:设计通用的数据访问接口(BaseDao)及其实现类(BaseDaoImpl),封装常用的数据库操作方法。 6. **添加单元测试**:编写单元测试代码来验证数据库连接是否正确,以及基本的CRUD...
"ExtJS+SSH+Junit的Demo" 这个标题指的是一个示例项目,它结合了三个关键技术:ExtJS(一个用于构建Web应用的JavaScript库)、SSH(Struts2、Spring和Hibernate的集成框架)以及Junit(Java单元测试框架)。...
这个工具包的核心理念是让DAO层的类可以通过继承`BaseDaoImpl`来快速实现基本的CRUD(创建、读取、更新、删除)功能,从而减少重复代码并提高开发效率。 `BaseDaoImpl`类通常会封装JDBC相关的通用方法,如连接...
例如,一个简单的`applicationContext.xml`配置片段可能如下: ```xml ``` 以上就是关于Spring JdbcTemplate的基本介绍及其在实际项目中的应用。由于这个库主要是针对Oracle数据库设计的,所以很多...
下面是一个简单的代码示例,展示了如何使用ORMLite进行基本的CRUD操作: ```java // 实体类 @DatabaseTable(tableName = "users") public class User { @DatabaseField(id = true) private int id; @Database...
接着,`BaseDaoImpl` 类实现了 `BaseDaoInf` 接口,并注入了名为 `jdbcTemplate` 的`JdbcTemplate`实例。这是通过`@Resource`注解实现的,它告诉Spring容器将名称为`jdbcTemplate`的bean注入到这个字段中。 在`...
针对S2SH框架整合的一个开发框架,包括BaseDaoImpl类的实现,包括PageBean 分页类,也包括Hibernate查询类QueryHelper,和前台的分页。是一个很不错的例子。 包括整合jar包。
关于外键的使用,ORMLite支持外键约束,上面的`User`类中`address`字段就是外键的例子。这样,当我们操作`User`对象时,可以同时处理与之关联的`Address`对象。 这个案例涵盖了ORMLite的基本用法,包括实体类定义、...
在BaseDAOImpl类中,countAll方法通过HibernateTemplate执行HQL语句,统计指定类的所有持久化对象。其他方法的实现方式相似,都是通过HibernateTemplate执行HQL语句或sql语句来实现数据访问操作。 BaseDAO提供了...
在示例中,`DBTest` 类可能是用于测试数据库连接的类。创建此类时,需要编写SQL连接语句,导入相应的JDBC驱动,例如`mysql-connector-java.jar`,并使用`Class.forName()`加载驱动,`Connection`对象建立连接,`...
创建`BaseDAOImpl`类,继承自`HibernateDaoSupport`,并实现一个基础DAO接口`BaseDAO`。`BaseDAOImpl`提供了基本的CRUD操作,利用`HibernateTemplate`简化了Hibernate的操作。 ```java public class BaseDAOImpl ...
在实际开发中,我们通常会创建一个BaseDao接口和BaseDaoImpl实现类,包含基本的CRUD操作。例如: ```java public interface BaseDao<T> { void save(T entity); void deleteById(Object id); T findById(Object ...
在这个类中,`baseDaoImpl`被用来执行数据库查询。 3. **时间处理**: 类中使用了`Calendar`类来获取当前日期和时间,并进行一些时间相关的计算。例如,`nowDay`和`nowMonth`分别获取了当前的日期和月份。 4. **...
1.BaseDaoImpl.java 基础数据类 2.PageRequest.java 分页映射类 3.QueryCondition.java 多条件查询映射类 4.PageResponse.java 分页返回值类,包括下一页、上一页等属性。 5.QueryList.java 查询条件返回值类,包括...
- `BaseDao` 和 `BaseDaoImpl`:这两个类是数据访问层的基础,`BaseDao` 定义了通用的数据操作接口,而 `BaseDaoImpl` 是其实现类,通常包含与数据库交互的方法,如CRUD操作。 - `BaseServlet`:这是一个基础的...
文章通过具体的代码示例,呈现了JSP页面的构建方式、JavaScript中Ajax调用的使用方法以及Java后端的业务逻辑处理过程。这些知识点和技巧对于希望学习Web开发的读者具有很好的参考价值。 需要注意的是,文档内容中有...