jdbc初歩(回転)

6839 ワード

1.Jdbcの6つのプログラミング手順
1.ドライバの登録
ドライバの登録には、次の3つの方法があります.
方法一:Class.forName(“oracle.jdbc.driver.OracleDriver”);
JAVA仕様では、すべてのドライバは静的初期化コードブロックで駆動しなければならないことを明確に規定しています.
ドライバマネージャに登録します.
方式2:Driver drv=new oracle.jdbc.driver.OracleDriver();
      DriverManager.registerDriver(drv);
方式3:コンパイル時に仮想マシンにドライバをロードする
     javac –Djdbc.drivers = oracle.jdbc.driver.OracleDriver xxx.java
     java –D jdbc.drivers=駆動フルネームクラス名
システム属性名を使用して、ロードドライバ-Dはシステム属性に割り当てられた値として表される
附:mysql的Driver的フルネームcom.mysql.jdbc.Driver
SQLServerのDriverのフルネームcom.microsoft.jdbc.sqlserver.SQLServerDriver
2.接続を取得
Conn = DriverManager.getConnection(jdbcURL,userName,password);
3.Statement宣言オブジェクトを取得する
Statement st = conn.createStatement();
PreparedStatement ps = conn.prepareStatement(sql);
CallableStatemetn cs = conn.prepareCall(sql);
4.StatementオブジェクトによるSql文の実行
sta.execute(String sql);結果セットが返されるとtrueが返され、そうでない場合falseが返されます.
sta.executeQuery(String sql);クエリー結果セットを返します.
sta.executeUpdate(String sql);戻り値はint型であり,レコードに影響するエントリ数を表す.
sql文を接続によってデータベースに送信して実行し、データベースに対する操作を実現します.
5.結果セットResultSetがあれば結果セットを処理する
ResultSetMetaDate rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
While(rs.next()){
for(int i = 1; i <= columnCount; i++)
        {
             if(i != 1)  System.out.print(",");
             String name = rsmd.getColumnName(i);//i列目の列名を取得する
             String value = rs.getString(i);//i列目の値を取る
             System.out.print(name + "=" + value);
         }
}
6.リソースのクローズ
2.最初のJdbcプログラム
public class AccountDaoBad
{
    public void select()
    {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            /** static init block in OracleDriver*/
String jdbcURL = “jdbc:oracle:thin:@192.168.0.5:1521:tarena”;
            con = DriverManager.getConnection(jdbcURL, "sd0703", "sd0703");
            st = con.createStatement();
            System.out.println(st.getFetchSize());
            String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
            rs = st.executeQuery(sql);
            while(rs.next())
            {
                System.out.print("id=" + rs.getInt(1));
                System.out.print(",no=" + rs.getString(2));
                System.out.print(",owner=" + rs.getString(3));
                System.out.print(",pwd=" + rs.getString(4));
                System.out.print(",cdate=" + rs.getDate(5));
                System.out.println(",balance=" + rs.getDouble(6));
            }
        }catch(SQLException e)
        {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
            
        }catch(ClassNotFoundException e)
        {
            e.printStackTrace();
            throw new RuntimeException(e.getMessege());
            
        }finally
        { 
            try{ con.close();}catch(Exception e) {e.printStatckTrace();}
        }        
    }

3.共通クラス
1. Connection, Statement, ResultSet, 
4.2.0新機能
(1)事務管理と画像の保存
public class ImageLibraryService
{
    public void addImage(long id, String imageName, String path) throws SQLException
    {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try
        {
            con = ConnectionFactory.getConnection();
            con.setAutoCommit(false);
            String sql = "insert into ImageLibrary(id, name, image)";
            sql += " VALUES(?, ?, empty_blob())";
            ps = con.prepareStatement(sql);
            ps.setLong(1, id);
            ps.setString(2, imageName);
            ps.executeUpdate();
            ps.close();
            ps = con.prepareStatement("select image from ImageLibrary WHERE id = ? for update ");
            ps.setLong(1, id);
            rs = ps.executeQuery();
            if (rs.next())
            {
                Blob image = rs.getBlob(1);
                OutputStream out = image.setBinaryStream(0);
                BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
                BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(path));
                int c;
                while ((c = bufferedIn.read()) != -1)
                {
                    bufferedOut.write(c);
                }
                bufferedIn.close();
                bufferedOut.close();
            }
            con.commit();
        } catch (Exception e)
        {
            e.printStackTrace();
            try
            {
                con.rollback();
            } catch (SQLException se)  {    }
            throw new SQLException(e.getMessage());
        } finally
        {
            JdbcUtil.close(rs, ps, con);
        }
    }
//               
    public void restoreImage(long id, String filename) throws  Exception
    {
        Connection con = ConnectionFactory.getConnection();
        Statement  st = con.createStatement();
String sql = "SELECT image  From ImageLibrary Where id = " + id;
        ResultSet rs = st.executeQuery(sql);
        while (rs.next())
        {
           Blob image = rs.getBlob("image");
           BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
            BufferedInputStream in = new BufferedInputStream(image.getBinaryStream());
           int c;
           while ((c = in.read()) != -1)   out.write(c);
           in.close();
           out.close();
        }
    }
}

(2)結果セットカーソルの上下移動
con = ConnectionFactory.getConnection();
st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
rs = st.executeQuery(sql);
rs.afterLast(); //        ResultSet      ,          。       
while(rs.previous())
{
     System.out.print("id=" + rs.getInt(1));
     System.out.print(",no=" + rs.getString(2));
     System.out.print(",owner=" + rs.getString(3));
     System.out.print(",pwd=" + rs.getString(4));
     System.out.print(",cdate=" + rs.getDate(5));
     System.out.println(",balance=" + rs.getDouble(6));
}

注意:ResultSet静的定数フィールド(javax.sql.ResultSetを参照)
ResultSet.TYPE_SCROLL_INSENSITIVE
この定数は、通常ResultSetの下位データの変更の影響を受けないスクロール可能なResultSetオブジェクトのタイプを示します.
ResultSet.CONCUR_READ_ONLY 
この定数は、更新できないResultSetオブジェクトの同時モードを示します.