JDBC访问技术.txt
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:11k
源码类别:

Java编程

开发平台:

Java

  1. 一、JDBC数据库访问
  2. 二、JAVA数据库应用
  3. 1、加载JDBC-ODBC桥
  4.       调用Class类forName()方法注册ODBC-JDBC驱动程序
  5.       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  6. 2、建立连接
  7.       DriverManager类的getConnection()方法试图定位能连接到数据库的驱动程序
  8.       String url="jdbc:odbc:MyDatasource";
  9.       MyDatasource指的是事先定义好的ODBC接口
  10.       Connection con=DriverManager.getConnection(url,"sa","");
  11. 3、访问数据库
  12.    JDBC提供三种类发送SQL语句给数据库
  13.    A、Statement对象:从Connection对象调用createStatement()方法,创建Statement对象。
  14.    B、PreparedStatement对象
  15.      从Connection对象调用preparedStatement()方法,创建PreparedStatement对象,实现发送可动态调整内容的SQL语句给SQL SERVER
  16. (语句中包含input参数)
  17.    C、CallableStatement对象
  18.      从Connection对象调用prepareCall()方法,创建CallableStatement对象。它可包含调用存储过程的功能。
  19.      
  20.       statement提供三种方法执行SQL语句:
  21.       1)executeQuery()  执行简单查询并返回单个ResultSet对象
  22.       2)executeUpdate() 执行Insert、Update、Delete语句
  23.       3)execute()       执行SQL语句,可返回多个结果
  24.      例:
  25.      //QueryApp.java
  26.      import java.sql.*;
  27.      public class QueryApp{
  28.         public static void main(String args[]){
  29.            ResultSet result;
  30.            try{
  31.                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  32.                Connection c=DriverManager.getConnection("jdbc:odbc:CWJ","sa","");
  33.                Statement stat=c.createStatement();
  34.                result=stat.executeQuery("select * from Publishers");
  35.                while(result.next()){
  36.                  System.out.println(result.getString(2));
  37.                }
  38.            }catch(Exception e){
  39.             System.out.println("Error"+e);
  40.            }
  41.         }
  42.      } 
  43. 二、用TYPE4的JDBC Driver访问数据库
  44. Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  45. Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://tsinghuacwj;DatabaseName=pubs;User=sa;Password=sa");
  46.     JBuilder配置三步骤:
  47.      1、Configure Libraries
  48.      2、Enterprise Setup->Database Drivers,完成后重启JBuilder
  49.      3、Database Pilot
  50. 三、可滚动、可更新的结果集
  51. 是JDBC2.0新特性之一,它支持将结果集中的游标按任意方向移动的能力。
  52. 语法:connection.createStatement(int rsType,int rsConcurrency);
  53. 注:rsType有三种选择:TYPE_FORWARD_ONLY 不可滚动的结果集
  54.   TYPE_SCROLL_INSENSITIVE 可滚动的结果集,当打开时不反映它的变化
  55.   TYPE_SCROLL_SENSITIVE 可滚动的结果集,当打开时反映它的变化
  56. rsConcurrency有两种选择:CONCUR_READ_ONLY 只读的
  57.  CONCUR_UPDATABLE   可更新的
  58.  
  59. 例:Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
  60. first()、last()、beforefirst()、afterlast()、absolute(int rowNumber)、relative(int rowNumber)
  61. 例1:写一个程序实现定位到第一条记录,最后一条记录,将表中记录按正向顺序显示,然后按反向顺序显示。
  62. 例1:用RowSet实现上述功能 P117
  63. 可更新的ResultSet:(P112)
  64. 1、更新ResultSet: rs.updateString("Street","123 Main");
  65.   rs.updateRow();
  66. 2、插入新行:rs.moveToInsertRow();
  67.  rs.updateString("First_Name","cwj");
  68.  rs.insertRow();
  69. 3、删除行:rs.deleteRow();
  70. 四、各位Statement的使用
  71.    A、Statement对象:从Connection对象调用createStatement()方法,创建Statement对象。
  72.       statement提供三种方法执行SQL语句:
  73.       1)executeQuery()  执行简单查询并返回单个ResultSet对象
  74.       2)executeUpdate() 执行Insert、Update、Delete语句
  75.       3)execute()       执行SQL语句,可返回多个结果   
  76. 例:创建表
  77. String dTableSQL = "CREATE TABLE digest " + "(id INTEGER NOT NULL," + " title VARCHAR(64) NOT NULL," +
  78. " author VARCHAR(64) NOT NULL)" ;
  79. String mTableSQL = "CREATE TABLE messages " + "(id INTEGER NOT NULL," + " title VARCHAR(64) NOT NULL," +
  80. " author VARCHAR(64) NOT NULL," +
  81. " message CLOB(2048))" ;
  82. String aTableSQL = "CREATE TABLE authors " + "(author VARCHAR(64) NOT NULL," + " photo BLOB(4096))";
  83. Statement stmt = con.createStatement() ;
  84. stmt.executeUpdate(dTableSQL) ;
  85. stmt.executeUpdate(mTableSQL) ;
  86. stmt.executeUpdate(aTableSQL) ;
  87. 例:删除表
  88. String dDropSQL = "DROP TABLE digest" ;
  89. String mDropSQL = "DROP TABLE messages" ;
  90. String aDropSQL = "DROP TABLE authors" ;
  91. ...
  92. Statement stmt = con.createStatement() ;
  93. stmt.executeUpdate(dDropSQL) ;
  94. stmt.executeUpdate(mDropSQL) ;
  95. stmt.executeUpdate(aDropSQL) ;
  96. 例:往表中插入数据
  97. String baseInsertSQL = "Insert INTO digest VALUES(" ;
  98. int[] ids = {1, 2, 3, 4, 5} ;
  99. String[] authors = {"java", "rjb", "java", "bill", "scott"} ;
  100. String[] titles = { "Hello","Hello Java","Hello Robert","Hello from Bill","Hello from Scott"} ;
  101. Statement stmt = con.createStatement() ;
  102. for(int i = 0 ; i < ids.length ; i++) {
  103. stmt.executeUpdate( baseInsertSQL+ids[i]+ ", '" + titles[i] + "', '" + authors[i] + "')") ;
  104. }
  105.    
  106.    B、PreparedStatement对象
  107.      从Connection对象调用preparedStatement()方法,创建PreparedStatement对象,实现发送可动态调整内容的SQL语句给SQL SERVER
  108. (语句中包含input参数)
  109. 例:往表中插入数据(注:以与上方法相比,效率更佳)
  110. String insertSQL = "Insert INTO digest VALUES(?, ?, ?)" ;
  111. int[] ids = {1, 2, 3, 4, 5} ;
  112. String[] authors = {"java", "rjb", "java", "bill", "scott"} ;
  113. String[] titles = { "Prepared Hello",
  114. "Prepared Hello Java",
  115. "Prepared Hello Robert",
  116. "Prepared Hello from Bill",
  117. "Prepared Hello from Scott"} ;
  118. Connection con = ds.getConnection("java", "sun") ;
  119. PreparedStatement pstmt = con.prepareStatement(insertSQL) ;
  120. for(int i = 0 ; i < ids.length ; i++){
  121. pstmt.setInt(1, ids[i]) ;
  122. pstmt.setString(2, titles[i]) ;
  123. pstmt.setString(3, authors[i]) ;
  124. pstmt.executeUpdate() ;
  125.    C、CallableStatement对象
  126.      从Connection对象调用prepareCall()方法,创建CallableStatement对象。它可包含调用存储过程的功能。
  127.      
  128.  {call AuthorList} if the procedure takes no parameters
  129.    {call AuthorList[(?, ?)]} if the procedure takes two parameters
  130.    {? = call AuthorList[(?, ?)]} if the procedure takes two parameters and returns one
  131.    例:创建存储过程
  132. import java.sql.*;
  133. import javax.sql.*;
  134. public class CreateCallableStmt{
  135.   private static String dbUserName = "sa";
  136.   private static String dbPassword = "dba";
  137.   public static void main(String args[]){
  138.     String createProc = "CREATE PROCEDURE INSERT_CONTACT_INFO "+
  139.                         "@ID INT, @FName VARCHAR(20), @MI CHAR(1), "+
  140.                         "@LName VARCHAR(30),@Street VARCHAR(50), "+
  141.                         "@City VARCHAR(30), @ST CHAR(2), "+
  142.                         "@ZIP VARCHAR(10), @Phone VARCHAR(20), "+
  143.                         "@Email VARCHAR(50) "+
  144.                         "AS INSERT INTO CONTACT_INFO "+
  145.                         "(ID, FName, MI, LName, Street, City, ST, ZIP, "+
  146.                         "Phone, Email) "+
  147.                         "VALUES "+
  148.                         "(@ID, @FName, @MI, @LName, @Street, @City, "+
  149.                         " @ST, @ZIP, @Phone, @Email);";
  150.     try {
  151.       Class.forName("com.inet.pool.PoolDriver");
  152.       com.inet.tds.TdsDataSource tds = new com.inet.tds.TdsDataSource();
  153.       tds.setServerName( "JUPITER" );
  154.       tds.setDatabaseName( "MEMBERS" );
  155.       tds.setUser( dbUserName );
  156.       tds.setPassword( dbPassword );
  157.       DataSource ds = tds;
  158.       Connection con = ds.getConnection(dbUserName,dbPassword);
  159.       
  160.       Statement stmt = con.createStatement();
  161.       stmt.executeUpdate(createProc);
  162.     }
  163.     catch(ClassNotFoundException e){
  164.       e.printStackTrace();
  165.     }
  166.     catch(SQLException e){
  167.       e.printStackTrace();
  168.     }
  169.   }
  170. }
  171. 例:存储过程调用
  172. import java.sql.*;
  173. import javax.sql.*;
  174. public class CallableGetLogin{
  175.   private static String dbUserName = "sa";
  176.   private static String dbPassword = "dba";
  177.   public static void main(String args[]){
  178.     try {
  179.       Class.forName("com.inet.pool.PoolDriver");
  180.       com.inet.tds.TdsDataSource tds = new com.inet.tds.TdsDataSource();
  181.       tds.setServerName( "JUPITER" );
  182.       tds.setDatabaseName( "MEMBERS" );
  183.       tds.setUser( dbUserName );
  184.       tds.setPassword( dbPassword );
  185.       DataSource ds = tds;
  186.       Connection con = ds.getConnection(dbUserName,dbPassword);
  187.       
  188.       CallableStatement cs = con.prepareCall("{call GET_LOGIN_FOR_USER(?)}");
  189.       cs.setString(1,"garfield");
  190.       ResultSet rs = cs.executeQuery();
  191.       ResultSetMetaData md = rs.getMetaData();
  192.       
  193.       while(rs.next()){
  194.         for(int i=1;i<=md.getColumnCount();i++){
  195.           System.out.print(md.getColumnLabel(i)+"t=t");
  196.           if(md.getColumnType(i)==java.sql.Types.INTEGER)
  197.             System.out.println(rs.getInt(i));
  198.           else  
  199.             System.out.println(rs.getString(i));
  200.         }
  201.       }
  202.     }
  203.     catch(ClassNotFoundException e){
  204.       e.printStackTrace();
  205.     }
  206.     catch(SQLException e){
  207.       e.printStackTrace();
  208.     }
  209.   }
  210. }
  211. 五、Blob和Clob对象的使用
  212. 1、Inserting Blobs(binary large object)
  213. 注:将图片插入表中
  214. ...
  215. String insertSQL = "Insert INTO authors VALUES(?, ?)" ;
  216. PreparedStatement pstmt = con.prepareStatement(insertSQL) ;
  217. File file = new File("C:/images/rjb.jpg") ;
  218. FileInputStream fis = new FileInputStream(file);
  219. pstmt.setString(1, "rjb");
  220. pstmt.setBinaryStream(2, fis, (int)file.length());
  221. if(1 != pstmt.executeUpdate())
  222. System.err.println("Incorrect value returned during author insert.") ;
  223. pstmt.close();
  224. fis.close();
  225. System.out.println("BLOB Insert Successful") ;
  226. 2、Selecting a Blob
  227. String selectSQL = "SELECT photo FROM authors WHERE author = ?" ;
  228. PreparedStatement pstmt = con.prepareStatement(selectSQL) ;
  229. //用于查找作者名称为rjbr的记录
  230. pstmt.setString(1, "rjb");
  231. ResultSet rs = pstmt.executeQuery() ;
  232. rs.next() ;
  233. Blob blob = rs.getBlob("photo") ;
  234. // Materialize BLOB onto client
  235. ImageIcon icon = new ImageIcon(blob.getBytes(1, (int)blob.length())) ;
  236. JLabel lPhoto = new JLabel(icon) ;
  237. 3、Inserting a Clob
  238. String insertSQL = "Insert INTO messages VALUES(?, ?, ?, ?)" ;
  239. PreparedStatement pstmt = con.prepareStatement(insertSQL) ;
  240. File file = new File("C:/data/rjb.txt") ;
  241. FileInputStream fis = new FileInputStream(file);
  242. pstmt.setInt(1, 1);
  243. pstmt.setString(2, "Hello Java");
  244. pstmt.setString(3, "rjb");
  245. pstmt.setAsciiStream(4, fis, (int)file.length());
  246. if(1 != pstmt.executeUpdate()){
  247. System.err.println("Incorrect value returned during message insert.") ;
  248. 4、Selecting a Clob
  249. String selectSQL = "SELECT message FROM messages WHERE id = ?" ;
  250. PreparedStatement pstmt = con.prepareStatement(selectSQL) ;
  251. pstmt.setInt(1, 1);
  252. ResultSet rs = pstmt.executeQuery() ;
  253. rs.next() ;
  254. Clob clob = rs.getClob("message") ;
  255. // Materialize CLOB onto client
  256. InputStreamReader in = new InputStreamReader(clob.getAsciiStream()) ;
  257. JTextArea text = new JTextArea(readString(in)) ;