Прошло некоторое время с тех пор, когда он должен был реализовать этот шаблон с самого начала, поэтому я немного смущен тем, чего не хватает в использовании этого шаблона с весной 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 брошенных на него.
Благодарим вас!
Спасибо за ответ, я знаю, как сделать вставки для конкретного DTO , Но я пытаюсь понять, как сделать эту вставку родовым, чтобы она могла принимать любой DTO. Возможно ли это только с помощью jdbctemplate? Я видел, как enityManger делает это, спящий режим, JPA ... и т. Д. Спасибо – sauce
Либо jdbcTemplate, либо ORM, вы не можете избежать разрешения того, какие данные идут в столбцах. Это никогда не происходит автоматически. Даже с использованием структуры ORM, о которой вы говорите, вам нужно указать, какое поле ваших карт DTO соответствует столбцу таблицы. Это в основном представляет дополнительный слой для абстрактного отображения, которое вы видите с помощью jdbctemplate в примере выше, чем объект ORM. – dimitrisli
Спасибо, что ответил на мой вопрос! – sauce