Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spring Data JDBCを使い倒す! / Intruduction to Spring Data JDBC

Spring Data JDBCを使い倒す! / Intruduction to Spring Data JDBC

JSUG勉強会 2018年その3 LT大会 登壇者募集!
2018-04-18(水)19:00 - 21:00

Ryo Shindo

April 19, 2018
Tweet

More Decks by Ryo Shindo

Other Decks in Programming

Transcript

  1. Spring Data JDBCΛ

    ࢖͍౗͢ʂ

    Acroquest Technologyגࣜձࣾ
    ਐ౻ɹྒྷ

    View Slide

  2. ࣗݾ঺հ
    • ਐ౻ɹྒྷ @shindo_ryo
    • Acroquest Technologyגࣜձࣾ
    • (ݩ)จܥJavaΤϯδχΞ

    View Slide

  3. Spring Data JDBC is Կ

    View Slide

  4. Spring ͷ DB ΞΫηεϥΠϒϥϦ

    (·ͩ1.0.0.BUILD-SNAPSHOT)

    View Slide

  5. ΋͏͋Δ͡ΌΜ
    • Spring JDBC (JdbcTemplate)
    • mybatis-spring
    • Spring Data JPA

    View Slide

  6. Կ͕ҧ͏ͷ͔

    View Slide

  7. Spring Data JDBC ͸
    DBΞΫηεͷ

    ࣮૷Λఏڙ͠ͳ͍

    View Slide

  8. Spring Data JDBC ͸Ξμϓλʔ
    Spring Data
    JDBC
    Spring JDBC
    MyBatis
    <>
    Repository
    ࣮૷ͷ੾Γସ͑͸
    BeanఆٛͰߦ͏

    View Slide

  9. ;Θͬͱݴ͏ͱɺ

    DDDຊͷRepository ύλʔϯΛ
    ޷͖ͳ࣮૷Ͱ؆୯ʹͭ͘ΕΔΞϨ

    View Slide

  10. EmployeeRepository.java
    public interface EmployeeRepository extends
    CrudRepository {
    @Query("select * from employee where age > :age")
    List findByAgeOlderThan(@Param(“age") int age);
    }
    ͔͍͔ͭͨ

    View Slide

  11. @Autowired
    EmployeeRepository repository;
    // insert or update
    repository.save(employee);
    // select
    Iterable employees = repository.findAll();
    Optional employee = repository.findById(id);
    List employees = repository. findByAgeOlderThan(30);
    // delete
    repository.delete(employee);
    ͔͍͔ͭͨ

    View Slide

  12. Spring JDBC ࣮૷ͷ৔߹
    SpringDataJdbcConfig.java
    @Configuration
    @EnableJdbcRepositories
    public class SpringDataJdbcConfig {
    @Bean
    DataAccessStrategy dataAccessStrategy(JdbcMappingContext context) {
    return new DefaultDataAccessStrategy(
    new SqlGeneratorSource(context),
    context);
    }
    }

    View Slide

  13. Ͷɺ؆୯Ͱ͠ΐ͏ʁ

    View Slide

  14. MyBatis ࣮૷ͷ৔߹
    SpringDataJdbcConfig.java
    @Configuration
    @EnableJdbcRepositories
    public class SpringDataJdbcConfig {
    @Bean
    DataAccessStrategy dataAccessStrategy(SqlSession sqlSession) {
    return new MyBatisDataAccessStrategy(sqlSession);
    }
    }

    View Slide

  15. application.properties
    mybatis.mapper-locations=

    classpath:/com/example/demo/mapper/*Mapper.xml
    ɹɹɹˡMapperϑΝΠϧͷϩέʔγϣϯΛࢦఆ͢Δ
    mybatis.type-aliases-package=com.example.demo
    ɹɹɹˡEntityΫϥεͷύοέʔδΛࢦఆ͢Δ
    MyBatis ࣮૷ͷ৔߹

    View Slide

  16. EmployeeMapper.xml


    INSERT INTO employee
    (firstname, lastname, age, hired_at)
    VALUES
    (#{instance.firstname}, #{instance.lastname},
    #{instance.age}, #{instance.hiredAt})


    ………
    MyBatis ࣮૷ͷ৔߹
    CrudRepository ͷϝιου
    ʹରԠͨ͠SQLΛఆٛ͢Δ

    View Slide

  17. Ͷɺ؆୯Ͱʢུʣ

    View Slide

  18. جຊతʹɺDataAccessStrategy 

    ͷ࣮૷Λ੾Γସ͑Δ͚ͩ

    View Slide

  19. DataAccessStrategy 

    Λࣗ෼Ͱ࣮૷͢Ε͹

    ͲΜͳORMʹ΋࢖͑Δ

    View Slide

  20. ΋ͪΖΜHibernate΋ΠέΔ

    View Slide

  21. ͦΕԿͯ Spring Data JPA

    View Slide

  22. Hibernate ࣮૷ͷ৔߹
    SpringDataJdbcConfig.java
    @Configuration
    @EnableJdbcRepositories
    @EnableAutoConfiguration(exclude =
    HibernateJpaAutoConfiguration.class)
    public class SpringDataJdbcConfig {
    @Bean
    DataAccessStrategy dataAccessStrategy() {
    return new HibernateDataAcccessStrategy(
    localSessionFactoryBean().getObject());
    }

    View Slide

  23. Hibernate ࣮૷ͷ৔߹
    SpringDataJdbcConfig.javaʢଓ͖ʣ
    @Bean
    LocalSessionFactoryBean localSessionFactoryBean() {
    LocalSessionFactoryBean localSessionFactoryBean =
    new LocalSessionFactoryBean();
    localSessionFactoryBean.setDataSource(datasource);
    localSessionFactoryBean.setAnnotatedClasses(Employee.class);
    (தུ)
    return localSessionFactoryBean;
    }
    @Bean
    HibernateTransactionManager transactionManager(
    LocalSessionFactoryBean sessionFactory) {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setSessionFactory(sessionFactory.getObject());
    return txManager;
    }
    spring-boot-starter-data-jpa
    ͸࢖Θͳ͍ͷͰࣗલఆٛ

    View Slide

  24. Hibernate ࣮૷ͷ৔߹
    HibernateDataAcccessStrategy.java
    public class HibernateDataAcccessStrategy
    implements DataAccessStrategy {
    private SessionFactory sessionFactory;
    public HibernateDataAcccessStrategy(
    SessionFactory sessionFactory) { … }
    private Session currentSession() { … }
    @Override
    public void insert(T instance, Class domainType,
    Map additionalParameters) {
    Session session = currentSession();
    session.save(instance);
    session.flush();
    }

    View Slide

  25. Ͷɺ̺ʢུʣ

    View Slide

  26. ͔͍ͨͨͷܗ੻
    Employee.java
    @Entity
    public class Employee {
    @org.springframework.data.annotation.Id
    @javax.persistence.Id
    @Column(name="employee_number")
    @GeneratedValue(strategy=
    GenerationType.IDENTITY)
    private Long employeeNumber;

    View Slide

  27. Spring Data JDBC͸

    ·ͩ·ͩൃల్্

    View Slide

  28. ͜ΜͳIssue͕͋Γ·͢
    • Support for ValueObjects/Embbeded
    • Pagenation abstraction
    • @Column
    • etc…

    View Slide

  29. ࠓޙʹظ଴ʂʂʂ

    View Slide