编写SQL语句, 尤其是要插入多个Filed时, 是一件非常BT的事情, 至少让我很不爽,
使用preparedstatement可以使代码变得更优雅一些, 虽然会有些长, 但会更条理,
而且preparedstatement更高于SQL语句 – 相对来说不太容易随着数据库版本改变而变动.
另外preparedstatement效率更高, 安全性更好
下面是恐怖的SQL:
Statement statement = (Statement) conn.createStatement();
String sql = "INSERT INTO `DEP`.`employee` "
"( `name` , `age` , `address` , `isMale` , `level` ,
`Department_ID` ) "
"VALUES ("
"'" emp.getName() "', "
emp.getAge() ", "
JdbcUtilities.getSqlForString(emp.getAddress()) ", "
emp.getIsMale() ", "
emp.getLevel() ", "
emp.getDepartment_ID() ");"
;
log.debug("Executing sql :" sql);
statement.executeUpdate(sql);
ResultSet rs = statement.executeQuery("SELECT
last_insert_id();");// .execute("SELECT last_insert_id();");
if(rs.next()) {
System.out.println(rs.getInt("1"));
}
这里是使用PreparedStatement后的语句:
String psql = "INSERT INTO Employee (name, age, address, isMale,
level, Department_ID) VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement ps =
conn.prepareStatement(psql,Statement.RETURN_GENERATED_KEYS);
ps.setString(1, emp.getName());
ps.setInt(2, emp.getAge());
ps.setString(3, emp.getAddress());
ps.setInt(4, emp.getIsMale());
ps.setInt(5, emp.getLevel());
ps.setInt(6, emp.getDepartment_ID());
ps.executeUpdate();
ResultSet keys = ps.getGeneratedKeys(); // equivalent to "SELECT
last_insert_id();"
if(keys.next()) {
System.out.println(keys.getInt(1));
}
PreparedStatement的使用步骤:
声明 PreparedStatement。
PreparedStatement prepStmt;
将一条 SQL 语句指派给 PreparedStatement 对象。
prepStmt = conn.prepareStatement(
"INSERT INTO MyTable(MyColumn) values (?)");
为该语句指派输入参数值。
以下代码显示一个字符串参数。
String newValue;
// assign value
prepStmt.setStringParameter(1, newValue);
执行该语句。
返回值表示受该语句影响的行数。
long rowsInserted = prepStmt.executeStatement();
如果禁用了 [自动提交],请提交更改。
conn.commit();