使用预编译语句Statement和PreparedStatment

为什么使用预编译语句

对数据库操作,主要是对sql语句的操作。这里就用到了封装的思想,如果不把它封装成对象,每次进行操作要写好多的执行语句。我们先使用静态语句对象。这里会用到前面写到的jdbc连接数据库,用兴趣的可以去看一下。

public void saveByStatement() throws Exception {
	String sql = "insert into t_student (name,age) values ('AA',11)";
	Connection conn = JdbcUtil.getConn();//获取连接
	Statement st = conn.createStatement();//获取预编译语句
	st.executeUpdate(sql);//执行预编译语句
	JdbcUtil.close(conn,st,null);//释放资源
}
这里的sql语句是写死的,局限性比较小,如果需要换个功能,又要写新的sql语句,重复的代码比较多,我们把sql语句做成模板,只需要设置里面的参数。

public void saveByPreparedStatement()  throws Exception {
String sql = "insert into t_student (name,age) values (?,?)";//这里的问号是参数,后面会给参数进行赋值
Connection conn = JdbcUtil.getConn();//获取连接
PreparedStatement  ps = conn.prepareStatement(sql);//创建预编译语句对象
//执行之前需要给占位符设置值,这里面不是从0开始的,是从1开始的
ps.setString(1,"AA");//设置第一个?的值为AA
ps.setInt(2,12);//设置第二个?的值为12
ps.exexuteUpdate();//执行预编译语句
jdbcUtil.close(conn,ps,null);//释放资源
}  

给占位符赋值

做到这里我们可以抽取出一个方法,把sql语句和占位符参数值当成参数,当我们使用它的时候只需要传一个sql语句,占位符参数就行了。这里又遇到了一个问题,参数不固定怎么办。这里就用到不定参数的传递。原理就是一个数组,循环遍历数组里的数据,把它赋值给占位符。

public static int update(String sql, Object... params) {//sql语句和参数值
		Connection conn = null;
		PreparedStatement ps = null;//因为try只能把他两往上提升
		try {
			conn = JdbcUtil.getConn();//获取连接
			ps = conn.prepareStatement(sql);获取预编译语句对象
			// 设置占位符参数
			for (int index = 0; index < params.length; index++) {
				// setObject方法:第一个参数是第1个?,第二个参数是占位符参数值
				ps.setObject(index + 1, params[index]);
			}
			return ps.executeUpdate();//返回受影响的行数,可以依此判断是否对数据库操作成功
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			JdbcUtil.close(conn, ps, null);//关闭连接
		}
		return 0;
	}

总结

PreparedStatement相比Statement,使用更加灵活,把需要赋值的值用?代替,只需要在后面给占位符进行赋值就行了,这样逻辑跟清晰,代码复用性强。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券