/** * 泛型通用dao实现 依赖于spring jdbc */ public abstract class GenericDao<T> implements BaseDao<T> { /** 具体操作的实体类对象 */ private Class<T> entityClass; /** 名称加工处理器 */ private NameHandler nameHandler; /** spring jdbcTemplate 对象 */ @Autowired protected JdbcTemplate jdbcTemplate; /** * 构造方法,获取运行时的具体实体对象 */ public GenericDao() { Type superclass = getClass().getGenericSuperclass(); ParameterizedType type = (ParameterizedType) superclass; entityClass = (Class<T>) type.getActualTypeArguments()[0]; } /** * 获取实际运行时的名称处理器 * * @return */ private NameHandler getActualNameHandler() { if (nameHandler == null) { synchronized (this) { if (nameHandler == null) { nameHandler = this.getNameHandler(); } } } return nameHandler; } /** * 得到名称处理器,子类覆盖此方法实现自己的名称转换处理器 * * @return */ protected NameHandler getNameHandler() { return new DefaultNameHandler(); } /** * 插入一条记录 * * @param entity */ @Override public synchronized Long insert(T entity) { final SqlContext sqlContext = SqlUtils.buildInsertSql(entity, this.getActualNameHandler()); KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement(sqlContext.getSql().toString(), new String[] { sqlContext.getPrimaryKey() }); int index = 0; for (Object param : sqlContext.getParams()) { index++; ps.setObject(index, param); } return ps; } }, keyHolder); return keyHolder.getKey().longValue(); } /** * 更新记录 * * @param entity */ @Override public void update(T entity) { SqlContext sqlContext = SqlUtils.buildUpdateSql(entity, this.getActualNameHandler()); jdbcTemplate.update(sqlContext.getSql().toString(), sqlContext.getParams().toArray()); } /** * 删除记录 * * @param id */ @Override public void delete(Serializable id) { String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName()); String primaryName = this.getNameHandler().getPrimaryName(entityClass.getSimpleName()); String sql = "DELETE FROM " + tableName + " WHERE " + primaryName + " = ?"; jdbcTemplate.update(sql, id); } /** * 删除所有记录 */ @Override public void deleteAll() { String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName()); String sql = " TRUNCATE TABLE " + tableName; jdbcTemplate.execute(sql); } /** * 得到记录 * * @param id * @return */ @Override public T getById(Serializable id) { String tableName = this.getNameHandler().getTableName(entityClass.getSimpleName()); String primaryName = this.getNameHandler().getPrimaryName(entityClass.getSimpleName()); String sql = "SELECT * FROM " + tableName + " WHERE " + primaryName + " = ?"; return (T) jdbcTemplate.query(sql, new DefaultRowMapper(entityClass, this.getActualNameHandler()), id).get(0); } /** * 查询所有记录 * * @return */ @Override public List<T> findAll() { String sql = "SELECT * FROM " + this.getActualNameHandler().getTableName(entityClass.getSimpleName()); return (List<T>) jdbcTemplate.query(sql, new DefaultRowMapper(entityClass, this.getActualNameHandler())); } /** * 查询记录数 * * @param entity * @return */ public int queryCount(T entity) { String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName()); StringBuilder countSql = new StringBuilder("select count(*) from "); countSql.append(tableName); SqlContext sqlContext = SqlUtils.buildQueryCondition(entity, this.getActualNameHandler()); if (sqlContext.getSql().length() > 0) { countSql.append(" where "); countSql.append(sqlContext.getSql()); } return jdbcTemplate.queryForInt(countSql.toString(), sqlContext.getParams().toArray()); } /** * 查询分页列表 * * @param entity * @return */ public Pager queryPageList(T entity) { Pager pager = new Pager(); PagingOrder pagingOrder = (PagingOrder) entity; pager.setCurPage(pagingOrder.getCurPage()); pager.setItemsPerPage(pagingOrder.getItemsPerPage()); String tableName = this.getActualNameHandler().getTableName(entityClass.getSimpleName()); String primaryName = this.getActualNameHandler().getPrimaryName(entityClass.getSimpleName()); StringBuilder querySql = new StringBuilder("select * from "); StringBuilder countSql = new StringBuilder("select count(*) from "); querySql.append(tableName); countSql.append(tableName); // 不调用queryCount方法,条件共同组装一次,减少反射获取的次数 SqlContext sqlContext = SqlUtils.buildQueryCondition(entity, this.getActualNameHandler()); if (sqlContext.getSql().length() > 0) { querySql.append(" where "); countSql.append(" where "); querySql.append(sqlContext.getSql()); countSql.append(sqlContext.getSql()); } querySql.append(" order by "); querySql.append(primaryName); querySql.append(" desc "); querySql.append("limit ?,?"); List<Object> queryParams = new ArrayList<Object>(sqlContext.getParams()); queryParams.add(pager.getBeginIndex()); queryParams.add(pager.getItemsPerPage()); List<T> list = (List<T>) jdbcTemplate.query(querySql.toString(), queryParams.toArray(), new DefaultRowMapper(entityClass, this.getActualNameHandler())); int totalCount = jdbcTemplate.queryForInt(countSql.toString(), sqlContext.getParams().toArray()); pager.setList(list); pager.setItems(totalCount); return pager; } }
相关推荐
本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...
泛型DAO是一种设计模式,它通过定义一个通用的DAO接口或抽象类,可以适用于不同的实体类,减少了重复的代码。这种模式的核心在于利用Java的泛型特性,使得DAO方法可以处理任何类型的实体对象,而无需为每个实体类...
在实际的Java Web应用中,我们可以结合Spring框架的Hibernate或JPA支持,进一步简化泛型DAO的实现,利用Spring的模板类如JdbcTemplate、HibernateTemplate等,自动处理SQL执行和结果映射。 总的来说,泛型DAO在Java...
在SSH2中,DAO层的泛型应用还有助于单元测试,因为每个具体的DAO实现都可以独立测试,无需关心底层数据源。同时,由于类型安全的特性,编译期就能发现很多潜在的错误,提高了代码质量。 总的来说,"ssh2 + dao泛型...
在这个接口中,`T`代表任何继承了特定基类或实现了特定接口的实体类,这得益于Java的泛型机制。`save`方法用于保存新实体到数据库,`update`用于更新已有实体,`deleteById`根据ID删除实体,`findById`通过ID查询...
在整合Spring与Hibernate时,我们通常会使用Spring的JdbcTemplate或JPA(Java Persistence API)来管理数据库操作。但是,由于Hibernate的强大功能和灵活性,很多开发者选择使用Hibernate作为ORM工具。在Spring中...
`SXT_Spring3_03_Configuration_Dao`和`SXT_Spring3_04_Configuration_Dao_Service`可能涵盖这部分内容,演示了如何通过Java配置来定义数据访问对象(DAO)和服务层组件。 5. **AOP增强** 在Spring 3.0中,AOP...
在BaseDao中,泛型可以用来定义通用的类型参数,比如,使得BaseDao能够处理任何类型的实体对象,而无需为每种实体创建一个新的DAO类。 反射是Java的一个重要特性,它允许运行时动态地获取类的信息并调用其方法。在...
在SSH框架中,泛型可以被应用到DAO(Data Access Object)层,创建泛型DAO接口和实现,以减少代码重复,提高代码复用性和可维护性。例如,你可以创建一个泛型BaseDAO接口,如下所示: ```java public interface ...
Spring 2.5的JdbcTemplate和HibernateTemplate等数据库访问模板,简化了数据库操作,提供了更好的异常处理机制,同时支持JDBC 4.0规范。 九、测试支持 Spring 2.5提供了丰富的测试支持,包括`@Test`注解的`Spring...
- Spring 作为一站式框架,提供了诸如 SpringMVC(Web 层)、Service 层的依赖注入以及 DAO 层的 JdbcTemplate 和与其他 ORM 框架(如 Hibernate)的集成。 1.1.2 Spring 的版本与目录结构 - Spring 有多个版本,如...
Spring 3.0 完全基于Java 5进行构建,这意味着它充分利用了Java 5及更高版本的语言特性,如泛型、枚举、可变参数等,这为开发者提供了更为简洁的编程模型。 ##### 2.2 文档改进 随着Spring 3.0的到来,官方提供了...
4. **CRUD操作**:通用DAO实现通常会包含创建(Create)、读取(Read)、更新(Update)和删除(Delete)等基本操作的方法。 5. **事务管理**:在数据库操作中,事务是保证数据一致性的关键。`GenericDaoImpl` 可能...
9. Dao操作优化,创建BaseDao基类,实现通用方法,利用反射和泛型提高代码复用性。 在实际开发中,SSH框架的组合使用能够提高开发效率,减少代码量,并且提供了良好的分层结构和模块化设计,便于维护和扩展。
- **实现**:由于在抽象Dao类中已经规定了泛型,因此在返回结果时无需进行额外的类型转换,可以直接返回相应类型的对象列表或者单个对象。 #### 四、总结 通过以上设计思路和实现步骤,我们可以看到手写一个ORM框架...