java 數據庫連接,sun公司退出的 java 訪問數據庫的標準規範接口java
是一種用於執行SQL語句的 java APImysql
能夠做爲多種關係數據庫提供統一接口git
是一組 java 工具類和接口的組成。github
JDBC是接口,驅動接口的實現,沒有驅動沒法完成數據庫連接,而不能操做數據庫。sql
每一個數據庫廠商都須要提供本身的驅動,用來連接本身公司的數據庫數據庫
也就是說,驅動通常由數據庫廠商提供。工具
固然還有第三方公司專門爲某一數據庫提供驅動,這樣的驅動每每不會是開源免費的!單元測試
例如:mysql 驅動包 是 mysql-connector-java-5.1.28-bin.jar測試
點擊 window -> workspace -> 修改UTF-8 點擊應用 ok。編碼
首先new一個文件夾
建立一個 lib 文件夾存放 jar 包
將 mysql-connector-java-5.1.28-bin.jar 放入 lib 文件夾
而後:
完成以後
先建立一個包,而後創建一個類
編輯代碼
package cn.study.test; import org.junit.Test; public class TestJunit { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Test public void testJunit(){ System.out.println("hello junit"); } }
右擊 @Test 點擊運行
修改代碼
package cn.study.test; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestJunit { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Test public void testJunit(){ System.out.println("hello junit"); } @Before public void testBefore() { System.out.println("before!"); } @After public void testAfter() { System.out.println("after!"); } }
1. 註冊驅動
2. 得到連接
3. 得到語句執行者
4. 執行 sql 語句
5. 處理結果
6. 釋放資源
代碼:
class.forName(「com.mysql.jdbc.Driver」)
分析步驟1 :
JDBC規範定義驅動接口:java.sql.Driver
mysql 驅動包提供了實現類:com.mysql.jdbc.Driver
分析步驟2:
DriverManager工具類提供註冊驅動的方法
方法的參數是 java.sql.Driver 因此咱們能夠經過以下語句進行註冊
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
以上代碼不推薦使用,存在兩方面不足
1. 硬編碼,後期不易於拓展和維護
2. 驅動被註冊兩次
分析步驟3:
一般開發咱們使用 Class.forName() 加載一個使用字符串描述的驅動類。
若是使用Class.forName() 將類加載到內存,該類的靜態代碼將自動執行。
經過查詢 com.mysql.jdbc.Driver 源碼,咱們發現Driver類主動將本身進行註冊。
代碼:
Connection con=DriverManager.getConnection{"jdbc:mysql://localhost:3306/mydb1","root","123456"};
獲取連接須要使用方法 DriverManager.getConnection(url , username , password)
URL 表示連接數據庫的位置(網址)
user 表示用戶名
password :表示數據庫密碼
jdbc:mysql://localhost:3306/mydb1
URL由三部分組成,每部分用逗號隔開
第一部分 jdbc 爲固定的
第二部分是數據庫名稱
第三部分爲數據庫廠商制定:數據庫服務地址ip、端口、數據庫名稱。
拓展參數:
jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
String sql = "insert into category(cid,cname) value ( 'c107' , '分類' )"
Statemet 語句執行代碼:
Statement stmt = con.createStatement();
執行sql語句:
執行 insert update delete 語句
int executeUpdate(string sql);
執行select語句
ResultSet executeQuery( string sql );
執行 select 語句返回 true ,執行其餘語句返回 false
boolean execute(string sql);
若是返回true 須要使用 getResultSet() 獲取查詢結果。
若是返回 false 須要使用 getUpdateCount() 獲取影響行數。
執行批處理:
addBatch(string sql);
clearBath();
executeBatch();
若是有參數須要在sqql語句中進行拼湊,存在sql注入問題。
ResultSet 實際上就是一張二維表格,內部有一個行光標,光標默認位置在第一行上方,咱們能夠調用 rs 對象的 next() 方法把 行光標向下移動一行,當第一次調用 next() 的時候,行光標就到了第一行記錄的位置,這時候就能夠使用 resultSet 提供的 getXXX(int col)方法來獲取指定的列數據了。
光標移動到第一行
rs.next();
獲取第一行第一列數據
rs.getInt(1);
經常使用的方法有:
獲取任意對象
object getObject(int col)
獲取字符串
string getString(inr col)
獲取整形
int getInt(int col) ;
獲取雙精度浮點數
double getDouble(int col);
與IO流同樣,使用後的東西都須要關閉!關閉的順序是先獲得的後關閉,後獲得的先關閉!
rs.close();
stmt.close();
con.close();
案例代碼:
package cn.study.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import org.junit.Test; /** * 測試sql注入問題 * @author Administrator * */ public class TestLogin { @Test public void testLogin() { try { login("wjw", "20"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用戶登陸方法 * @param username * @param password * @throws ClassNotFoundException * @throws SQLException */ public void login(String username,String password) throws ClassNotFoundException, SQLException { // 1. 註冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 2. 獲取連接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456"); // 3. 建立執行sql語句的對象 Statement stmt = conn.createStatement(); // 4. 書寫sql語句 String sql = "select * from student where "+"name='"+username+"' and age='"+password+"'"; // 5. 執行sql語句 ResultSet rs = stmt.executeQuery(sql); // 6.對結果集進行處理 if (rs.next()) { System.out.println("恭喜你 "+username +" 登陸成功!"); System.out.println(sql); }else{ System.out.println("帳號或密碼錯誤!"); } // 7. 釋放資源 if (rs!=null) rs.close(); if (stmt!=null) stmt.close(); if (conn!=null) conn.close(); } }
過濾用戶輸入的數據是否包含非法字符。—— 很難作到
分佈校驗,先使用用戶名來查詢用戶,若是查找到了在比較密碼。
使用 PrepareStatement。
PrepareStatement 叫預編譯聲明。
PrepareStatement是Statement的子接口,能夠使用 PrepareStatement 來替代 Statement。
防止sql攻擊
提升代碼可讀性和可維護性
提升效率
使用 Connection 的 prepareStatement(string sql):即建立它時就讓他與一條sql鎖定。
調用PrepareStatement 的 setXXX() 系列方法爲問號設置值。
調用 executeUpdate() 或 executeQuery() 方法,但要注意,調用沒有參數的方法。
package cn.study.test; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import org.junit.Test; /** * 測試sql注入問題 * * @author Administrator * */ public class TestLogin { @Test public void testLogin() { try { login("wjw", "20"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用戶登陸方法 * * @param username * @param password * @throws ClassNotFoundException * @throws SQLException */ public void login1(String username, String password) throws ClassNotFoundException, SQLException { // 1. 註冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 2. 獲取連接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbtest", "root", "123456"); // 3. 編寫sql語句 String sql = "select * from student where name=? and age=?"; // 4. 建立預處理對象 PreparedStatement pstmt = conn.prepareStatement(sql); // 5. 設置參數 pstmt.setString(1, "fasda"); pstmt.setString(2, "365351"); // 6. 執行查詢編輯 ResultSet rs = pstmt.executeQuery(); // 7.對結果集進行處理 if (rs.next()) { System.out.println("恭喜你 " + username + " 登陸成功!"); System.out.println(sql); } else { System.out.println("帳號或密碼錯誤!"); } // 8. 釋放資源 if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } }
(limit , 2 , 2)第一個起始位置,要查詢(第幾頁-1)*第二個參數, 第二個是數量。
項目代碼:https://github.com/wjw1014/JavaMysqlStudy/tree/master/my_JDBC (小白操做,僅供參考!)