Java Data Base Connection(JDBC)
用于執行SQL語句的Java API,可為多種關系數據庫提供統一訪問。
它由一組用Java語言編寫的類和接口組成,是Java訪問數據庫的標準規范。
JDBC需連接驅動。
- 驅動:兩個設備要進行通信時需滿足的一定的通信數據格式。
- 數據格式由設備供應商規定
- 設備供應商提供驅動軟件,通過軟件可以與該設備進行通信。
- JDBC是接口
- 驅動是接口的實現
1.JDBC開發步驟
1.1導入驅動jar包
創建lib目錄,用于存放當前項目需要的所有jar包。
選擇jar包,右鍵執行build path/Add to Build Path
1.2注冊驅動
Class.forName("com.mysql.jdbc.Driver");- java.sql.Driver:JDBC規范定義驅動接口;
- com.mysql.jdbc.Driver:MySQL包提供的實現類;
- Class.forName():加載一個使用空字符串描述的驅動類?
- static Class<?>? forName(String classname):返回與帶有給定字符串名的類或接口相關聯的Class對象。
- Driver類主動將自己注冊。
1.3獲得連接
Connection cn=DriverManager.getConnection("jdbc:mysql"//localhost:3306/mydb","root","root");1.3.1DriverManager
在調用 getConnection方法時,DriverManager 會試著從初始化時加載的那些驅動程序以及使用與當前 applet 或應用程序相同的類加載器顯式加載的那些驅動程序中查找合適的驅動程序。
DriverManager.getConnection(String url,String username,String pw):試圖建立到給定數據庫 URL 的連接。
三個參數:
- 需要連接數據庫的位置
- 用戶名
- 密碼
JDBC規定url格式:
- jdbc固定
- 數據路名稱(mysql)
- 數據庫廠商規定
- 數據庫IP地址:localhost
- 端口號:3366
- DATABASE名稱:mydb
1.4獲得語句執行平臺
String sql="某sql語句"; Statement stmt=con.createStatement();獲得Statement語句執行平臺。
1.4.1Statement
用于執行靜態 SQL 語句并返回它所生成結果的對象。
在默認情況下,同一時間每個 Statement對象在只能打開一個 ResultSet對象。
因此,如果讀取一個 ResultSet對象與讀取另一個交叉,則這兩個對象必須是由不同的 Statement對象生成的。
如果存在某個語句的打開的當前ResultSet對象,則 Statement接口中的所有執行方法都會隱式關閉它。
常用方法:
int executeUpdate(String sql):執行insert、update、delete語句
ResultSet executeQuery(String sql):執行select語句
boolean execute(sql):執行select返回true,執行其他語句,返回false
1.5處理結果集
ResultSet是一個二維表格。
boolean next():執行下一條記錄。
getXXX(int col):列從1開始。
- 獲得對象:Object getObject(int index)、Object getObject(String name)
- 獲得字符串:String getString(index)、Object getObject(String name)
- 獲得整型:int getInt(index)、Object getObject(String name)
- 獲得雙精度浮點型:double getDouble(int index)、Object getObject(String name)
1.6釋放資源
關閉的順序:先得到的后關閉
rs.close();
stmet.close();
con.close();
2.SQL注入
輸入的口令為:
則進入系統會,判斷語句會為:password='xxx'OR'a'='a',通過驗證。
用PreparedStatement解決
3.PreparedStatement
建議每條SQL語句的所有實際參數都用逗號分隔。
String sql="insert into user(id,name) values (?,?)";PreparedStatement psmt=conn.preparedStatement(sql);preparedStatement(String sql):創建一個preparedStatement對象來將參數化的 SQL 語句發送到數據庫。
帶有 IN 參數或不帶有 IN 參數的 SQL 語句都可以被預編譯并存儲在preparedStatement對象中。然后可以有效地使用此對象來多次執行該語句。
- sql - 可能包含一個或多個 '?' IN 參數占位符的 SQL 語句
3.1常用方法
int executeUpdate()
ResultSet executeQuery()
boolean execute()
3.2設置實際參數
void setXXX(int index, XXX xx)
將指定參數設置為給定的Java值。
將此值發給數據庫時,驅動程序將它轉換為一個SQL xxx類型值。
setString(2,"張三");把SQL語句中的第2個占位符'?'替換為“張三“。
3.3預處理對象executeUpdate方法
3.3.1 操作格式
3.3.2 insert
Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");String sql="insert into user(name) values (?)";PreparedStatement pstmt=conn.preparedStatement(sql);stmt.setString(1,"李四");int line=stmt.executeUpdate();System.out.println("新添加的行數:"+line);stmt.close(); conn.close();3.3.3update
Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");String sql="update user set name=? where id=?";PreparedStatement pstmt=conn.preparedStatement(sql);stmt.setString(1,"李四"); stmt.setString(2,1);stmt.close(); conn.close();3.3.4delete
Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");String sql="delete from user where id=?";PreparedStatement pstmt=conn.preparedStatement(sql);stmt.setString(1,1);stmt.close(); conn.close();3.4預處理對象executeQuery方法
3.4.1 操作格式
3.4.2 select
Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");String sql="select * from user";PreparedStatement pstmt=conn.preparedStatement(sql);ResultSet rs=stmt.executeQuery(sql); while(rs.next()){String id=rs.getInt("id");String name=rs.getString("name);System.out.println(id+"---"+name);}rs.close(); stmt.close(); conn.close();4. JDBC工具類
可將“獲得數據庫連接”操作封裝為工具類JDBCUtils
提供獲取連接對象的方法,從而達到代碼復用
提供方法:public static Connection getConn();
public class JDBCUtils{public static final String DRIVERNAME="com.mysql.jdbc.Driver";public static final String URL="JDBC:MYSQL://LOCALHOST:3306/mydb";public static final String USER="root";public static final String PAEEWORD="root";static{try{Class.forName(DRIVERNAME);}catch(ClassNotFoundException e){System.out.println("數據庫驅動注冊失敗!");}}public static Connection getConn() throws Exception{Connection conn=DriverManager.getConnection(URL,USER,PAEEWORD);return conn;} }5.Properties配置文件
獲得的連接的4個參數(驅動、URL、用戶名、密碼)通常在配置文件中保存,方便后期維護。
層序如果需要更換數據庫,只需要改配置文件即可。
習慣使用Properties文件,要求如下;
- 文件位置:任意,建議src下
- 文件名稱:任意,擴展名為.properties
- 文件內容:一行一組數據,格式為"key=value"
- key命名自定義,多個單詞用點分隔,jdbc.driver
- value不支持中文,如果非要用非中文,需unicode轉換
文件名db.properties
driver=com.mysql.jdbc.Driver;
url=jdbc:mysql://localhost:3306/mydb;
user=root;
password=root
JDBCUtils更改為:
public class JDBCUtils{public static String driver;public static String url;public static String user;public static String password;static{try{Properties props=new Properties();Reader is=new FileReader("db.properties");props.load(is);driver=props.getProperties("deriver");url=props.getProperties("url");user=props.getProperties("user");password=props.getProperties("pwssword");}catch(ClassNotFoundException e){throw new RuntimeException(e);}}public static Connection getConn() throws Exception{try{Class.forName(driver);Connection conn=DriverManager.getConnection(url,user,password);return conn;}catch(Exception e){throw new RuntimeException(e);}} }總結
以上是生活随笔為你收集整理的Java Data Base Connection(JDBC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络通信-2(TCP通信、ServerS
- 下一篇: DBUtils、连接池