1 什麼是JDBC
JDBC(Java DataBase Connectivity)就是Java數據庫連接,說白了就是操作數據庫的Java語言。原來我們操作數據庫是在控制檯使用SQL語句來操作數據庫,JDBC是用Java語言向數據庫發送SQL語句。
JDBC是接口,而JDBC驅動纔是接口的實現,沒有驅動無法完成數據庫連接!每個數據庫廠商都有自己的驅動,用來連接自己公司的數據庫。
所以說你想連接什麼數據庫就得先導入該數據庫的驅動
下面是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(); } } } }
時間類型
l 領域對象(domain)中的所有屬性不能出現java.sql包下的東西!即不能使用java.sql.Date;
l ResultSet#getDate()返回的是java.sql.Date()
l PreparedStatement#setDate(int, Date),其中第二個參數也是java.sql.Date
時間類型的轉換:
l java.util.Date à java.sql.Date、Time、Timestamp
把util的Date轉換成毫秒值
使用毫秒值創建sql的Date、Time、Timestamp
l java.sql.Date、Time、Timestamp à java.util.Date
這一步不需要處理了:因爲java.sql.Date是java.util.Date的子類;
java.sql包下給出三個與數據庫相關的日期時間類型,分別是:
l Date:表示日期,只有年月日,沒有時分秒。會丟失時間;
l Time:表示時間,只有時分秒,沒有年月日。會丟失日期;
l 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--1B(256B) |
blob | 216-1B(64K) |
mediumblob | 224-1B(16M) |
longblob | 232-1B(4G) |
tinyclob | 28--1B(256B) |
clob | 216-1B(64K) |
mediumclob | 224-1B(16M) |
longclob | 232-1B(4G) |
大數據比如視頻,歌曲,圖片,文本子類的.將他們存入數據庫是通過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();
大批處理
批處理就是一批一批的處理,而不是一個一個的處理!
當你有10條SQL語句要執行時,一次向服務器發送一條SQL語句,這麼做效率上很差!處理的方案是使用批處理,即一次向服務器發送多條SQL語句,然後由服務器一次性處理。
批處理只針對更新(增、刪、改)語句
l void addBatch(String sql):添加一條語句到“批”中;
l int[] executeBatch():執行“批”中所有語句。返回值表示每條語句所影響的行數據;
l 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();