** Der größte Teil des Codes in diesem Artikel funktioniert nicht mehr. Ich werde es für die Aufzeichnung aufbewahren, aber es gibt keine Pläne, es zu aktualisieren. ** ** ** Weitere Informationen finden Sie in den offiziellen Dokumenten.
@ kazuki43zoo hat einen wunderbaren Kommentar geschrieben, daher empfehle ich Ihnen, diesen ebenfalls zu lesen. Ich habe Spring Data JDBC 1.0.0.BUILD-SNAPSHOT (-> 1.0.0.RELEASE) ausprobiert
Auch Spring Data JDBC ist immer noch ein wachsendes Projekt. Die folgenden Links können nützlich sein, da einige Informationen nicht allein durch das veröffentlichte Dokument zurückverfolgt werden können.
Ich habe ein Projekt namens Spring Data JDBC, also werde ich es versuchen.
Apropos RDB-Zugriff von Spring, JdbcTemplate und [Spring Data JPA](https://projects.spring.io/spring-data- Es gibt jpa /) und so weiter. Obwohl Spring Data JDBC noch auf CRUD-Support-Ebene ist, ist es möglicherweise auch in Zukunft eine praktikable Option für den DB-Zugriff.
Die Quelle, die ich diesmal ausprobiert habe, ist hier.
!!! Ab Januar 2018 ist Spring Data JDBC BUILD-SNAPSHOT. Es besteht eine gute Chance, dass der Code in diesem Artikel in Zukunft hängen bleibt. !!!
pom.xml
Fügen Sie nach dem Erstellen des Spring Boot-Projekts die Abhängigkeit zu pom.xml hinzu. DB sollte H2-Datenbank sein.
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>
Schreiben Sie die Tabellendefinition in 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
);
Erstellen Sie eine Entitätsklasse, die der Tabelle entspricht. Fügen Sie die Annotation @ Id
zum ID-Feld hinzu.
(Ich benutze Lombok, weil es schwierig war, Getter / Setter w zu schreiben.)
Employee.java
@Data
public class Employee {
@Id
private Long employeeNumber;
private String firstname;
private String lastname;
private Integer age;
private LocalDate hiredAt;
}
Erstellen Sie nach dem Erstellen der Entität ein Repository, das das "CrudRepository" erbt.
EmployeeRepository.java
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
}
So führen Sie Spring Data JDBC aus
@EnableJdbcRepositories
DataAccessStrategy
wird notwendig. Wenn der Spaltenname ein Schlangenfall sein soll, definieren Sie eine NamingStrategy, die den Feldnamen <=> Spaltenname der Entität konvertiert.
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();
}
}
Ich werde es sofort bewegen.
@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());
}
}
Ich habe es nicht ausprobiert, aber es scheint möglich zu sein, es mit MyBatis zu verknüpfen. Wenn die Repository-Methode aufgerufen wird, wird anscheinend die Mapper-Methode mit dem entsprechenden Namen ausgeführt.
Recommended Posts