Savepoints 只能用于局部事物,全局事物不支持
Connection.setSavepoint 返回一个java.sql.Savepoint对象
getSavepointName 用于有名字的, getSavepointId用于没名字的,互换会报错
Connection.rollback(Savepoint svpt) 返回到回滚点Connection.releaseSavepoint(Savepoint svpt) 释放掉
一旦commit或rollback,这个事物中的所有回滚点都自动释放
rollback到某个回滚点后,这个回滚点之后的那些将自动释放
获取自动生成的key值功能,只支持insert语句
/** SQL statements for creating an ORDERS table and a sequence for generating the * ORDER_ID. * * CREATE TABLE ORDERS (ORDER_ID NUMBER, CUSTOMER_ID NUMBER, ISBN NUMBER, * DESCRIPTION NCHAR(5)) * * CREATE SEQUENCE SEQ01 INCREMENT BY 1 START WITH 1000 */ // Create a PreparedStatement for inserting a row into the ORDERS table. OraclePreparedStatement pstmt = (OraclePreparedStatement) conn.prepareStatement("INSERT INTO ORDERS (ORDER_ID, CUSTOMER_ID, ISBN, DESCRIPTION) VALUES (SEQ01.NEXTVAL, 101,//用序列自动生成主键 966431502, ?)", cols); String s = new String(c); pstmt.setNString(1, s); pstmt.executeUpdate(); ResultSet rset = pstmt.getGeneratedKeys();//获得自动生成的值,返回结果集对象
但批更新时不可用
返回的ResultSet只能用序号得到里面的内容
如果显示指明了Statement.RETURN_GENERATED_KEYS 标志,则要用"rowid"列名访问
Oracle只支持 HOLD_CURSORS_OVER_COMMIT模式
从数据库中取出的数据到底要用什么java类型表示呢?
1.通常来说,尽量使用java标准类型
2.要保留浮点的准确值,用oracle.sql.NUMBER,不要用java.lang.Double
3.为了提高性能时,用oracle.sql.NUMBER,不要用java.math.BigDecimal
4.JDK6以后,用java.sql.Date和java.sql.Timestamp表时间
5.Oracle特有的就用Oracle的,符合规范的就用java的
sql里的null会转为java的null,所以不要使用原始类型获取null值,会变成0
PreparedStatement pstmt = conn.prepareStatement( "SELECT * FROM EMPLOYEES WHERE COMMISSION_PCT = ?"); //这里无法处理null的传入,会报错 pstmt.setNull(1, java.sql.Types.VARCHAR);
ResultSet rset = stmt.executeQuery("SELECT employees.department_id, department.department_id FROM employees, department"); rset.getInt("employees.department_id");//这个不能用全名,或者用序号,或者起个别名
getBoolean会在底层等于0时返回false,其他值都返回true
void setNull(int parameterIndex, int sqlType)不能用于REF, ARRAY, or STRUCT
void setNull(int parameterIndex, int sqlType, String sql_type_name) 这个可以