SpringBoot 고급 편 JdbcTemplate 데이터 조회 다음 편

10645 단어 springbootspring
SpringBoot 고급 편 JdbcTemplate 의 데이터 조회 전편 에 서 는 JdbcTemplate 를 어떻게 사용 하여 간단 한 조회 조작 을 하 는 지 에 대해 설명 하 였 으 며, 주로 세 가지 방법의 호출 자세 queryForMap, queryForList, queryForObject 본 편 은 나머지 두 가지 방법 을 계속 소개 하 였 다.
  • queryForRowSet
  • query

  • 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. 소결
    본 고 는 주로 다른 두 가지 조회 자 세 를 소개 했다. queryForRowSetqueryqueryForRowSet
  • 대상 을 되 돌려 주 고 SqlRowSet 모든 결 과 를 가 져 와 야 합 니 다
  • query
  • 세 가지 결과 처리 방식 제공
  • 결 과 를 되 돌려 주지 않 는 리 턴 자세
  • 결과 에 대한 대량 처리 방식 ResultSetExtractor
  • 결과 에 대한 단일 교체 처리 방식 RowMapper
  • 되 돌 릴 수 있 습 니 다 > = 0 개 데이터
  • 조회 의 연결 매개 변 수 를 설정 하려 면 PreparedStatementCreator 을 사용 하여 PreparedStatement 방식 으로 처리 합 니 다
  • IV. 기타
    관련 박문
  • 190407 - SpringBoot 고급 편 JdbcTemplate 의 데이터 삽입 사용 자세 상세 설명
  • 190412 - SpringBoot 고급 편 JdbcTemplate 데이터 조회 전편
  • 공사:https://github.com/liuyueyi/spring-boot-demo
  • 항목:https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/101-jdbctemplate

  • 2. 성명
    책 을 믿 는 것 보다 못 하 다. 이상 의 내용 은 순 전 히 한 집안 의 말 이다. 개인의 능력 에 한계 가 있 기 때문에 누락 과 잘못된 점 이 있 을 수 밖 에 없다. 예 를 들 어 bug 를 발견 하거나 더 좋 은 건의 가 있 으 면 비판 과 지적 을 환영 하고 감사 하 는 마음 을 아 끼 지 않 는 다.
  • 회색 블 로그 개인 블 로그https://blog.hhui.top
  • 회색 블 로그 - Spring 테마 블 로그http://spring.hhui.top
  • 웨 이 보 주소: 그레이 블 로그
  • QQ: 회색 / 3302797840
  • 좋은 웹페이지 즐겨찾기