【Spring】JdbcTemplate函數接口方法:RowMaper、RowCallbackhandler、ResultSetExtractor、PreparedStatementCreator

RowMaper的使用

    /**
     * RowMaper Test
     */
    @Test
    public void test_RowMapper() {
        //學生成績表字段映射類 -- 局部內部類
        class Score{
            private Integer id;
            private String sid;
            private Integer chinese;
            private Integer math;
            private Integer english;

            public Integer getId() {
                return id;
            }

            public void setId(Integer id) {
                this.id = id;
            }

            public String getSid() {
                return sid;
            }

            public void setSid(String sid) {
                this.sid = sid;
            }

            public Integer getChinese() {
                return chinese;
            }

            public void setChinese(Integer chinese) {
                this.chinese = chinese;
            }

            public Integer getMath() {
                return math;
            }

            public void setMath(Integer math) {
                this.math = math;
            }

            public Integer getEnglish() {
                return english;
            }

            public void setEnglish(Integer english) {
                this.english = english;
            }

            @Override
            public String toString() {
                return "Score{" +
                        "id=" + id +
                        ", sid='" + sid + '\'' +
                        ", chinese=" + chinese +
                        ", math=" + math +
                        ", english=" + english +
                        '}';
            }
        }

        // query(String sql, RowMapper<T> rowMapper); ==> List<T>
        template.query
        List<Score> score_list = template.query("select * from t_score", new RowMapper<Score>() {
            @Override
            public Score mapRow(ResultSet resultSet, int i) throws SQLException {
                // i 爲 當前記錄(一條記錄一個set)的index(索引)
                System.out.println(i);

                Score s = new Score();
                s.setId(resultSet.getInt(1));
                s.setSid(resultSet.getString(2));
                s.setChinese(resultSet.getInt(3));
                s.setMath(resultSet.getInt(4));
                s.setEnglish(resultSet.getInt(5));

                //返回,最終會存儲到List<Score>
                return s;
            }
        });

        score_list.forEach(System.out::println);
        
//  輸出
//        0
//        1
//        2
//        3
//        4
//        Score{id=1, sid='20181515114', chinese=54, math=54, english=96}
//        Score{id=2, sid='20181515101', chinese=55, math=80, english=99}
//        Score{id=3, sid='20181515102', chinese=98, math=88, english=79}
//        Score{id=4, sid='20181515105', chinese=80, math=80, english=78}
//        Score{id=7, sid='20181515103', chinese=50, math=20, english=88}
    }

RowCallbackhandler的使用

RowCallbackHandler函數回調可以獲取到ResultSet結果, 用戶對其處理後可直接對數據庫中的數據進行更新.

    /**
     * RowCallbackhandler
     */
    @Test
    public void test_RowCallbackhandler() {
        //RowCallbackHandler函數回調可以獲取到ResultSet結果, 用戶對其處理後可直接對數據庫中的數據進行更新.
        // query(String sql, RowCallbackHandler rch)  ==> void
        template.query("", new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet resultSet) throws SQLException {
                // TODO 操作resultSet
            }
        });

    }

ResultSetExtractor的使用

   /**
     * ResultSetExtractor
     */
    @Test
    public void test_ResultSetExtractor() {
    
        Score score = template.query("select * from t_score where id=?", new ResultSetExtractor<Score>() {
            @Override
            public Score extractData(ResultSet resultSet) throws SQLException, DataAccessException {
                if(!resultSet.isFirst())resultSet.next();
                Score s = new Score();
                s.setId(resultSet.getInt(1));
                s.setSid(resultSet.getString(2));
                s.setChinese(resultSet.getInt(3));
                s.setMath(resultSet.getInt(4));
                s.setEnglish(resultSet.getInt(5));

                //返回,最終會存儲到Score
                return s;
            }
        }, 1);
        System.out.println(score);//Score{id=1, sid='20181515114', chinese=54, math=54, english=96}

    }

PreparedStatementCreator的使用

    /**
     * PreparedStatementCreator
     */
    @Test
    public void test_PreparedStatementCreator() {
        // query(PreparedStatementCreator psc,RowCallbackHandler rch); ==> void
        String sql = "select * from t_score where english>=?";
        template.query(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

                //在這裏可以拿到connection對象來創建PreparedStatement對象來執行更復雜的SQL操作.
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setInt(1,80);
                return ps;
            }
        }, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet resultSet) throws SQLException {
                // TODO 操作resultSet
            }
        });

    }

PreparedStatementSetter的使用


    /**
     * PreparedStatementSetter
     */
    @Test
    public void test_PreparedStatementSetter() {
        // query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse); ==> T
        Score score = template.query("select * from t_score where id=?", new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                // 執行預處理操作
                preparedStatement.setInt(1,1);
            }
        }, new ResultSetExtractor<Score>() {
            @Override
            public Score extractData(ResultSet resultSet) throws SQLException, DataAccessException {
                if(!resultSet.isFirst())resultSet.next();
                Score s = new Score();
                s.setId(resultSet.getInt(1));
                s.setSid(resultSet.getString(2));
                s.setChinese(resultSet.getInt(3));
                s.setMath(resultSet.getInt(4));
                s.setEnglish(resultSet.getInt(5));

                //返回,最終會存儲到Score
                return s;
            }
        });
        System.out.println(score);//output: Score{id=1, sid='20181515114', chinese=54, math=54, english=96}
    }

ConnectionCallback的使用

    /**
     * ConnectionCallback
     */
    @Test
    public void test_ConnectionCallback() {
        // execute(ConnectionCallback<T> action);  ==> T
        Score score = template.execute(new ConnectionCallback<Score>() {
            @Override
            public Score doInConnection(Connection connection) throws SQLException, DataAccessException {
                //在這裏可以得到Connection對象
                //然後通過Connection對象創建PreparedStatement對象
                //執行SQL操作獲得ResultSet對象
                //示例話Score對象,賦值並返回
                return ScoreInstance;
            }
        });

    }

StatementCallback

    /**
     * StatementCallback
     */
    @Test
    public void test_StatementCallback() {
        // execute(StatementCallback<T> action); ==> T
        Score score = template.execute(new StatementCallback<Score>() {
            @Override
            public Score doInStatement(Statement statement) throws SQLException, DataAccessException {
                //通過statement執行SQL語句 並 獲得ResultSet對象
                //實例例話Score對象,賦值並返回
                return scoreInstance;
            }
        });

    }

RowMapper與RowCountCallbackHandler使用對比

在這裏插入圖片描述
引自:https://blog.csdn.net/u013476542/article/details/53257788

總結

通過上面大量的示例我們可以看到一種編程方式:函數接口式編程. 這種編程方式爲我們提供了更靈活的編程方式, 從而使JdbcTemplate變的更加普適.

優點:

  • 使方法的使用者有了更多的選擇
  • 可以使工具類變的更加普適(適應更多需求)
  • 可以使調用者獲取類內部數據, 進而進行操作

Q&A 請指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章