[JAVA] Spring Data JDBC-Vorschau

(Hinzugefügt am 02.01.2019) Dieser Artikel wurde nicht aktualisiert

** 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. !!!

Umgebung

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>

Tabellendefinition

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
);

Repository erstellen

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> {
}

Bohnendefinition

So führen Sie Spring Data JDBC aus

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

}

Versuche dich zu bewegen

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

MyBatis-Zusammenarbeit

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

Spring Data JDBC-Vorschau
Ich habe Spring Data JDBC 1.0.0.BUILD-SNAPSHOT ausprobiert (-> 1.0.0.RELEASE)
Federdaten Dynamodb-Falle
Versuchen Sie es mit Spring JDBC
Kompatibilität von Spring JDBC und My Batis mit Spring Data JDBC (vorläufig)
[spring] Verwenden wir Spring Data JPA
Verwenden Sie Spring JDBC mit Spring Boot
[So installieren Sie Spring Data Jpa]
Ein Memo über den Fall, dass das Einfügen mit Spring Data JDBC nicht durchgeführt werden konnte
Spring Data JPA SQL-Protokollausgabe
ODER suchen Sie mit der Spring Data Jpa-Spezifikation
Null-Support-Cache in Spring Data Redis
Antwortdaten direkt im Frühjahr schreiben