实现MyJdbcTemplate框架中的Update方法
1.什么是JdbcTemplate
JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。JdbcTemplate就是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。 JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。 Spring源码地址:源码地址
2.如何搭建JdbcTemplate环境
2.1 JdbcTemplate所需jar包
2.2 将jar导入工程lib目录下,并添加关联
选中右键找到Add as Library进行关联
2.3 获取连接
获取连接有多种方式,有最原始的jdbc方式,自己注册驱动,进行指定数据库,进行获取连接。封装成工具类JdbcUtil,但会因为频繁创建connection造成数据库资源浪费。故采用开源的数据库连接池,C3P0/Druid。相比下,阿里巴巴旗下的德鲁伊(Druid)性能更优一些。
注:Druid数据库连接池的介绍及如何配置,后面会有一篇专门的博客进行详解,此处仅提供一个DruidJdbcUtil连接工具类源码。
3.进行自定义框架
3.1 DruidJdbcUtil工具类
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DruidJdbcUtil {
static DruidDataSource dataSource;
static {
Properties properties = new Properties();
try{
properties.load(new FileInputStream("druiddb.properties"));
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
}catch (Exception e){
e.printStackTrace();
}
}
//获取数据源
public static DataSource getDataSource(){
return dataSource;
}
//获取连接
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//释放资源
public static void release(ResultSet rs, Statement st, Connection conn)
{
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(st!=null)
{
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st=null;
}
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
3.2 编写MyJdbcTemplate类
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class MyJdbcTemplate {
private DataSource mDataSource;
public MyJdbcTemplate(DataSource dataSource) {
this.mDataSource = dataSource;
}
public int update(String sql, Object... args) {
int updateCount = 0;
//程序执行可能会发生异常,故我们使用try-catch进行对异常的处理
try {
//获取连接
Connection connection = mDataSource.getConnection();
//预编译对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//获取元数据,即数据库表的字段
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
//通过ParameterMetaData中的getParameterCount()方法,可以获取sql语句中?的个数,即可以确定所需参数的个数
int parameterCount = parameterMetaData.getParameterCount();
//通过for循环去动态设置所需参数
for (int i = 0; i < parameterCount; i++) {
//setObject()方法一般只会在写框架底层中使用
preparedStatement.setObject(i + 1, args[i]);
}
//通过preparedStatement去执行executeUpdate()方法返回受影响的行数
updateCount = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
//最后方法返回一个int类型数据,将受影响的行数返回
return updateCount;
}
}
通过下面的JdbcTemplate框架的实现案例,结合代码注解,进行程序理解。
分析:在JdbcTemplate框架中,如果要实现update方法,只需获取连接,使用update方法即可,提供示例如下
// JDBCTemplate删除数据
public static void test03() throws Exception {
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidJdbcUtil.getDataSource());
String sql = "DELETE FROM product WHERE pid=?;";
int i = jdbcTemplate.update(sql, 7);
System.out.println("影响的行数: " + i);
}
由图可知,我们要实现自定义的JdbcTemplate框架,只需实现有参的JdbcTemplate(DataSource dataSource)以及 update(sql,Object… args)两个方法即可,其中 dataSource是获取连接的数据源(会有专门的博客进行介绍,目前理解为获取连接的容器即可),Object… args为可变参数,类型为Object(即可接收任意类型的数据)
4. 对框架测试
框架测试使用数据库并未提供,所以可以自行准备测试数据库,及测试数据,并不会影响测试。
//测试代码如下:
public class Test {
public static void main(String[] args) {
MyJdbcTemplate jdbcTemplate = new MyJdbcTemplate(DruidJdbcUtil.getDataSource());
String sql = "DELETE FROM product WHERE pid=?;";
int i = jdbcTemplate.update(sql, 6);
System.out.println("影响的行数: " + i);
}
}
通过测试可知,我们通过自定义的框架,同样实现了功能。
以上就是对自定义JdbcTemplate框架实现update方法的简单实现。