JDBC學習總結1(JDBC基礎)
001.JDBC
1.JDBC:java database connectivity ; java連線資料庫
簡單來說,jdbc就是一組規範;將對所有關係型資料庫的操作都抽象出來的規範;
作用:採用統一的方式來操作各種資料庫;
2.如何通過jdbc來訪問資料庫;
JDBC中常用的介面和實現類;
DriverManager:驅動程式管理器,用來管理驅動,並獲得連線;
Connection:連線;代表java與資料庫的一個連線;
Statement :宣告;用來向資料庫傳送sql;
3.使用jdbc訪問資料的步驟
載入驅動 ;
Class.forName("com.mysql.jdbc.Driver");
獲得連線;
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/books","root","tiger");
建立宣告
Statement st=conn.createStatement();
執行sql
st.execute(sql);
st.executeUpdate();
關閉資源
st.close();
conn.close();
程式碼如下:
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Test { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.載入驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲得連線 //String url:jdbc:子協議:子名稱 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "tiger"); //3.建立宣告 Statement st=conn.createStatement(); //4.執行sql String sql="insert into tb_book values(null,'1984',32,'喬治·奧威爾')"; st.execute(sql); //5.關閉資源 st.close(); conn.close(); } }
002.Statement方法
1.DriverManager類
作用:管理驅動,並且可以獲得資料庫連線;
方法:
public static Connection getConnection(url,userName,password);
建立一個類,將載入驅動放在靜態塊裡,獲得連線定義為靜態方法,程式碼如下:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil {
static String url="jdbc:mysql://localhost:3306/test";
static String userName="root";
static String password="tiger";
//載入驅動
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//獲得連線
public static Connection getConnection() {
try {
return DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
關於關閉資源:java1.7之後的try可以:
String sql="";
try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
st.execute(sql);
}
無論是否產生異常,在try執行後會自動關閉資源(包括網路、流等可關閉的資源)
最終程式碼如下:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String sql="select * from tb_book";
try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
st.execute(sql);
}
}
}
2.Connection
代表與資料庫的連線;連線用完一定要立即關閉;
方法:
createStatement():建立宣告;
preparedStatement(); 建立預編譯的宣告;
setAutoCommit():事務是否為自動提交;
commit;
rollback:控制事務;
3.Statement (宣告)
作用:用來執行各種sql
方法:
boolean execute(sql);
所有語句都可執行;執行語句後是否存在結果集;
int executeUpdate(sql);
受影響的記錄數量;
ResultSet executeQuery();
003.ResultSet
ResultSet
Result代表結果集
.next():移動游標,如果有下一條記錄則返回true,否則返回false;
.get<Type>(int): 根據列號獲得當前記錄的一個欄位的值,並將值轉換成<Type>型別,
.get<Type>(String):根據列名查詢出當前記錄的欄位值,並轉換成<Type>型別
.close():關閉資源;
004.PreparedStatement
1.什麼是sql注入;
通過傳遞一個sql 片段來破壞原有的sql語名,及達到sql攻擊的目的;
2.PreparedStatment 介面;
它是Statment的子介面,是預編譯的Statment ;此介面的特點;
①解決sql注入的問題;
②為不同的資料型別賦值更加方便;
③同一個sql執行多次時,效能更好;
建議:如果sql中帶引數,則建議使用preparedSstatement;
3.使用ps的步驟;
String sql="select * from miaosha_user where userid=? and password=?";
//定義預編譯的ps; 用?代表可變的引數;
PreparedStatement ps=conn.prepareStatement(sql);
//給萬用字元賦值;
ps.setString(1, name);
ps.setString(2, passwd);
//執行sql;
ResultSet rs=ps.executeQuery();
4.ps的方法;
set<Type>(int,Object):給指定位置的萬用字元賦值;
executeQuery();
executeUpdate();
execute();
以上三個方法,都沒有引數;
005.日期型別
關於日期型別的對映;
java.util.Date;
在jdbc中,表示java中時間可以使用以下三個型別,這三個型別都是java.util.Date 的子類;並且都在java.sql包中;
Date:只表示日期;
Time:只表示時間
Timestamp:表示一個精確的時間(日期+時間)
006.事務控制
1.關於事務的處理;
登入;
表:使用者資訊表;
uid,nickname,password.login_time,login_count,amount;
登入日誌;
logid,uid,login_time,score;
2.在jdbc中如何控制事務?
在jdbc中通過Connection來控制事務;
三個方法;
setAutoCommit(false);
commit():提交
rollback():回退;
示例;
Connection conn=JdbcUtil.getConnection();
conn.setAutoCmmit(false);
try{
ps.execute();...
.....();
conn.commit();
}catch(Exception e){
conn.rollback();
}finally{
conn.close();
}
007.元資料
元資料(MetaData)
用來描述資料的資料;
用來描述資料的含義的一些資訊;
jdbc為我們提供了多種元資料;主要有;
表示資料庫連線的元資料;
DatabaseMetaData ; conn.getMetaData();
表示結果集的元資料;
ResultSetMetaData result.getMetaData();
方法有;
getColumnCount():獲得結果集的列數;
getColumnLabel():獲得列名
getColumnType():獲得列的資料型別;
008.大物件的處理
jdbc對大資料的處理;
思路;
1、使用Connection.createBlob()建立一個blob物件;
2、獲得這個blob 物件的輸出流;setBinaryStream(1);
3、向流中寫入位元組;
4、通過ps.setBlob()將二進位制存在資料庫中;
//建立一個Blob型別;
Blob blob=conn.createBlob();
//獲得blob的輸出流;
OutputStream os=blob.setBinaryStream(1);
//此處省略向os中寫入位元組的程式碼
ps.setBlob(3, blob);
009.大物件的讀取 010.返回生成的主鍵
如何獲得資料庫生成的主鍵
通過一個過載的prepareStatement(sql,int);來設定是否返回由資料庫生成的主鍵 ;然後再使用ps.getGenereatedKeys()來獲得包含主鍵的結果集;
PreparedStatement ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
ps.execute();
//獲得生成的主鍵;
ResultSet keys=ps.getGeneratedKeys();
keys.next();
System.out.println("生成的主鍵是:"+keys.getInt(1));
總結
元資料 ;MetaData;
大物件;
BLOB:binary Large Object;
返回生成的主鍵 ;
事務:
作業;註冊功能;
受教育經歷;