数据库操作的学习(以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();
}
}