11package ru .javawebinar .topjava .repository .jdbc ;
22
3- import org .springframework .beans . factory . annotation .Autowired ;
3+ import org .springframework .context . annotation .Profile ;
44import org .springframework .dao .support .DataAccessUtils ;
55import org .springframework .jdbc .core .BeanPropertyRowMapper ;
66import org .springframework .jdbc .core .JdbcTemplate ;
99import org .springframework .jdbc .core .namedparam .NamedParameterJdbcTemplate ;
1010import org .springframework .jdbc .core .simple .SimpleJdbcInsert ;
1111import org .springframework .stereotype .Repository ;
12+ import ru .javawebinar .topjava .Profiles ;
1213import ru .javawebinar .topjava .model .Meal ;
1314import ru .javawebinar .topjava .repository .MealRepository ;
1415
16+ import java .sql .Timestamp ;
1517import java .time .LocalDateTime ;
1618import java .util .List ;
1719
18- @ Repository
19- public class JdbcMealRepository implements MealRepository {
20+ public abstract class JdbcMealRepository <T > implements MealRepository {
2021
2122 private static final RowMapper <Meal > ROW_MAPPER = BeanPropertyRowMapper .newInstance (Meal .class );
2223
@@ -26,8 +27,7 @@ public class JdbcMealRepository implements MealRepository {
2627
2728 private final SimpleJdbcInsert insertMeal ;
2829
29- @ Autowired
30- public JdbcMealRepository (JdbcTemplate jdbcTemplate , NamedParameterJdbcTemplate namedParameterJdbcTemplate ) {
30+ JdbcMealRepository (JdbcTemplate jdbcTemplate , NamedParameterJdbcTemplate namedParameterJdbcTemplate ) {
3131 this .insertMeal = new SimpleJdbcInsert (jdbcTemplate )
3232 .withTableName ("meal" )
3333 .usingGeneratedKeyColumns ("id" );
@@ -36,13 +36,41 @@ public JdbcMealRepository(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate
3636 this .namedParameterJdbcTemplate = namedParameterJdbcTemplate ;
3737 }
3838
39+ protected abstract T toDbDateTime (LocalDateTime ldt );
40+
41+ @ Repository
42+ @ Profile (Profiles .POSTGRES_DB )
43+ public static class Java8JdbcMealRepository extends JdbcMealRepository <LocalDateTime > {
44+ public Java8JdbcMealRepository (JdbcTemplate jdbcTemplate , NamedParameterJdbcTemplate namedParameterJdbcTemplate ) {
45+ super (jdbcTemplate , namedParameterJdbcTemplate );
46+ }
47+
48+ @ Override
49+ protected LocalDateTime toDbDateTime (LocalDateTime ldt ) {
50+ return ldt ;
51+ }
52+ }
53+
54+ @ Repository
55+ @ Profile (Profiles .HSQL_DB )
56+ public static class TimestampJdbcMealRepository extends JdbcMealRepository <Timestamp > {
57+ public TimestampJdbcMealRepository (JdbcTemplate jdbcTemplate , NamedParameterJdbcTemplate namedParameterJdbcTemplate ) {
58+ super (jdbcTemplate , namedParameterJdbcTemplate );
59+ }
60+
61+ @ Override
62+ protected Timestamp toDbDateTime (LocalDateTime ldt ) {
63+ return Timestamp .valueOf (ldt );
64+ }
65+ }
66+
3967 @ Override
4068 public Meal save (Meal meal , int userId ) {
4169 MapSqlParameterSource map = new MapSqlParameterSource ()
4270 .addValue ("id" , meal .getId ())
4371 .addValue ("description" , meal .getDescription ())
4472 .addValue ("calories" , meal .getCalories ())
45- .addValue ("date_time" , meal .getDateTime ())
73+ .addValue ("date_time" , toDbDateTime ( meal .getDateTime () ))
4674 .addValue ("user_id" , userId );
4775
4876 if (meal .isNew ()) {
@@ -81,6 +109,6 @@ public List<Meal> getAll(int userId) {
81109 public List <Meal > getBetweenHalfOpen (LocalDateTime startDateTime , LocalDateTime endDateTime , int userId ) {
82110 return jdbcTemplate .query (
83111 "SELECT * FROM meal WHERE user_id=? AND date_time >= ? AND date_time < ? ORDER BY date_time DESC" ,
84- ROW_MAPPER , userId , startDateTime , endDateTime );
112+ ROW_MAPPER , userId , toDbDateTime ( startDateTime ), toDbDateTime ( endDateTime ) );
85113 }
86114}
0 commit comments