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还有很多其它的方法可供使用,本文没有一一列出。
网友评论