@[TOC](Spring JDBC(JDBCTemplate))
前情提要: JDBC数据库连接池.
在上一篇中数据库连接池虽然已经对JDBC的连接和释放做了优化,避免了资源的浪费,但在数据的操作上并未做出任何的改善,特别是在查询封装数据时更为麻烦。
举个例子,获取封装一个学生信息表,则需要将数据每一行中的每一列取出来再封装到学生类中打包到列表中,需要一大串的代码,麻烦且复杂
public static void main(String[] args) {
Connection connection = DruidUtils.getConnection();
try {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from b");
List<Student> list = new ArrayList<>();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String sex = resultSet.getString("sex");
String local = resultSet.getString("local");
String phone = resultSet.getString("phone");
Student student = new Student();
student.setId(id);
student.setName(name);
student.setAge(age);
student.setLocal(local);
student.setPhone(phone);
student.setSex(sex);
list.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
本文所有资源都可到百度云下载
链接:https://pan.baidu.com/s/1EkEXRoMTiRN1GvXrGAx62g
提取码:j872
由spring框架对JDBC的简单封装,提供一个JDBCTemplate对象简化JDBC的数据操作。
需要依赖于连接池的数据源DataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidUtils.getDataSource());
JDBCTemplate采用了PreparedStatement预先编译,提高 SQL 的执行效率和避免sql注入攻击,sql语句的数据采用?占位符代替
增删改返回的结果都为影响数据表的行数
jdbcTemplate.update("INSERT INTO b VALUES(?,?,?,?,?,?)", null, "a", 10, "男", "北京", "111");
jdbcTemplate.update("DELETE FROM b WHERE id=?", 1);
jdbcTemplate.update("UPDATE b SET age=? WHERE id=?", 20, 2);
jdbcTemplate.queryForMap("select * from b");
则会发生IncorrectResultSizeDataAccessException异常,因为queryForMap期望获取的结果大小为1,可是返回的结果且为4
正确示范:
Map<String, Object> map = jdbcTemplate.queryForMap("select * from b where id = ?", 2);
Set<String> set = map.keySet();
for (String s : set)
System.out.println(s + ": " + map.get(s));
List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from b");
for (Map<String, Object> map : list) {
Set<String> set = map.keySet();
for (String s : set)
System.out.print(s + ": " + map.get(s) + " ");
System.out.println();//换行
}
resultSet为sql语句查询数据的结果集
i表示第几行数据,从0开始
List<Student> query = jdbcTemplate.query("select * from b", new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
student.setSex(resultSet.getString("sex"));
student.setLocal(resultSet.getString("local"));
student.setPhone(resultSet.getString("phone"));
return student;
}
});
这中手动封装的方式和前面的一样的复杂。
List<Student> query = jdbcTemplate.query("select * from b", new BeanPropertyRowMapper<Student>(Student.class));
注意:JavaBean中的属性都应该为引用数据类型,因为数据表的数据可能为null,当属性为基本数据类型(int)时不可赋值null,则会出现数据类型转换错误
Integer lenght = jdbcTemplate.queryForObject("SELECT COUNT(ID) FROM b", Integer.class);