【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 请指正!

发布了83 篇原创文章 · 获赞 136 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43217942/article/details/104238720