【问题标题】:Generic DAO pattern Spring JDBC Template通用 DAO 模式 Spring JDBC 模板
【发布时间】:2012-10-18 22:26:10
【问题描述】:

从一开始就必须实现这个模式已经有一段时间了,所以我对在 spring jdbc 中使用这个模式时缺少什么感到有点困惑。这是来自我的 BaseDao 的 sn-p:

    protected BaseDao(RowMapper<T> rowMapper, String tableName, JdbcTemplate jdbcTemplate)
   {
      this.rowMapper = rowMapper;
      this.tableName = tableName;
      this.findByIdSql = "SELECT * FROM " + tableName + " WHERE id = ?";
      this.jdbcTemplate = jdbcTemplate;
   }

   public T findById(final Integer id)
   {
      if (id == null)
      {
         return null;
      }

      Object[] params = { id };
      return jdbcTemplate.queryForObject(findByIdSql, params, rowMapper);
   }

   public T save(final T dto)
   {
      if (dto == null)
      {
         return null;
      }

      try
      {
         if (dto.isNew())
         {
            final Integer newId = jdbcTemplate.update("INSERT INTO " + tableName);
         }
      }
      catch (UncategorizedSQLException e)
      {
         logger.error("****************" + e.getMessage(), e);
         throw new RuntimeException("Could not persist: " + e.getMessage());
      }
   }

   public void delete(final T dto)
   {
      if (dto == null)
      {
         final String errorMessage = "Can't delete a null object";
         logger.warn(errorMessage);
         throw new RuntimeException(errorMessage);
      }

      if (!dto.cameFromDatabase())
      {
         throw new RuntimeException("Can't delete an object that didn't come from the database");
      }

      try
      {

      }
      catch (JdbcUpdateAffectedIncorrectNumberOfRowsException e)
      {
         final String message = "The delete failed on " + dto + ".  " + e.getMessage();
         logger.error(message);
         throw new RuntimeException(message, e);

      }
   }

如您所见,我的 findById 工作正常,并且能够处理抛出的任何类。问题是我不记得如何简单地使用 jdbctemplate 来“生成”保存(处理插入和更新)和删除。这不能实现吗?每个DAO都需要自己定义这两个方法吗?我看不到 jdbc 模板如何灵活地编写单独的插入、更新、删除语句。浏览网页时,我看到了大量使用休眠或实体管理器的示例。这是我应该走的路线吗?或者我在这里遗漏的明显步骤是什么?

我知道保存和删除没有填写,但我只是想知道如何处理该行

final Integer newId = jdbcTemplate.update("INSERT INTO " + tableName);

处理任何扔给它的 DTO。

谢谢!

【问题讨论】:

    标签: java database spring dao jdbctemplate


    【解决方案1】:

    你的路很好,JdbcTemplate方法updatecan handle insert/delete/update operations

    引用自this article 的示例演示插入操作:

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;
    
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    public void insert(Customer customer){
    
        String sql = "INSERT INTO CUSTOMER " +
            "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
    
        jdbcTemplate = new JdbcTemplate(dataSource);
    
        jdbcTemplate.update(sql, new Object[] { customer.getCustId(),
            customer.getName(),customer.getAge()  
        });
    
    }
    

    【讨论】:

    • 感谢您的回复,我知道如何插入特定的 DTO。但我试图弄清楚如何使该插入通用,以便它可以采用任何 DTO。这可能只使用 jdbctemplate 吗?我见过 enityManger 这样做,hibernate,JPA ......等等。谢谢
    • 无论是 jdbcTemplate 还是 ORM,都无法避免解析哪些数据进入哪些列。它永远不会自动发生。即使使用您所指的 ORM 框架,您也需要指定 DTO 的哪个字段映射到哪个表列。它基本上引入了一个额外的层来抽象您在上面的示例中使用 jdbctemplate 在 ORM 实体中看到的映射。
    • 感谢您回答了我的问题!
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2012-04-23
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多