目錄
什么是JDBC:
為啥存在JDBC:
JDBC工作原理:
JDBC的優勢:
下載mysql驅動包:
用java程序操作數據庫
1.創建dataSource:
2.與服務端建立連接
3.構造sql語句
4.執行sql
5.關閉連接,釋放資源
參考代碼:
插入操作:
刪除操作:
修改操作:
查詢操作:
什么是JDBC:
jdbc:java datasource connectivity : java數據庫連接
jdbc 是一種用于執行SQL語句的Java API,它是 Java中的數據庫連接規范。
為啥存在JDBC:
當前的數據庫有很多種,有mysql,Oracle,SQL server等.
客戶端可能使用不同的數據庫進行操作,不同的數據庫對應不同的編譯語言,提供了不同的數據庫驅動包,如:MySQL提 供了Java的驅動包mysql-connector-java,需要基于Java操作MySQL即需要該驅動包。同樣的, 要基于Java操作Oracle數據庫則需要Oracle的數據庫驅動包ojdbc。
這就帶來了很多不便,更換數據庫時,還要學習新的數據庫的api,增加了使用成本。
JDBC就統一了數據庫的連接規范,它為java開發人員提供了一套標準的api,可以為多種關系數據庫統一訪問。
JDBC工作原理:
JDBC 為多種關系數據庫提供了統一訪問方式,作為特定廠商數據庫訪問API的一種高級抽象,它主要包 含一些通用的接口類。
JDBC的優勢:
1.java語言訪問數據庫操作完全是面向抽象接口編程。
2.開發數據庫應用提供api不需要針對特定的api.
3.程序的可移植性大大增強。
下載mysql驅動包:
下載可以有多種方式,可以在中央倉庫中下載:
https://mvnrepository.com/https://mvnrepository.com/
下載步驟:
1.搜索mysql:
2,選擇下載版本
3.選擇一個版本,點進去,點jar包下載
下載完成后,創建java項目,新建一個包(lib,名字隨意),將下載好的驅動包粘貼到這個包中
將創建的包添加為庫
準備工作完成,下面就可以通過java程序操作數據庫了
用java程序操作數據庫
1.創建dataSource:
創建數據源頭,就是數據庫所在的位置
DataSource是一個接口,MysqlDataSource是mysql驅動包中的,通過MysqlDataSource來實現。
設置數據庫位置:
對dataSource使用,要向下轉型: DataSource->MysqlDataSource,通過下載的驅動包來設置,
當然也可以直接使用MysqlDataSource來創建源頭數據:
但這種方法會在代碼中多次出現MysqlDataSource類,不利于提高代碼的耦合性,還是建議使用第一種方法設置。
setUrl():URL:表示網絡上資源的位置,也叫“網址”,mysql是一個客戶端服務器結構的程序,需要通過網絡進行交互。
JDBC:mysql : url是JDBC操作MySQL使用的;
127.0.0.1:IP地址,127.0.0.1是一個特殊的IP地址,“環回地址”,由于我們當前的數據庫和java程序是在同一臺機器上,因此就是將數據發送給自己,就要用環回地址。
3306:端口號,接收數據端的端口號;
java109:數據庫名,在執行java代碼時,提前創建好數據庫和表;
:問號?后面的是一些訪問資源時候用到的參數,設置字符集為utf8,useSSL表示是否要加密,在練習的時候設為false,(設為true很可能連不上數據庫)。
setUser():mysql的默認用戶 : root;
setPassword(): 在安裝數據庫的時候手動設置的數據庫密碼;
2.與服務端建立連接
Connection有很多包,注意要導入 java.sql包
這里有一個受查異常,要手動處理:
3.構造sql語句
執行插入數據操作
可以直接指定內容,也可以通過字符串拼接,通過控制臺輸入要插入的數據,
還可以通過? ,搭配setXXX,來手動輸入要插入的數據,
第一個參數 是?的位置,第二個參數 是要傳入的數據。
sql語句是字符串,通過prepareStatement()方法,先將sql語句進行解析檢查,得到結構化數據,將結構化數據傳送給數據庫,數據庫就無需再進行對sql語句進行處理了,這樣操作能為數據庫節省更多的時間,可以處理更多的客戶端請求。
雖然sql語句能以字符串的形式傳給數據庫,但若sql存在語法問題等,傳過去的sql就無法執行,影響執行效率;直接傳sql語法也存在一定的風險,不安全,因為不確定sql中到底寫的什么。
刪除操作:
修改操作:
查詢操作:
4.執行sql
增刪改:
增刪改都屬于對數據庫的寫操作,使用的方法是executeUpdate(),返回值是操作影響到的行數,為int類型。
查詢:
查詢屬于讀操作,使用executeQuery()方法,返回的是一個結果集,
resultSet相當于在查詢到的結果集中,有一個光標,最初指向第0行,當還有數據時,就依次向下遍歷,ResultSet有getXXX方法,根據列的類型,可以獲取到要查找的數據。
5.關閉連接,釋放資源
關閉順序是:先創建的后釋放,后創建的先釋放。
參考代碼:
插入操作:
public class Deam01 {//插入數據public static void main(String[] args) throws SQLException {Scanner scan=new Scanner(System.in);System.out.println("請輸入id:");int id = scan.nextInt();System.out.println("請輸入姓名:");String name = scan.next();
//
// MysqlDataSource mysqlDataSource=new MysqlDataSource();
// mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
// mysqlDataSource.setUser("root");
// mysqlDataSource.setPassword("root");//1.創建dataSourceDataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("root");//2.和數據庫服務器建立連接Connection connection=dataSource.getConnection();//3.構造sql//插入操作//法一
// String sql="insert into student values(1,'zhangsan')";//法二
// String sql="insert into student values("+id+",'"+name+"')";//法三String sql="insert into student values(?,?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);preparedStatement.setString(2,name);//4.執行sqlint n = preparedStatement.executeUpdate();System.out.println("n= "+n);//5,關閉連接,釋放資源preparedStatement.close();connection.close();}
}
刪除操作:
public class Deam02 {public static void main(String[] args) throws SQLException {Scanner scan=new Scanner(System.in);System.out.println("請輸入姓名:");String name = scan.next();//數據庫刪除數據//1.創建dataSourceDataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("root");//2.和服務器建立連接Connection connection=dataSource.getConnection();//3.構造sqlString sql="delete from student where namr=? ";PreparedStatement preparedStatement= connection.prepareStatement(sql);preparedStatement.setString(1,name);//4.執行sqlint n = preparedStatement.executeUpdate();System.out.println("n= "+n);//5.關閉連接,釋放資源preparedStatement.close();connection.close();}
}
修改操作:
public class Deam07 {public static void main(String[] args) throws SQLException {Scanner scan=new Scanner(System.in);System.out.println("請輸入修改的name:");String name = scan.next();System.out.println("請輸入源id");int oldid=scan.nextInt();//1.DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("root");//2.Connection connection = dataSource.getConnection();//3.修改sqlString sql="update student set name=? where id=?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setInt(2,oldid);//4int n = preparedStatement.executeUpdate();System.out.println("n= " +n);preparedStatement.close();connection.close();}
}
查詢操作:
public class Deam03 {public static void main(String[] args) throws SQLException {//數據庫 查詢操作//1.創建源數據DataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("root");//2.和服務端建立連接Connection connection = dataSource.getConnection();//3.創建sqlString sql="select * from student";PreparedStatement prepareStatement= connection.prepareStatement(sql);//4.執行sqlResultSet resultSet = prepareStatement.executeQuery();while(resultSet.next()){int id=resultSet.getInt("id");String name=resultSet.getString("namr");System.out.println("id= "+id+" name= "+name);}//關閉資源resultSet.close();connection.close();prepareStatement.close();}
}