1.操作数据库一般分为下列几部分:加载驱动(jdbc),创建数据库连接,执行sql,获得结果集
加载驱动:
Class.forname("oracle.jdbc.driver.OracleDriver")
创建数据库连接:
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "test", "test");
执行sql:
//声明语句
Statement stmt = con.createStatement();
//执行查询
ResultSet rs = stmt.executeQuery(sql);
获得结果集:
ResultSetMetaData rmeta = rs.getMetaData();
//获得数据字段个数
int numColumns = rmeta.getColumnCount();
while(rs.next())
{
for(int i = 0;i< numColumns;i++)
{
String sTemp = rs.getString(i+1);
}
System.out.println("");
}
2.预编译的 SQL 语句
SQL 语句被预编译并且存储在 PreparedStatement
(j接口)对象中。然后可以使用此对象高效地多次执行该语句。
注:用来设置 IN 参数值的 setter 方法(setShort
、setString
等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER
,那么应该使用 setInt
方法。
如果需要任意参数类型转换,使用 setObject
方法时应该将目标 SQL 类型作为其参数的类型。
在以下设置参数的示例中,con
表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592) *类似于Hsql
创建PreparedStatement 对象的函数:PreparedStatement prepareStatement(String sql) throws SQLException
创建一个PreparedStatement
对象来将参数化的 SQL 语句发送到数据库。带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在
PreparedStatement
对象中。然后可以有效地使用此对象来多次执行该语句。注:为了处理受益于预编译的带参数 SQL 语句,此方法进行了优化。如果驱动程序支持预编译,则
prepareStatement
方法会将该语句发送给数据库进行预编译。一些驱动程序可能不支持预编译。在这种情况下,执行PreparedStatement
对象之前无法将语句发送给数据库。这对用户没有直接的影响;但它的确会影响抛出某些SQLException
对象的方法。使用返回的
PreparedStatement
对象创建的结果集在默认情况下类型为TYPE_FORWARD_ONLY
,并带有CONCUR_READ_ONLY
并发级别。3.操作结果集与分页显示
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//执行查询
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rmeta = rs.getMetaData();
//获得数据字段个数
int numColumns = rmeta.getColumnCount();
//获取记录总数
rs.last();
intRowCount = rs.getRow();
//记算总页数
intPageCount = (intRowCount+pageSize-1) / pageSize;
//调整待显示的页码
if(pageNo>intPageCount) pageNo = intPageCount;if(intPageCount>0){
//将记录指针定位到待显示页的第一条记录上
rs.absolute((pageNo-1) * pageSize + 1);
int i = 0;
while(i<pageSize && !rs.isAfterLast())
{
for(int j = 0;j< numColumns;j++)
{
String sTemp = rs.getString(j+1);
System.out.print(sTemp+" ");
}
i++;
rs.next();
System.out.println("");
}
}关键是ResultSetMetaData类与ResultSet类的absolute、getMetaData方法
getMetaData类:可用于获取关于
ResultSet
对象中列的类型和属性信息的对象。ResultSet类:
getMetaData方法:检索此
ResultSet
对象的列的编号、类型和属性。返回ResultSetMetaData类。absolute方法:指针移动到此
ResultSet
对象的给定行编号afterLast方法:将指针移动到此
ResultSet
对象的末尾,正好位于最后一行之后。4.对原数据的操作。
元数据:所谓元数据,主要指数据的数据,这里也就是说是你那些记录的数据,包括你建表所包含的字段,字段名,字段数据类型,字段约束等.
连接元数据的函数是:Connection.getMetaData (接口 DetabaseMetaData)
常用基本语句有:
DatabaseMetaData dbmd = con.getMetaData();
//获取驱动名
String dataName = dbmd.getDriverName();
String dataURL = dbmd.getURL();//获取数据库最大支持字节数
int dataMaxSize = dbmd.getMaxRowSize();//获取数据库表信息
String[] types = new String[1];
types[0] = "TABLE";
ResultSet results = dbmd.getTables(null, null, "%", types);while (results.next())
{
System.err.println("----------------------------");
System.err.println("TABLE_CAT : "+results.getObject(1));
System.err.println("TABLE_SCHEM : "+results.getObject(2));
System.err.println("TABLE_NAME : "+results.getObject(3));
System.err.println("TABLE_TYPE : "+results.getObject(4));
System.err.println("REMARKS : "+results.getObject(5));
}
//获取表主键信息
ResultSet pkRSet = dbmd.getPrimaryKeys(null, null, table);System.out.println("********************PK information********************");
while(pkRSet.next()){
System.err.println("TABLE_CAT : "+pkRSet.getObject(1));
System.err.println("TABLE_SCHEM: "+pkRSet.getObject(2));
System.err.println("TABLE_NAME : "+pkRSet.getObject(3));
System.err.println("COLUMN_NAME: "+pkRSet.getObject(4));
System.err.println("KEY_SEQ : "+pkRSet.getObject(5));
System.err.println("PK_NAME : "+pkRSet.getObject(6));
}//获取表外键信息
results = dbmd.getImportedKeys(null, null, table);while (results.next())
{
System.err.println("PKTABLE_CAT : "+results.getObject(1));
System.err.println("PKTABLE_SCHEM : "+results.getObject(2));
System.err.println("PKTABLE_NAME : "+results.getObject(3));
System.err.println("PKCOLUMN_NAME : "+results.getObject(4));
System.err.println("FKTABLE_CAT : "+results.getObject(5));
System.err.println("FKTABLE_SCHEM : "+results.getObject(6));
System.err.println("FKTABLE_NAME : "+results.getObject(7));
System.err.println("FKCOLUMN_NAME : "+results.getObject(8));
System.err.println("KEY_SEQ : "+results.getObject(9));
System.err.println("UPDATE_RULE : "+results.getObject(10));
System.err.println("DELETE_RULE : "+results.getObject(11));
System.err.println("FK_NAME : "+results.getObject(12));
System.err.println("PK_NAME : "+results.getObject(13));
System.err.println("DEFERRABILITY : "+results.getObject(13));
}其中的err只是引起注意,并不是真正的错误信息。
5.上述例子有些啰嗦,有时间在整理加强一下。
使用结果集元数据对象获取数据库信息
ResultSet rs = satement.executeQuery(sql);
ResultSetMetaData lineInfo = rs.getMetaData();
//获取数据列数
int columnCount = lineInfo.getColumnCount();for(int i=1;i<columnCount+1;i++){
String columeName = lineInfo.getColumnName(i);
String columeType = lineInfo.getColumnTypeName(i);
boolean autocol = lineInfo.isAutoIncrement(i);
System.out.println(columeName+" = "+columeType +" ::: "+autocol);
}6.java调用存储过程。关键类CallableStatement
简单例子如下:
CallableStatement toesUp = null;
try {
con.setAutoCommit(false);
//调用存储过程
toesUp = con.prepareCall("{call p_test(?)}");
//传递参数给存储过程
toesUp.setInt(1, 6);
//执行存储过程
toesUp.executeQuery();//循环输出调用存储过程结果
ResultSet re=toesUp.getResultSet();
while(re.next())
{
System.out.println(re.getInt(1)+" "+re.getString(2)+" "+re.getInt(3));
}
}传递参数给存储过程类似于hibernat的用法。
有几个?表示存储过程中定义了几个参数。
7.设置不自动提交 conn.setAutoCommit( false );
可通过下列语句控制事务。
conn.commit();
conn.roobock();
conn.close();