关于PreparedStatementPreparedStatement
PreparedStatement已经伤害我好深,,,前不久做了个MVC的javaweb的比较大项目,因为是学期末的实训嘛,老师需要分组做,我原想搭好mvc的架构,包装起数据库操作方法,让其他人直接用就行,然后我就在DBsupport(数据库操作类)中屁颠屁颠的写了一个自认为很帅的方法:
protected ResultSet querSQL_a(String sql, Object... args)throws Exception
{
//  打开数据库连接的方法
openConnection();
// 建立PreparedStatement对象
PreparedStatement pStmt = conn.prepareStatement(sql);
// 为pStmt对象设置SQL参数值
//       1       ******
System.out.println("1:pStmt.toString():"+pStmt);
for (int i = 0; i < args.length; i++)
{
pStmt.setObject(i + 1, args[i].toString());
}
//       2       ******
System.out.println("2:pStmt.toString():"+pStmt);
rs = pStmt.executeQuery();// 执行SQL语句
return rs; // 返回结果集,如果执行的SQL语句不返回结果集,则返回null
}
原本就只有20课时,加上考试周一共不到两个周,我给自己挖好了坑,就跳下去了
PreparedStatement在我理解范围内不能用中文的字符串进行Object args的传参,占位符会有问题,比如说传进参数为“姓名”,2处输出该参数对应的占位符为??,就是说是实际上,PreparedStatement把中文字符串的个数当做是占位符显示"?"的个数。应该来说,我的mysql数据库编码为UTF-8,java文件和tomcat里也都是中文UTF-8编码,编码来说是没有问题的,所以我认为,PreparedStatement这个类中的占位符是不支持中文的。
PreparedStatement占位符所传进来的参数,即放在sql语句替换?的参数类型全部默认为String类型的,因为我分页用的sql语句中用的是limit x,y ,而limit关键字后面跟的参数必须是int ,这样也就直接导致我的分页无法使用。
一般情况下,我的这个方法还是比较好用的,我也深刻了解到,偷懒也需要技术的支持。