我在自己写一个JDBC工具类。但卡在了update方法的实现。工具类目前的代码如下:
public final class HDBTools {
// 数据库url,username,password
private static String URL = "jdbc:mysql://localhost:3306/shiyan?" + "useUnicode=true&characterEncoding=UTF8";
private static String URN = "root";
private static String PSW = "root";
private static HDBTools hdb = null;
private HDBTools(){}
// 单例模式
public static HDBTools getHDBTools() {
// 延迟加载
if (hdb == null) {
// 双重锁,防止多个线程同时访问
synchronized (HDBTools.class) {
// 双重锁,调度程序的偶然情况
if (hdb == null) {
hdb = new HDBTools();
}
}
}
return hdb;
}
// 静态代码块
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 链接
private Connection conn = null;
// 结果集
private ResultSet resultSet = null;
// 语句
private PreparedStatement preparedstatement = null;
//get the connection of database
private Connection getConn() throws SQLException {
return DriverManager.getConnection(URL, URN, PSW);
}
public List<Map<String,Object>> findAll(String sql,Object[] objs) throws SQLException{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
conn = getConn();
preparedstatement = (PreparedStatement) conn.prepareStatement(sql);
for(int i = 0;i<objs.length;i++){
preparedstatement.setObject(i+1, objs[i]);
}
resultSet = (ResultSet) preparedstatement.executeQuery();
ResultSetMetaData rsmd = preparedstatement.getMetaData();
// 取得结果集列数
int columnCount = rsmd.getColumnCount();
Map<String, Object> data = null;
while(resultSet.next()){
data = new HashMap<String, Object>();
// 每循环一条将列名和列值存入Map
for (int i = 1; i < columnCount; i++) {
data.put(rsmd.getColumnLabel(i), resultSet.getObject(rsmd.getColumnLabel(i)));
}
// 将整条数据的Map存入到List中
list.add(data);
}
close(resultSet, preparedstatement, conn);
return list;
}
public int update(String sql,Object[] objs) throws SQLException{
conn = getConn();
preparedstatement = (PreparedStatement) conn.prepareStatement(sql);
for(int i = 0;i<objs.length;i++){
preparedstatement.setObject(i+1, objs[i]);
}
System.out.println(preparedstatement);
int rows = preparedstatement.executeUpdate(sql);
close(resultSet, preparedstatement, conn);
return rows;
}
public void close(ResultSet rs, PreparedStatement pst, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pst != null) {
pst.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
测试代码如下:
HDBTools hdbt = HDBTools.getHDBTools();
int i = hdbt.update("insert into stu (name,address,money) values (?,?,?)", new Object[]{"hanshuai","changchun",10000});
System.out.println(i);
运行测试代码,预处理完成的SQL语句以及出现的异常如下:
com.mysql.jdbc.PreparedStatement@14b2db7: insert into stu (name,address,money) values ('hanshuai','changchun',10000)
Exception in thread "main" com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?)' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260)
at com.shuai.utils.jdbc.HDBTools.update(HDBTools.java:101)
at com.shuai.utils.jdbc.Demo.main(Demo.java:12)
异常说,我的SQL 语句有问题,但是我将预处理后的SQL语句输出到控制台(见控制台结果第一行),将控制台SQL语句拷贝到SQL yang 中,运行数据添加成功。也就是说SQL语句没有问题。我感觉是我对preparedstatement.executeUpdate方法的理解出现了问题。希望各路大神不吝赐教。