Spring NamedParameterJdbcTemplate的使用实例

Spring JdbcTemplate使用实例
Spring JdbcTemplate中关于RowMapper的使用实例
在原先使用JdbcTemplate的使用实例中,我们看到,SQL语句中的参数占位符都是?,当参数只有一个的时候,也许我们看不出什么问题,但是,当参数有了多个,你是否会觉得眼花缭乱呢?甚至,一不小心,我们很容易搞错参数的赋值顺序。

    @Override
    public int addStudent(Student student) {
        String sql = "insert into test_student(name,gender,age,address,email,grade)values(?,?,?,?,?,?)";
        return jdbcTemplate.update(sql, student.getName(), student.getGender(), student.getAge(), student.getAddress(), student.getEmail(), student.getGrade());
    }

为了解决这个问题,Spring JDBC提供了NamedParameterJdbcTemplate,这个看名字就大致能猜出来,就是为了解决SQL语句中,可以使用命名化的参数来替代原先的问号占位符。

说那么多,我们来直观地感受一下:

    @Override
    public Student getStudentByName3(String name) {
        // 此处使用命名化参数来替代问号占位符
        String sql = "select name, gender from test_student where name = :name";
        Map paramMap = new HashMap<>(16);
        paramMap.put("name", name);
        return this.template.queryForObject(sql, paramMap, new BeanPropertyRowMapper<>(Student.class));
    }
    @Test
    public void getStudentByName3(){
        Student student = studentService.getStudentByName3("杜甫");
        assertEquals("杜甫", student.getName());
        assertEquals("男", student.getGender());
    }

其好处,我们能直观地感受到,再也不用一个个地对照参数的顺序了,想改哪个参数都能快速定位到。

然而,使用NamedParameterJdbcTemplate也是有要求的,具体的要求其实就体现在执行sql时,提供参数的对象上,也就是上面代码示例中的paramMap,此处,参数的类型是一个Map,其实,还可以使用如下几种类型:

  • MapSqlParameterSource

        @Override
        public Student getStudentByName(String name) {
            String sql = "select name, gender from test_student where name = :name";
            // 使用MapSqlParameterSource来存放查询参数,可以使用一个map初始化它,也可以在方法后使用add方法来增加参数
            SqlParameterSource namedParameters = new MapSqlParameterSource("name", name);
            return this.template.queryForObject(sql, namedParameters, new BeanPropertyRowMapper<>(Student.class));
        }
    
        @Test
        public void getStudentByName(){
            Student student = studentService.getStudentByName("杜甫");
            assertEquals("杜甫", student.getName());
            assertEquals("男", student.getGender());
        }
    
  • BeanPropertySqlParameterSource

        @Override
        public Student getStudentByName2(String name) {
            String sql = "select name, gender from test_student where name = :name";
            // 使用BeanPropertySqlParameterSource来存放查询参数
            Student paramStudent = new Student();
            paramStudent.setName(name);
            SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(paramStudent);
            return this.template.queryForObject(sql, namedParameters, new BeanPropertyRowMapper<>(Student.class));
        }
    
        @Test
        public void getStudentByName2(){
            Student student = studentService.getStudentByName2("杜甫");
            assertEquals("杜甫", student.getName());
            assertEquals("男", student.getGender());
        }
    
  • EmptySqlParameterSource

        @Override
        public int countStudent() {
            String sql = "select count(*) from test_student where name = '杜甫'";
            return this.template.queryForObject(sql, new EmptySqlParameterSource(), Integer.class);
        }
    
        @Test
        public void countStudentByName() {
            Integer cnt = studentService.countStudent();
            assertEquals(new Integer("1"), cnt);
        }
    

当然,NamedParameterJdbcTemplate还有很多其它的方法可供使用,本文没有一一列出。

你可能感兴趣的:(Spring NamedParameterJdbcTemplate的使用实例)