java 数据库的简单总结

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 方法(setShortsetString 等等)必须指定与输入参数的已定义 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();

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值