`

Spring JdbcTemplate实现通用的泛型dao

    博客分类:
  • Java
 
阅读更多
/**
 * 泛型通用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`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...

    Hibernate泛型DAO(结合spring模板支持)

    泛型DAO是一种设计模式,它通过定义一个通用的DAO接口或抽象类,可以适用于不同的实体类,减少了重复的代码。这种模式的核心在于利用Java的泛型特性,使得DAO方法可以处理任何类型的实体对象,而无需为每个实体类...

    Java Web程序运用中泛型DAO的作用.zip

    在实际的Java Web应用中,我们可以结合Spring框架的Hibernate或JPA支持,进一步简化泛型DAO的实现,利用Spring的模板类如JdbcTemplate、HibernateTemplate等,自动处理SQL执行和结果映射。 总的来说,泛型DAO在Java...

    ssh2 + dao泛型

    在SSH2中,DAO层的泛型应用还有助于单元测试,因为每个具体的DAO实现都可以独立测试,无需关心底层数据源。同时,由于类型安全的特性,编译期就能发现很多潜在的错误,提高了代码质量。 总的来说,"ssh2 + dao泛型...

    编写通用Dao

    在这个接口中,`T`代表任何继承了特定基类或实现了特定接口的实体类,这得益于Java的泛型机制。`save`方法用于保存新实体到数据库,`update`用于更新已有实体,`deleteById`根据ID删除实体,`findById`通过ID查询...

    基于注解整合spring与hibernate

    在整合Spring与Hibernate时,我们通常会使用Spring的JdbcTemplate或JPA(Java Persistence API)来管理数据库操作。但是,由于Hibernate的强大功能和灵活性,很多开发者选择使用Hibernate作为ORM工具。在Spring中...

    Spring 3.0 新特性

    `SXT_Spring3_03_Configuration_Dao`和`SXT_Spring3_04_Configuration_Dao_Service`可能涵盖这部分内容,演示了如何通过Java配置来定义数据访问对象(DAO)和服务层组件。 5. **AOP增强** 在Spring 3.0中,AOP...

    SpringBoot_BaseDao.zip

    在BaseDao中,泛型可以用来定义通用的类型参数,比如,使得BaseDao能够处理任何类型的实体对象,而无需为每种实体创建一个新的DAO类。 反射是Java的一个重要特性,它允许运行时动态地获取类的信息并调用其方法。在...

    ssh数据库基本操作封装

    在SSH框架中,泛型可以被应用到DAO(Data Access Object)层,创建泛型DAO接口和实现,以减少代码重复,提高代码复用性和可维护性。例如,你可以创建一个泛型BaseDAO接口,如下所示: ```java public interface ...

    spring2.5_学习笔记

    Spring 2.5的JdbcTemplate和HibernateTemplate等数据库访问模板,简化了数据库操作,提供了更好的异常处理机制,同时支持JDBC 4.0规范。 九、测试支持 Spring 2.5提供了丰富的测试支持,包括`@Test`注解的`Spring...

    专题资料(2021-2022年)Java项目教学第一学期SSM框架讲义1Spring的基本应用.docx

    - Spring 作为一站式框架,提供了诸如 SpringMVC(Web 层)、Service 层的依赖注入以及 DAO 层的 JdbcTemplate 和与其他 ORM 框架(如 Hibernate)的集成。 1.1.2 Spring 的版本与目录结构 - Spring 有多个版本,如...

    spring3.0帮助文档

    Spring 3.0 完全基于Java 5进行构建,这意味着它充分利用了Java 5及更高版本的语言特性,如泛型、枚举、可变参数等,这为开发者提供了更为简洁的编程模型。 ##### 2.2 文档改进 随着Spring 3.0的到来,官方提供了...

    DBHelp

    4. **CRUD操作**:通用DAO实现通常会包含创建(Create)、读取(Read)、更新(Update)和删除(Delete)等基本操作的方法。 5. **事务管理**:在数据库操作中,事务是保证数据一致性的关键。`GenericDaoImpl` 可能...

    SSH项目1

    9. Dao操作优化,创建BaseDao基类,实现通用方法,利用反射和泛型提高代码复用性。 在实际开发中,SSH框架的组合使用能够提高开发效率,减少代码量,并且提供了良好的分层结构和模块化设计,便于维护和扩展。

    手写ORM框架笔记.txt

    - **实现**:由于在抽象Dao类中已经规定了泛型,因此在返回结果时无需进行额外的类型转换,可以直接返回相应类型的对象列表或者单个对象。 #### 四、总结 通过以上设计思路和实现步骤,我们可以看到手写一个ORM框架...

Global site tag (gtag.js) - Google Analytics