事务(ACID):
1、 原子性(atomicity):组成事物处理的语句形成了一个逻辑单元,不能只执行其中的一部分;
2、 一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)
3、 隔离性(isolcation):一个事务处理对另一个事务处理的影响;
4、 持续性(durability):事务处理的效果能够被永久保存下来;
Connection.setAutoCommit(false);--à打开事务
Connection.commit( );--à提交事务
Connection.rollback( );--à回滚事务
保存点(SavePoint)
1、 当只想撤销事务中的部分操作时可使用SavePoint
2、 SavePoint sp=connection.setSavePoint( );
3、 Connection.rollback(sp);connection.commit( );
JTA:
1、 跨越多个数据源的事务,使用JTA容器实现事务;
2、 分成两阶段提交
Javax.transaction.UserTransaction tx=(UserTransaction)ctx.lookup(“jndiName”);
Tx.begin( );
隔离级别:读未提交(Read uncommitted)、读已提交(Read committed)、
可重复读(Repeatable read)、可串行化(Serializable)--à脏读、不可重复读、幻读
批处理:PreparedStatement,addBatch( );
PreparedStatement.executeBatch( );
可滚动的结果集:
Statement st=connection.createStatement(Result.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery(sql);
rs.beforeFirst( );rs.afterLast( );rs.first( );rs.isFirst( );rs.last( );rs.isLast( );rs.absolute(9);
rs.moveToInsertRow( );
可更新的结果集:
Conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rs.updataString(“col name”,”new value”);
rs.updataRow( );
DatabaseMetaData(数据库的元数据信息)和ParameterMetaData(参数的元数据信息)
1、 DatabaseMetaData meta=connection.getMetaData( );
2、 通过DatabaseMetaData可以获得数据库相关的信息,如:数据库版本、数据库名、数据库厂商信息、是否支持事务、是否支持某种事务隔离级别、是否支持滚动结果集等
ParameterMetaData pmd=preparedStatement.getParameterMetData( );
通过ParameterMetaData可以获得参数信息;
ResultSetMetaData meta=rs.getMetaData( );
通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等;
可以将ResultSet放入Map(key:列名 value:列值);
ORM(object、relation、map):-----à利用反射做的通用模块---à将查询结果封装为对象
package cn.itcast.jdbc;
publicclass ORMTest {
publicstaticvoid main(String[] args)throws IllegalArgumentException, SQLException, IllegalAccessException, InvocationTargetException{
User user=(User) getObject("select id as Id,name as Name,birthday as Birthday,money as Money from user where id=1",User.class);
System.out.println(user);
}
static Object getObject(String sql,Class clazz)throws SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=JDBCUtils.getConnection();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
int count=rsmd.getColumnCount();
String[] colNames=new String[count];
for(int i=1;i<=count;i++){
colNames[i-1]=rsmd.getColumnLabel(i);
}
Object obj=null;
if(rs.next()){
obj=new User();
for(int i=0;i
String colName=colNames[i];
String methodName="set"+colName;
Method[] ms=obj.getClass().getMethods();
for(Method m:ms){
if(methodName.equals(m.getName())){
m.invoke(obj, rs.getObject(colName));
}
}
}
}
return obj;
}finally{
JDBCUtils.free(conn, ps, rs);
}
}
}