美文网首页
Spring NamedParameterJdbcTemplat

Spring NamedParameterJdbcTemplat

作者: 文景大大 | 来源:发表于2019-02-22 18:08 被阅读0次

    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<String,Object> 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<String,Object>,其实,还可以使用如下几种类型:

    • 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 NamedParameterJdbcTemplat

          本文链接:https://www.haomeiwen.com/subject/cztyyqtx.html