JDBC學習

1 什麼是JDBC

JDBCJava DataBase Connectivity)就是Java數據庫連接,說白了就是操作數據庫的Java語言。原來我們操作數據庫是在控制檯使用SQL語句來操作數據庫,JDBC是用Java語言向數據庫發送SQL語句。

 

JDBC是接口,而JDBC驅動纔是接口的實現,沒有驅動無法完成數據庫連接!每個數據庫廠商都有自己的驅動,用來連接自己公司的數據庫。

所以說你想連接什麼數據庫就得先導入該數據庫的驅動

wKiom1Z3tciwcR39AAB-Q1kG0L4399.png

下面是jdbc操作oracle數據庫的代碼.

查詢時executeQuery(),有結果集resultSet.其餘操作時executeUpdate(),返回的數字.

package testJdbc;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 public class TestJdbc {
  public static void main(String[] args) {
   //先定義好三個對象
        Connection con=null;
        PreparedStatement pstmt=null;//防止sql注入,提高效率
        ResultSet rs=null;//執行查詢需要結果集
       try {
        //加載oracle驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //oracle的url
        String url="jdbc:oracle:thin:@10.1.0.169:1521:orcl";
        //獲得數據庫連接
        con=DriverManager.getConnection(url, "CL", "123456");
        String sql="select producercode,producername from T_PRODUCER_INFO 
                 where telephone =?";
        pstmt=con.prepareStatement(sql);
        //設置參數,從1開始
        pstmt.setString(1, "110");
        rs=pstmt.executeQuery();
        while(rs.next()){
             //獲取這一行的列數據.索引從1開始
             String code=rs.getString(1);
             String name=rs.getString(2);
             System.out.println("代碼爲"+code+"------"+"名稱爲"+name);
        } 
           } catch (Exception e) {
                throw new RuntimeException(e);
           }finally{
            //後使用的先關閉
            try {
             if(rs!=null){
              rs.close();
             }
             if(pstmt!=null){
              pstmt.close();
             }
             if(con!=null){
              con.close();
             }
            } catch (SQLException e) {
             e.printStackTrace();
            }
       }
    }
 }

wKioL1Z3vtuSR9Z-AABvNSju97U596.png

 

時間類型

領域對象(domain)中的所有屬性不能出現java.sql包下的東西!即不能使用java.sql.Date

ResultSet#getDate()返回的是java.sql.Date()

PreparedStatement#setDate(int, Date),其中第二個參數也是java.sql.Date

 

時間類型的轉換:

java.util.Date à java.sql.DateTimeTimestamp

  utilDate轉換成毫秒值

  使用毫秒值創建sqlDateTimeTimestamp

java.sql.DateTimeTimestamp à java.util.Date

  這一步不需要處理了:因爲java.sql.Datejava.util.Date的子類

 

 

java.sql包下給出三個與數據庫相關的日期時間類型,分別是:

Date:表示日期,只有年月日,沒有時分秒。會丟失時間;

Time:表示時間,只有時分秒,沒有年月日。會丟失日期;

Timestamp:表示時間戳,有年月日時分秒,以及毫秒。

 

 

java.utl.Date d= new java.util.Date();

java.sql.Datedate = new java.sql.Date(d.getTime());//會丟失時分秒

Time time = newTime(d.getTime());//會丟失年月日

Timestamptimestamp = new Timestamp(d.getTime());

 

 

大數據(Blob,Clob)

 

類型

長度

tinyblob

28--1B256B

blob

216-1B64K

mediumblob

224-1B16M

longblob

232-1B4G

tinyclob

28--1B256B

clob

216-1B64K

mediumclob

224-1B16M

longclob

232-1B4G

大數據比如視頻,歌曲,圖片,文本子類的.將他們存入數據庫是通過IO流(插入的是IO流對象,讀取的也是IO流)

CREATE TABLE tab_bin(
         id    INT           PRIMARYKEY AUTO_INCREMENT,
         filename  VARCHAR(100),
         data        MEDIUMBLOB
);

插入數據庫

     con = JdbcUtils.getConnection();
     String sql = "insertinto tab_bin(filename,data) values(?, ?)";
     pstmt = con.prepareStatement(sql);
     pstmt.setString(1, "a.jpg");
     InputStreamin = new FileInputStream("f:\\a.jpg");//得到一個輸入流對象
     pstmt.setBinaryStream(2,in);//爲第二個參數賦值爲流對象 
     pstmt.executeUpdate();

 查詢數據庫

           con = JdbcUtils.getConnection();
           String sql = "selectfilename,data from tab_bin where id=?";
           pstmt = con.prepareStatement(sql);
           pstmt.setInt(1, 1);
           rs = pstmt.executeQuery();
           rs.next();
           
           String filename = rs.getString("filename");
           OutputStream out = new FileOutputStream("F:\\" + filename);
           
           InputStream in = rs.getBinaryStream("data");
           IOUtils.copy(in, out);
           out.close();

 

大批處理

批處理就是一批一批的處理,而不是一個一個的處理!

當你有10SQL語句要執行時,一次向服務器發送一條SQL語句,這麼做效率上很差!處理的方案是使用批處理,即一次向服務器發送多條SQL語句,然後由服務器一次性處理。

    批處理只針對更新(增、刪、改)語句

 

void addBatch(String sql):添加一條語句到“批”中;

int[] executeBatch():執行“批”中所有語句。返回值表示每條語句所影響的行數據;

void clearBatch():清空“批”中的所有語句。

           con = JdbcUtils.getConnection();
           String sql = "insertinto stu values(?,?,?,?)";
           pstmt = con.prepareStatement(sql);
           for(int i = 0; i < 10; i++) {
              pstmt.setString(1, "S_10" + i);
              pstmt.setString(2, "stu" + i);
              pstmt.setInt(3, 20 + i);
              pstmt.setString(4, i % 2 == 0 ? "male" : "female");
              pstmt.addBatch();
           }
           pstmt.executeBatch();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章