2012-10-18 3 views
0

Прошло некоторое время с тех пор, когда он должен был реализовать этот шаблон с самого начала, поэтому я немного смущен тем, чего не хватает в использовании этого шаблона с весной jdbc. Вот отрывок из моего BaseDao:Общий шаблон DAO Spring JDBC Template

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 может сгибаться, чтобы писать отдельные инструкции вставки, обновления, удаления. Просмотр веб-страниц Я вижу множество примеров, использующих hibernate или entitymanager. Это маршрут, который я должен взять? Или что явный очевидный шаг, который мне здесь не хватает?

Я знаю, сохранять и удалять не заполнены, но мне просто интересно, как обращаться с линией

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

обрабатывать любые DTO брошенных на него.

Благодарим вас!

ответ

0

Вы находитесь в хорошем пути, 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() 
    }); 

} 
+1

Спасибо за ответ, я знаю, как сделать вставки для конкретного DTO , Но я пытаюсь понять, как сделать эту вставку родовым, чтобы она могла принимать любой DTO. Возможно ли это только с помощью jdbctemplate? Я видел, как enityManger делает это, спящий режим, JPA ... и т. Д. Спасибо – sauce

+1

Либо jdbcTemplate, либо ORM, вы не можете избежать разрешения того, какие данные идут в столбцах. Это никогда не происходит автоматически. Даже с использованием структуры ORM, о которой вы говорите, вам нужно указать, какое поле ваших карт DTO соответствует столбцу таблицы. Это в основном представляет дополнительный слой для абстрактного отображения, которое вы видите с помощью jdbctemplate в примере выше, чем объект ORM. – dimitrisli

+1

Спасибо, что ответил на мой вопрос! – sauce

Смежные вопросы