编写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();
获得组后插入的ID, 在上面代码中已经包括.
默认下JDBC是Auto-commit的. 但在必要情况下, 我们需要手动控制事务, 此时:
con.setAutoCommit(false); //关闭自动Commit PreparedStatement updateSales = con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?"); updateSales.setInt(1, 50); updateSales.setString(2, "Colombian"); updateSales.executeUpdate();//执行Update Sales操作 PreparedStatement updateTotal = con.prepareStatement( "UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?"); updateTotal.setInt(1, 50); updateTotal.setString(2, "Colombian"); updateTotal.executeUpdate();//执行Update Total操作, 注意, 此二者必须同时执行成功 或同时失败. con.commit(); //commit以上两个操作, 同时成功或失败 con.setAutoCommit(true); //将AutoCommit恢复为true
1. Flex中的Trace, Java/Flex中的log, 并不能代表其真实行为.
2. 务必牢记重写toString方法
3. Flex: 在跨越幅度较大, 设计Obj较多时, 使用weakreference的 Event Listener
4. 关于weakreference, 相对普通reference来说, weakreference像一个棉线, 牵着Obj – 但不妨碍garage Collection, 而普通reference则像铁链一样牢牢绑着obj, 会阻止进行garage Collection. 如果一个Object只有weak reference指向他, 则基本可以视为已经被garage Collection,
5. 可以在每个Class中加入一个Object_ID Filed, 在构造函数中使用randomNumber填充 – 便于分辨对象
6. JDBC 的 traction不是线程安全的
7. 谨慎使用ArrayCollection, Array的sort, filter功能 – 因为这会打乱其自身. 在使用其作为DataProvider时, 应使用ListCollectionView, 这样在进行操作时则其本身不会有任何改变
// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.