对数据库操作,主要是对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,使用更加灵活,把需要赋值的值用?代替,只需要在后面给占位符进行赋值就行了,这样逻辑跟清晰,代码复用性强。