package cz.nkp.differ.dao; import cz.nkp.differ.model.Image; import cz.nkp.differ.model.User; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; /** * * @author xrosecky */ public class ImageDAOImpl implements ImageDAO { private static String ADD_IMAGE = "INSERT INTO images(filename, unique_name, owner_id, size, shared) VALUES(?, ?, ?, ?, ?)"; private static String GET_IMAGES_BY_USER = "SELECT id, filename, unique_name, owner_id, size, shared FROM images WHERE owner_id = ?"; private static String GET_SHARED_IMAGES = "SELECT id, filename, unique_name, owner_id, size, shared FROM images WHERE shared =true"; private static String DELETE_IMAGE_BY_ID = "DELETE FROM images WHERE id = ?"; private static String UPDATE_IMAGE = "UPDATE images SET filename = ?, owner_id =?, shared = ? WHERE id = ?"; private JdbcTemplate jdbcTemplate; public ImageDAOImpl(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public ImageDAOImpl() { } public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public void addImage(final Image image) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement preparedStatement = conn.prepareStatement(ADD_IMAGE, Statement.RETURN_GENERATED_KEYS); preparedStatement.setString(1, image.getFileName()); preparedStatement.setString(2, image.getUniqueName()); preparedStatement.setInt(3, image.getOwnerId()); preparedStatement.setInt(4, image.getSize()); preparedStatement.setBoolean(5, image.isShared()); return preparedStatement; } }, keyHolder); image.setId(keyHolder.getKey().intValue()); } @Override public void updateImage(final Image image) { jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement preparedStatement = conn.prepareStatement(UPDATE_IMAGE); preparedStatement.setString(1, image.getFileName()); preparedStatement.setInt(2, image.getOwnerId()); preparedStatement.setBoolean(3, image.isShared()); preparedStatement.setInt(4, image.getId()); return preparedStatement; } }); } @Override public List<Image> getImagesForUser(User user) { return jdbcTemplate.query(GET_IMAGES_BY_USER, new Object[]{user.getId()}, new ImageMapper()); } @Override public List<Image> getSharedImages() { return jdbcTemplate.query(GET_SHARED_IMAGES, new ImageMapper()); } @Override public void deleteImage(Image image) { jdbcTemplate.update(DELETE_IMAGE_BY_ID, new Object[]{image.getId()}); } public class ImageMapper implements RowMapper<Image> { @Override public Image mapRow(ResultSet rs, int rowNum) throws SQLException { Image image = new Image(); image.setId(rs.getInt("id")); image.setFileName(rs.getString(2)); image.setUniqueName(rs.getString(3)); image.setOwnerId(rs.getInt(4)); image.setSize(rs.getInt(5)); image.setShared(rs.getBoolean(6)); return image; } } }