** La plupart du code de cet article ne fonctionne plus. Je vais le garder pour mémoire, mais il n'est pas prévu de le mettre à jour. ** ** Veuillez vous référer aux Documents officiels si vous avez besoin d'informations fiables.
@ kazuki43zoo a écrit un merveilleux commentaire, je vous recommande donc de le lire également. J'ai essayé Spring Data JDBC 1.0.0.BUILD-SNAPSHOT (-> 1.0.0.RELEASE)
De plus, Spring Data JDBC est toujours un projet en pleine croissance. Les liens suivants peuvent être utiles, car certaines informations ne peuvent pas être retracées par le seul document publié.
J'ai un projet appelé Spring Data JDBC, donc je vais l'essayer.
Parlant d'accès RDB de Spring, JdbcTemplate et [Spring Data JPA](https://projects.spring.io/spring-data- Il y a jpa /) et ainsi de suite. Bien que toujours au niveau du support CRUD, Spring Data JDBC peut également être une option viable pour l'accès à la base de données à l'avenir.
La source que j'ai essayée cette fois est ici.
!!! Depuis janvier 2018, Spring Data JDBC est BUILD-SNAPSHOT. Il y a de fortes chances que le code de cet article reste bloqué à l'avenir. !!!
pom.xml
Après avoir créé le projet Spring Boot, ajoutez la dépendance à pom.xml. DB doit être la base de données H2.
pom.xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jdbc</artifactId>
<version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Écrivez la définition de la table dans schema.sql.
schema.sql
create table employee (
employee_number bigint primary key auto_increment,
firstname varchar NOT NULL,
lastname varchar NOT NULL,
age int NOT NULL,
hired_at date
);
Créez une classe d'entité qui correspond à la table. Ajoutez l'annotation «@ Id» au champ ID. (J'utilise Lombok car il était difficile d'écrire Getter / Setter w)
Employee.java
@Data
public class Employee {
@Id
private Long employeeNumber;
private String firstname;
private String lastname;
private Integer age;
private LocalDate hiredAt;
}
Après avoir créé l'entité, créez un référentiel qui hérite du CrudRepository
.
EmployeeRepository.java
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
}
Comment exécuter Spring Data JDBC
@EnableJdbcRepositories
DataAccessStrategy
deviendra nécessaire. Si vous souhaitez que le nom de la colonne soit un cas de serpent, définissez une NamingStrategy qui convertit le nom de champ <=> nom de colonne de l'entité.
SpringDataJdbcDemoApplication.java
@SpringBootApplication
@EnableJdbcRepositories
public class SpringDataJdbcDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataJdbcDemoApplication.class, args);
}
@Autowired
JdbcMappingContext context;
@Autowired
DataSource datasource;
@Bean
DataAccessStrategy dataAccessStrategy() {
return new DefaultDataAccessStrategy(
new SqlGeneratorSource(context),
new NamedParameterJdbcTemplate(datasource),
context);
}
@Bean
NamingStrategy namingStrategy() {
return new CustomNamingStrategy();
}
}
CustomNamingStrategy.java
public class CustomNamingStrategy extends DefaultNamingStrategy {
@Override
public String getColumnName(JdbcPersistentProperty property) {
String propertyName = property.getName();
return camelToSnake(propertyName);
}
@Override
public String getTableName(Class<?> type) {
return super.getTableName(type);
}
public String camelToSnake(String original) {
char[] chars = original.toCharArray();
char[] buff = new char[chars.length + 10];
int j = 0;
for(int i = 0; i < chars.length; i++) {
char c = chars[i];
if(buff[buff.length - 1] != ' ') {
buff = Arrays.copyOf(buff, buff.length + 10);
}
if (Character.isUpperCase(c)) {
buff[j++] = '_';
buff[j++] = Character.toLowerCase(c);
} else {
buff[j++] = c;
}
}
return new String(buff).trim();
}
}
Je vais le déplacer immédiatement.
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class SpringDataJdbcDemoApplicationTests {
@Autowired
EmployeeRepository repo;
@Test
public void contextLoads() {
}
@Test
public void test1() {
Employee employee = new Employee();
employee.setFirstname("John");
employee.setLastname("Do");
employee.setAge(30);
employee.setHiredAt(LocalDate.of(2012, 4, 1));
// Insert
employee = repo.save(employee);
Long employeeNumber = employee.getEmployeeNumber();
Optional<Employee> insertedOpt = repo.findById(employeeNumber);
assertTrue(insertedOpt.isPresent());
Employee inserted = insertedOpt.get();
assertAll("insert",
() -> assertEquals(inserted.getEmployeeNumber(), employeeNumber),
() -> assertEquals(inserted.getFirstname(), "John"),
() -> assertEquals(inserted.getLastname(), "Do"),
() -> assertEquals(inserted.getAge(), Integer.valueOf(30)),
() -> assertEquals(inserted.getHiredAt(), LocalDate.of(2012, 4, 1)));
// Update
employee.setAge(31);
repo.save(employee);
Optional<Employee> updatedOpt = repo.findById(employeeNumber);
assertTrue(updatedOpt.isPresent());
Employee updated = updatedOpt.get();
assertEquals(updated.getAge(), Integer.valueOf(31));
// Delete
repo.delete(employee);
Optional<Employee> deleted = repo.findById(employeeNumber);
assertTrue(!deleted.isPresent());
}
}
Je ne l'ai pas essayé, mais il semble possible de le lier à MyBatis. Lorsque la méthode Repository est appelée, il semble que la méthode Mapper avec le nom correspondant soit exécutée.
Recommended Posts