Table of Contents
jdbcTemplate更新操作update/delete...
本篇博客基于java8.
概述
Spring框架提供了可扩展的SQL数据库的支持。然而spring的东西使用久了之后,如果不去了解背后的原理的话可能越来越迷糊,本篇博客的目的是为了 分析spring框架如何实现的和各种数据库在各种场景下的连接配置的问题。我们将从最原生java数据库连接讲起。
java原生JDBC
相信不少学习java的朋友在第一次接触数据库的时候,一定都接触过最原生的数据库连接,以mysql为例,大致代码按如下:
-
try{
-
//加载JDBC驱动程序:
-
Class.forName(
"com.mysql.jdbc.Driver");
-
-
String url =
"jdbc:mysql://127.0.0.1:3306/dbname";
-
String username =
"";
-
String password =
"";
-
-
// 创建与MySQL数据库的连接类的实例
-
Connection conn = DriverManager.getConnection(url, username, password);
-
-
// 用conn创建Statement对象类实例
-
Statement sql_statement = conn.createStatement();
-
-
// 执行sql
-
ResultSet result = sql_statement.executeQuery(query);
-
//处理结果
-
...
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
if (conn !=
null) {
-
// 关闭连接
-
try {
-
conn.close();
-
System.out.println(
"Database connection terminated");
-
}
catch (Exception e) {
/* ignore close errors */
-
}
-
}
-
}
上面的代码就是纯jdbc的连接数据库代码,只需安装jdk导入java 的原生包就可以写出来,不需要使用任何第三方的包。
上述代码主要有下面这几个步骤:
- 加载JDBC驱动程序
- 创建数据库的连接(需要用户名密码等信息)
- 创建一个Statement
- 执行SQL语句(处理结果)
- 处理异常,关闭连接
上面的代码可以看出一些问题,比如模版代码过多,对于一个用户来说,他可能只是想执行一条sql语句,并不想关心其他连接,异常处理,加载驱动的问题。我们可以很容易想到的是,如果有一个方法或者一个工具,让用户可以只需要指定好数据库连接信息,就可以执行各种数据库操作,岂不是非常好吗?这就是框架开发这想做的事情。
JdbcTemplate
JdbcTemplate是spring提供的最经典也是最流行的jdbc实现方式之一。现在除了JdbcTemplate之外,还有SimpleJdbcInsert,SimpleJdbcCall两个更新的实现方式。
JdbcTemplate是“最底层”的方法,所有其他spring的方法在他们的包装之下都使用了JdbcTemplate。
JdbcTemplate是spring JDBC core这个包中的重点类。 它处理资源的创建和释放,帮助我们避免常见错误,例如上面直接使用java原生代码而忘记关闭连接。 它执行核心JDBC工作流的基本任务(例如语句创建和执行),应用程序代码只需要提供SQL并提取结果。 JdbcTemplate类主要包含下面这些功能:
- 执行SQL查询语句
- 执行更新语句和存储过程调用
- 对ResultSet实例执行迭代并提取返回的参数值。
- 捕获JDBC异常并将它们转换为org.springframework.dao packag中定义的通用的,信息量更大的异常层次结构。
使用jdbcTemplate需要配置datasource。使用spring ioc容器的话,则可以把datasource配置为一个bean,直接让数据库操作的时候引用即可。spring文档特别指出:应始终将DataSource配置为Spring IoC容器中的bean。这说明spring对于ioc容器中的datasource bean提供了非常多方便的功能。
我们可以使用jdbcTemplate来执行查询,更新,以及一些其他操作。如下:
jdbcTemplate查询query
下面的例子是返回数据的数量
int rowCount = this.jdbcTemplate.queryForObject("select count(*) from t_actor", Integer.class);
下面的查询是返回一个字符串:
-
String lastName =
this.jdbcTemplate.queryForObject(
-
"select last_name from t_actor where id = ?",
-
new Object[]{
1212L}, String.class);
也可以查询并填充单个对象:
-
Actor actor =
this.jdbcTemplate.queryForObject(
-
"select first_name, last_name from t_actor where id = ?",
-