Slide 1

Slide 1 text

Spring Data JDBCΛ
 ࢖͍౗͢ʂ
 Acroquest Technologyגࣜձࣾ ਐ౻ɹྒྷ

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Spring Data JDBC is Կ

Slide 4

Slide 4 text

Spring ͷ DB ΞΫηεϥΠϒϥϦ
 (·ͩ1.0.0.BUILD-SNAPSHOT)

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Կ͕ҧ͏ͷ͔

Slide 7

Slide 7 text

Spring Data JDBC ͸ DBΞΫηεͷ
 ࣮૷Λఏڙ͠ͳ͍

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

;Θͬͱݴ͏ͱɺ
 DDDຊͷRepository ύλʔϯΛ ޷͖ͳ࣮૷Ͱ؆୯ʹͭ͘ΕΔΞϨ

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

@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); ͔͍͔ͭͨ

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Ͷɺ؆୯Ͱ͠ΐ͏ʁ

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

EmployeeMapper.xml INSERT INTO employee (firstname, lastname, age, hired_at) VALUES (#{instance.firstname}, #{instance.lastname}, #{instance.age}, #{instance.hiredAt}) ……… MyBatis ࣮૷ͷ৔߹ CrudRepository ͷϝιου ʹରԠͨ͠SQLΛఆٛ͢Δ

Slide 17

Slide 17 text

Ͷɺ؆୯Ͱʢུʣ

Slide 18

Slide 18 text

جຊతʹɺDataAccessStrategy 
 ͷ࣮૷Λ੾Γସ͑Δ͚ͩ

Slide 19

Slide 19 text

DataAccessStrategy 
 Λࣗ෼Ͱ࣮૷͢Ε͹
 ͲΜͳORMʹ΋࢖͑Δ

Slide 20

Slide 20 text

΋ͪΖΜHibernate΋ΠέΔ

Slide 21

Slide 21 text

ͦΕԿͯ Spring Data JPA

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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 ͸࢖Θͳ͍ͷͰࣗલఆٛ

Slide 24

Slide 24 text

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(); } …

Slide 25

Slide 25 text

Ͷɺ̺ʢུʣ

Slide 26

Slide 26 text

͔͍ͨͨͷܗ੻ 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;

Slide 27

Slide 27 text

Spring Data JDBC͸
 ·ͩ·ͩൃల్্

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

ࠓޙʹظ଴ʂʂʂ