개발

repository - crud (JdbcTemplate)

제이G 2024. 4. 20. 11:56

 

Domain

public class Order {

	private Long id;
	private Long userId;
	private Long productId;
	private OrderState state;
	private String rejectMsg;
	private LocalDateTime createAt;
    
    // constructor & getter & toString  
}

 

 

Repository

@Repository
public class JdbcOrderRepository {

	private final JdbcTemplate jdbcTemplate;

	public JdbcOrderRepository(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public Optional<Order> findById(final Long id) {
		final String sql = "SELECT * FROM orders WHERE id=?";
		final List<Order> orders = jdbcTemplate.query(
				sql,
				rowMapper(),
				id);
		return Optional.ofNullable((orders.isEmpty()) ? null : orders.get(0));
	}

	// offset based pagination
	public List<Order> findAll(final SearchCondition searchCondition) {
		String sql = "SELECT * FROM orders ORDER BY id DESC LIMIT ?,?";
		return jdbcTemplate.query(
				sql,
				rowMapper(),
				searchCondition.offset(),
				searchCondition.size());
	}

	public void update(final Order order) {
		String sql = "UPDATE orders SET state=? WHERE id=?";
		jdbcTemplate.update(
				sql,
				order.getState(),
				order.getId()
		);
	}

	public Order save(final Order order) {
		String sql = "INSERT INTO orders(user_id, product_id, state, reject_msg, create_at) VALUES(?, ?, ?, ?, ?)";
		KeyHolder keyHolder = new GeneratedKeyHolder();

		jdbcTemplate.update(con -> {
			PreparedStatement pstmt = con.prepareStatement(sql, new String[] {"id"});
			pstmt.setLong(1, order.getUserId());
			pstmt.setString(2, order.getState().toString());
			pstmt.setString(3, order.getRejectMsg());
			pstmt.setTimestamp(4, Timestamp.valueOf(order.getCreateAt()));
			return pstmt;
		}, keyHolder);

		return new Order(
				keyHolder.getKey().longValue(),
				order.getUserId(),
				order.getProductId(),
				order.getState(),
				order.getRejectMsg(),
				order.getCreateAt());
	}

	public void delete(final Order order) {
		String sql = "DELETE FROM orders WHERE id=?";

		jdbcTemplate.update(
				sql,
				order.getId()
		);
	}

	private RowMapper<Order> rowMapper() {
		return ((rs, rowNum) -> new Order(
				rs.getLong("id"),
				rs.getLong("user_id"),
				rs.getLong("product_id"),
				OrderState.valueOf(rs.getString("order_state")),
				rs.getString("reject_msg"),
				rs.getTimestamp("create_at").toLocalDateTime()
		));
	}

}