[JAVA] Aperçu de Spring Data JDBC

(Ajouté le 02/01/2019) Cet article n'a pas été mis à jour

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

environnement

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>

définition de table

É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éer un référentiel

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

Définition du haricot

Comment exécuter Spring Data JDBC

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

}

Essayez de bouger

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

Coopération MyBatis

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

Aperçu de Spring Data JDBC
J'ai essayé Spring Data JDBC 1.0.0.BUILD-SNAPSHOT (-> 1.0.0.RELEASE)
piège dynamodb de données de ressort
Essayez d'utiliser Spring JDBC
Compatibilité de Spring JDBC et My Batis avec Spring Data JDBC (provisoire)
[spring] Utilisons Spring Data JPA
Utiliser Spring JDBC avec Spring Boot
[Comment installer Spring Data Jpa]
Notez que Spring Data JDBC n'a pas pu insérer
Sortie du journal Spring Data JPA SQL
OU rechercher avec la spécification Spring Data Jpa
Cache de support nul dans Spring Data Redis
Pour écrire des données de réponse directement dans Spring