πŸ”— Spring 6 JdbcClient API



ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° своСго ΠΌΡƒΠΆΡ‡ΠΈΠ½Ρƒ:



List<Student> getStudentsOfGradeStateAndGenderWithPositionalParams(int grade, String state, String gender) {

String sql = "select student_id, student_name, age, grade, gender, state from student where grade = ? and state = ? and gender = ?";

return jdbcTemplate.query(sql, new Object[]{grade, state, gender}, new StudentRowMapper());

}




А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° мСня:



List<Student> getStudentsOfGradeStateAndGenderWithPositionalParams(int grade, String state, String gender) {

String sql = "select student_id, student_name, age, grade, gender, state from student where grade = ? and state = ? and gender = ?";

return jdbcClient.sql(sql)

.param(grade)

.param(state)

.param(gender)

.query(new StudentRowMapper()).list();

}




Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ новая Ρ„ΠΈΡ‡Π° Spring Framework 6.1, которая прСдоставляСт интСрфСйс JdbcClient, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ прямо Π² chain-Π²Ρ‹Π·ΠΎΠ²Π°Ρ….



ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° student с полями student_id (INT), student_name (VARCHAR(255)), age (INT), grade (INT), gender (VARCHAR(10)) ΠΈ state VARCHAR(100)



Объявим bean:



@Repository

class StudentDao {

@Autowired

private JdbcClient jdbcClient;

}




JdbcClient Π³ΠΎΡ‚ΠΎΠ² ΠΊ использованию.



Нам Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Π·Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:



int getCountOfStudentsOfGradeStateAndGenderWithNamedParam(int grade, String state, String gender) {

String sql = "select student_id, student_name, age, grade, gender, state from student where grade = :grade and state = :state and gender = :gender";

var countCallbackHandler = new RowCountCallbackHandler();

jdbcClient.sql(sql)

.param("grade", grade)

.param("state", state)

.param("gender", gender)

.query(countCallbackHandler);

return countCallbackHandler.getRowCount();

}




Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ запроса ΠΏΠΎ индСксу:



List<Student> getStudentsOfGradeStateAndGenderWithParamIndex(int grade, String state, String gender) {

String sql = "select student_id, student_name, age, grade, gender, state from student"

+ " where grade = ? and state = ? and gender = ?";

return jdbcClient.sql(sql)

.param(1, grade)

.param(2, state)

.param(3, gender)

.query(new StudentResultExtractor());

}




А Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ значСния ΠΏΠΎΠ»Π΅ΠΉ прямо ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса, Π½ΠΎ Π² этот Ρ€Π°Π· продСмонстрируСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° param(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ сопоставлСнии Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π‘Π” (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ использовании null-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ), послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ update():





Integer insertWithSetParamWithNamedParamAndSqlType(Student student) {

String sql = "INSERT INTO student (student_name, age, grade, gender, state) VALUES (:name, :age, :grade, :gender, :state)";

var noOfRowsAffected = this.jdbcClient.sql(sql)

.param("name", student.getStudentName(), Types.VARCHAR)

.param("age", student.getAge(), Types.INTEGER)

.param("grade", student.getGrade(), Types.INTEGER)

.param("gender", student.getStudentGender(), Types.VARCHAR)

.param("state", student.getState(), Types.VARCHAR)

.update()

return noOfRowsAffected;

}




МоТно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ Π² этом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ params() (Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Map Π² качСствС Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°):



Optional<Student> getStudentsOfGradeStateAndGenderWithParamsInList(List params) {

String sql = "select student_id, student_name, age, grade, gender, state from student"

+ " where grade = ? and state = ? and gender = ? limit 1";

return jdbcClient.sql(sql)

.params(params)

.query(new StudentRowMapper()).optional();

}




По ΠΈΡ‚ΠΎΠ³Ρƒ интСрфСйс JdbcClient ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ возмоТности JdbcTemplate ΠΈ NamedParameterJdbcTemplate, прСдоставляя Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JDBC. Благодаря этому ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ.



Π‘Ρ‚Π°Π²ΡŒΡ‚Π΅ πŸ”₯ Ссли Ρ„ΠΈΡ‡Π° каТСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ