資料庫操作的學習(以SQLServer為例)
- 前提準備
- 使用JDBC操作資料庫的基本步驟
-
- 加載JDBC驅動包和連接配接資料庫
- 資料庫查詢
- 增删改
- 批處理
- 動态查詢
- 調用存儲過程
- 關閉驅動類
前提準備
- 在SQLServer中建立一個資料庫(圖書資訊表),并建立一個表(圖書資訊表)
- java.sql
use 圖書資訊表;
create table 圖書資訊表
(
編号 int,
書名 char(20),
作者 char(20),
單價 int,
);
insert into 圖書資訊表 values(‘1’,‘平凡的世界’,‘路遙’,40);
insert into 圖書資訊表 values(‘2’,‘紅樓夢’,‘曹雪芹’,50);
insert into 圖書資訊表 values(‘3’,‘三國演義’,‘吳承恩’,37);
insert into 圖書資訊表 values(‘4’,‘水浒傳’,‘施耐庵’,34);
結果
- 加驅動包,提供eclipse和資料庫的橋梁
- 可參考 用JDBC連接配接SQL Server2017資料庫 注:
- 連接配接其他資料庫
使用JDBC操作資料庫的基本步驟
加載JDBC驅動包和連接配接資料庫
Connection con=null;//連接配接流
//資料庫驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("資料庫驅動成功!");
//建立連接配接
String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=圖書資訊表";//資料庫配置資訊
String username="sa";//資料庫登入賬号
String password="1234567";//資料庫登入密碼
con=DriverManager.getConnection(url,username,password);
System.out.println("已建立連接配接!");
資料庫查詢
代碼
//建立Statement對象
Statement stmt=con.createStatement();
//給資料庫發送SQL語句,傳回值為ResultSet對象。查詢資料executeQuery
rs=stmt.executeQuery("select * from 圖書資訊表");
//周遊結果集
while(rs.next()) {//擷取下一行
int id=rs.getInt("編号");
String name=rs.getString("書名");
String author=rs.getString("作者");
int price=rs.getInt(4);//擷取第4列的值
System.out.println(id+" "+name+" "+author+" "+price+" ");
}
結果
資料庫驅動成功!
已建立連接配接!
1 平凡的世界 路遙 40
2 紅樓夢 曹雪芹 50
3 三國演義 吳承恩 37
4 水浒傳 施耐庵 34
增删改
代碼
//建立Statement對象
Statement stmt=con.createStatement();
//插入資料
String sql1="insert into 圖書資訊表(編号,書名,作者,單價) values(5,'悲慘世界','NN',45)";
int result1=stmt.executeUpdate(sql1);
System.out.println("有"+result1+"行資料受影響");
//修改資料
String sql2="update 圖書資訊表 set 編号=4 where 作者='NN'";
int result2=stmt.executeUpdate(sql2);
System.out.println("有"+result2+"行資料受影響");
//删除資料
String sql3="delete from 圖書資訊表 where 編号=4";
int result3=stmt.executeUpdate(sql3);
System.out.println("有"+result3+"行資料受影響");
批處理
stmt.addBatch("insert into 圖書資訊表(編号,書名,作者,單價) values(5,'悲慘世界','NN',45)");
stmt.addBatch("insert into 圖書資訊表(編号,書名,作者,單價) values(6,'悲慘世界','MM',45)");
stmt.addBatch("insert into 圖書資訊表(編号,書名,作者,單價) values(7,'悲慘世界','JJ',45)");
int results[]=stmt.executeBatch();//批處理資料
動态查詢
解決SQL安全問題
- PreparedStatement接口—繼承——>Statement接口
代碼:
//動态SQL
String sql="select * from 圖書資訊表 where 編号=? and 書名 like ?";
PreparedStatement ps=con.prepareStatement(sql);
ps.setInt(1, 4);
ps.setString(2, "水%");
ResultSet rs=ps.executeQuery();
System.out.println("編号\t書名\t作者\t單價");
while(rs.next()) {
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
}
結果:
編号 書名 作者 單價
4 水浒傳 施耐庵 34
調用存儲過程
- CallableStatement接口——extends——>PreparedStatement接口
- 前提準備:
- 在SQLServer中建立存儲過程
–建立存儲過程
create procedure my_procedure
as
begin
select * from 圖書資訊表
end
go
exec my_procedure
go
代碼:
//調用存儲方法
CallableStatement cs=con.prepareCall("{call my_procedure}");
ResultSet rs=cs.executeQuery();
System.out.println("編号\t書名\t作者\t單價");
while(rs.next()) {
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
}
結果:
編号 書名 作者 單價
1 平凡的世界 路遙 40
2 紅樓夢 曹雪芹 50
3 三國演義 吳承恩 37
4 水浒傳 施耐庵 34
5 悲慘世界 NN 45
6 悲慘世界 MM 45
7 悲慘世界 JJ 45
1 平凡的世界 路遙 40
2 紅樓夢 曹雪芹 50
3 三國演義 吳承恩 37
4 水浒傳 施耐庵 34
1 平凡的世界 路遙 40
2 紅樓夢 曹雪芹 50
3 三國演義 吳承恩 37
4 水浒傳 施耐庵 34
1 平凡的世界 路遙 40
2 紅樓夢 曹雪芹 50
3 三國演義 吳承恩 37
4 水浒傳 施耐庵 34
關閉驅動類
while(rs.next())
{rs.getXxx(...)
...
}catch(....){
...
}catch(...){
.....
}catch(...){
.....
}finally{
//打開順序與關閉順序相反
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(con!=null){
con.close();
}
}