SpringBoot 고급 편 JdbcTemplate 데이터 조회 다음 편
10645 단어 springbootspring
queryForMap
, queryForList
, queryForObject
본 편 은 나머지 두 가지 방법 을 계속 소개 하 였 다.I. 환경 준비
환경 은 여전히 앞의 설정 을 통 해 링크: 190407 - SpringBoot 고급 편 JdbcTemplate 의 데이터 삽입 사용 자세 상세 설명
프로젝트 원본 을 직접 보 거나:https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/101-jdbctemplate
우리 가 사용 한 데 이 터 를 조회 하 는 것 은 바로 앞 편 에 삽 입 된 결과 입 니 다. 다음 과 같 습 니 다.
II. 사용 설명 조회
1. queryForRowSet
상편 에서 소개 한 세 가지 방법 을 조회 하고 되 돌아 오 는 기록 에 대응 하 는 구 조 는 맵 이거 나
RowMapper
을 통 해 결 과 를 봉인 한다.한편, queryForRowSet
방법의 호출 은 SqlRowSet
대상 으로 되 돌아 가 는데 이것 은 집합 이다. 즉, 여러 개의 기록 을 조회 할 수 있다 는 것 이다.사용 자세 도 간단 하 다.
public void queryForRowSet() {
String sql = "select * from money where id > 1 limit 2";
SqlRowSet result = jdbcTemplate.queryForRowSet(sql);
while (result.next()) {
MoneyPO moneyPO = new MoneyPO();
moneyPO.setId(result.getInt("id"));
moneyPO.setName(result.getString("name"));
moneyPO.setMoney(result.getInt("money"));
moneyPO.setDeleted(result.getBoolean("is_deleted"));
moneyPO.setCreated(result.getDate("create_at").getTime());
moneyPO.setUpdated(result.getDate("update_at").getTime());
System.out.println("QueryForRowSet by DirectSql: " + moneyPO);
}
}
사용 자세 에 있어 서 이전 과 차이 가 크 지 않 고 sql 도 차지 하 는 방식 을 지원 합 니 다. 예 를 들 어
//
sql = "select * from money where id > ? limit ?";
result = jdbcTemplate.queryForRowSet(sql, 1, 2);
while (result.next()) {
MoneyPO moneyPO = new MoneyPO();
moneyPO.setId(result.getInt("id"));
moneyPO.setName(result.getString("name"));
moneyPO.setMoney(result.getInt("money"));
moneyPO.setDeleted(result.getBoolean("is_deleted"));
moneyPO.setCreated(result.getDate("create_at").getTime());
moneyPO.setUpdated(result.getDate("update_at").getTime());
System.out.println("QueryForRowSet by ? sql: " + moneyPO);
}
결과 처리 에 중점 을 두 고 교체 기 를 통 해 데 이 터 를 옮 겨 다 니 며 각 열 에 기 록 된 값 을 얻 는 방식 은 앞 과 마찬가지 로 번호 로 얻 을 수 있 습 니 다 (번 호 는 1 부터). 열 이름 을 만 드 는 방식 (db 열 이름) 도 있 습 니 다.
2. query
query 방법의 사용 에 대해 서로 다른 결과 처리 방식 으로 볼 때 네 가지 로 나 뉘 었 습 니 다. 다음은 하나씩 설명 하 겠 습 니 다.
a. 리 턴 방식
queryByCallBack
이러한 리 셋 방식 은 query 방법 은 결 과 를 되 돌려 주지 않 지만 리 셋 대상 에 전송 되 어야 합 니 다. 결 과 를 조회 한 후에 자동 으로 호출 됩 니 다.private void queryByCallBack() {
String sql = "select * from money where id > 1 limit 2";
// , ;
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
MoneyPO moneyPO = result2po(rs);
System.out.println("queryByCallBack: " + moneyPO);
}
});
}
위의 인 스 턴 스 코드 에서 리 셋 방법 에 ResultSet 대상 이 들 어 오 는 것 을 볼 수 있 습 니 다. PO 로 전환 하 는 방법 을 간단하게 패키지 할 수 있 습 니 다.
private MoneyPO result2po(ResultSet result) throws SQLException {
MoneyPO moneyPO = new MoneyPO();
moneyPO.setId(result.getInt("id"));
moneyPO.setName(result.getString("name"));
moneyPO.setMoney(result.getInt("money"));
moneyPO.setDeleted(result.getBoolean("is_deleted"));
moneyPO.setCreated(result.getDate("create_at").getTime());
moneyPO.setUpdated(result.getDate("update_at").getTime());
return moneyPO;
}
뒤의 테스트 에서 위 에서 두 줄 의 데 이 터 를 출력 하 는 것 을 볼 수 있다. 즉,
반환 결과 에서 모든 기록 은 위의 리 셋 방법 을 한 번 씩 실행 합 니 다. 즉, n 개의 데 이 터 를 되 돌려 주 고 위 에서 n 번 리 셋 을 실행 합 니 다.
b. 결과 일괄 처리
ResultSetExtractor
앞의 리 턴 방식 은 주로 상관 없 이 결 과 를 되 돌려 주 는 것 을 대상 으로 하 는데 여기 있 는 것 은 되 돌아 오 는 결 과 를 우리 가 기대 하 는 대상 으로 봉 한 다음 에 돌아 오 는 것 이다.private void queryByResultSet() {
String sql = "select * from money where id > 1 limit 2";
// extractData , , RowMapper
List result = jdbcTemplate.query(sql, new ResultSetExtractor>() {
@Override
public List extractData(ResultSet rs) throws SQLException, DataAccessException {
List list = new ArrayList<>();
while (rs.next()) {
list.add(result2po(rs));
}
return list;
}
});
System.out.println("queryByResultSet: " + result);
}
위 에서 사용 한 것 을 주의 하 십시오. 만약 에 여러 개의 데 이 터 를 되 돌려 준다 면 일반적인 매개 변수 유형
List>
에 주의 하 십시오. 쉽게 말 하면 이것 은 결 과 를 대량으로 전환 하 는 사용 장면 입 니 다.따라서 위의
extractData
방법 을 호출 할 때 들 어 오 는 것 은 여러 개의 데이터 이 므 로 자신 이 반복 해서 옮 겨 다 녀 야 하 며 첫 번 째 처럼 사용 할 수 없다.c. 결과 단행 처리
RowMapper
앞에서 대량으로 처리 한 이상 당연히 한 줄 의 전환 방식 도 있 습 니 다. 다음 과 같 습 니 다.private void queryByRowMapper() {
String sql = "select * from money where id > 1 limit 2";
// , mapRow ,
List result = jdbcTemplate.query(sql, new RowMapper() {
@Override
public MoneyPO mapRow(ResultSet rs, int rowNum) throws SQLException {
return result2po(rs);
}
});
System.out.println("queryByRowMapper: " + result);
}
실제 사용 에서
RowMapper
방식 으로 들 어 오 는 것 은 단일 기록, n 차 호출 이라는 것 만 기억 해 야 한다.그리고 ResultSetExtractor
방식 으로 들 어 온 모든 기록, 1 차 호출자리 차지 sql
앞에서 소개 한 몇 가 지 는 모두 sql 을 직접 쓰 는 것 입 니 다. 이것 은 당연히 추천 하 는 쓰기 가 아 닙 니 다. 더 흔히 볼 수 있 는 것 은 sql 을 차지 하 는 것 입 니 다. 전 참 교 체 를 통 해 이런 것들 은 앞의 박문 을 사용 하여 비교적 많이 소개 되 었 습 니 다. 여기 서 간단 한 프레젠테이션 을 드 리 겠 습 니 다.
private void queryByPlaceHolder() {
String sql = "select * from money where id > ? limit ?";
// , sql , ResultSetExtractor
List result = jdbcTemplate.query(sql, new RowMapper() {
@Override
public MoneyPO mapRow(ResultSet rs, int rowNum) throws SQLException {
return result2po(rs);
}
}, 1, 2);
System.out.println("queryByPlaceHolder: " + result);
}
e.
PreparedStatement
방식기록 을 삽입 할 때
PreparedStatement
이것 은 우리 가 많이 사용 합 니 다. 특히 홈 키 id 로 돌아 오 라 고 요구 할 때 이 를 떠 날 수 없습니다. 실제 조회 에서 도 이렇게 사용 할 수 있 습 니 다. 특히 사용 PreparedStatementCreator
에서 우 리 는 조회 한 db 연결 파 라미 터 를 설정 할 수 있 습 니 다.private void queryByPreparedStatement() {
// PreparedStatementCreator , ,
List result = jdbcTemplate.query(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
con.setReadOnly(true);
PreparedStatement statement = con.prepareStatement("select * from money where id > ? limit ?");
// id > 1
statement.setInt(1, 1);
// limit 2
statement.setInt(2, 2);
return statement;
}
}, new RowMapper() {
@Override
public MoneyPO mapRow(ResultSet rs, int rowNum) throws SQLException {
return result2po(rs);
}
});
System.out.println("queryByPreparedStatement: " + result);
}
위 는 전형 적 인 사용 케이스 입 니 다. 물론 실제 JdbcTemplate 를 사용 할 때 는 이렇게 하지 않 습 니 다.
f. 데이터 필드 를 찾 을 수 없 음
앞의 조회 에서 단일 조회 에서 결과 가 sql 에 명중 하지 않 으 면 이상 을 던 집 니 다. 여 기 는 요?
private void queryNoRecord() {
// ,
List result = jdbcTemplate
.query("select * from money where id > ? limit ?", new Object[]{100, 2}, new RowMapper() {
@Override
public MoneyPO mapRow(ResultSet rs, int rowNum) throws SQLException {
return result2po(rs);
}
});
System.out.println("queryNoRecord: " + result);
}
뒤의 출력 결 과 를 통 해 알 수 있 듯 이 기록 이 명중 되 지 않 았 을 때 아무런 관계 가 없 으 며 위 에 빈 집합 으로 돌아 갑 니 다.
III. 테스트 & 소결
1. 테스트
다음은 위의 출력 을 테스트 해 보 겠 습 니 다.
package com.git.hui.boot.jdbc;
import com.git.hui.boot.jdbc.insert.InsertService;
import com.git.hui.boot.jdbc.query.QueryService;
import com.git.hui.boot.jdbc.query.QueryServiceV2;
import com.git.hui.boot.jdbc.update.UpdateService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created by @author yihui in 11:04 19/4/4.
*/
@SpringBootApplication
public class Application {
private QueryServiceV2 queryServiceV2;
public Application(QueryServiceV2 queryServiceV2) {
this.queryServiceV2 = queryServiceV2;
queryTest2();
}
public void queryTest2() {
//
queryServiceV2.queryForRowSet();
queryServiceV2.query();
}
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
위 에서 출력 을 실행 한 결 과 는 다음 과 같다.
2. 소결
본 고 는 주로 다른 두 가지 조회 자 세 를 소개 했다.
queryForRowSet
과 query
queryForRowSet SqlRowSet
모든 결 과 를 가 져 와 야 합 니 다 ResultSetExtractor
RowMapper
PreparedStatementCreator
을 사용 하여 PreparedStatement
방식 으로 처리 합 니 다 관련 박문
2. 성명
책 을 믿 는 것 보다 못 하 다. 이상 의 내용 은 순 전 히 한 집안 의 말 이다. 개인의 능력 에 한계 가 있 기 때문에 누락 과 잘못된 점 이 있 을 수 밖 에 없다. 예 를 들 어 bug 를 발견 하거나 더 좋 은 건의 가 있 으 면 비판 과 지적 을 환영 하고 감사 하 는 마음 을 아 끼 지 않 는 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.