实验4---JDBC编程2
2020-02-24 本文已影响0人
Riya
一、实验目的
本实验的目的是掌握数据库环境的搭建;掌握使用JDBC访问数据库的步骤;掌握使用Java API操作数据库。
二、实验内容
创建一个Product(Product_Code CHAR(7), Description VARCHAR(40), Price DECIMAL(10, 2))表,完成以下功能:
- 使用事务处理,将Product表中Description字段是'Toaster'的Price的值减少10,并将减少的10增加到Description字段为'Hair dryer'的Price属性值上。
- 使用批量更新,完成对Product表批量插入一批数据的功能。
三、实验步骤
-
在实验三的基础上,连接数据库,创建表,插入一些值
-
查询初始表中的内容
-
(将Product表中Description字段是'Toaster'的Price的值减少10)将Toaster的所有属性值从表中取出,存入ResultSet中。操作ResultSet,将Toaster的price属性加10存入变量s中。将'Toaster'的Price的值更新为s
-
(将减少的10增加到Description字段为'Hair dryer'的Price属性值上)与步骤三类似,将加10,改为减10;
-
使用addBatch和executeBatch批量插入数据
四、实验结果
五、实验小结
通过此次实验,对事务的处理和异常的处理有了更深刻的理解,以及对于jdbc对数据库的操作更加的熟练。Ps:遇到的小问题及解决方法:
异常:java.sql.SQLException: Before start of result set
解决方法:使用rs.getString();前一定要加上rs.next();
原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next()应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。在ResultSe对象及其父辈Statement对象关闭之前,光标一直保持有效。
六、源代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectionDemo {
public static void main(String[] args) throws Exception {
double s=0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立数据库连接
String url="jdbc:mysql://localhost:3306/database";
String user="root";
String password="1009707126zxy+";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println("连接成功!");
PreparedStatement ps = null;
// 创建Statment对象
Statement stmt = conn.createStatement();
stmt.close();
//第一次查询表内容
System.out.println("第一次查询表内容");
ps = conn.prepareStatement("select * from Product");
ResultSet result1 = ps.executeQuery();
while(result1.next())
System.out.println(result1.getString("Product_Code")+"\t"+result1.getString("Description")+"\t"+result1.getDouble("Price"));
//修改;将Product表中Description字段是'Toaster'的Price的值减少10
ps = conn.prepareStatement("select *from Product where Description ='Toaster'");
ResultSet rs1 = ps.executeQuery();
while(rs1.next()) {
s=rs1.getInt(3)-10;
String sql1="Update Product set Price="+s+" where Description='Toaster'";
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
}
//查询
System.out.println("第二次查询表内容(修改后;将Product表中Description字段是'Toaster'的Price的值减少10)");
ps = conn.prepareStatement("select * from Product");
ResultSet result2 = ps.executeQuery();
while(result2.next())
System.out.println(result2.getString("Product_Code")+"\t"+result2.getString("Description")+"\t"+result2.getDouble("Price"));
//修改;将减少的10增加到Description字段为'Hair dryer'的Price属性值上
ps = conn.prepareStatement("select *from Product where Description ='Hair dryer'");
ResultSet rs2 = ps.executeQuery();
while(rs2.next()) {
s=rs2.getInt(3)+10;
String sql2="Update Product set Price="+s+" where Description='Hair dryer'";
ps = conn.prepareStatement(sql2);
ps.executeUpdate();
}
//查询
System.out.println("第三次查询表内容(修改后;将减少的10增加到Description字段为'Hair dryer'的Price属性值上)");
ps = conn.prepareStatement("select * from Product");
ResultSet result3 = ps.executeQuery();
while(result3.next())
System.out.println(result3.getString("Product_Code")+"\t"+result3.getString("Description")+"\t"+result3.getDouble("Price"));
//批量更新
boolean Commit=conn.getAutoCommit();
System.out.println("事务提交状态:"+Commit);
if(Commit) {
conn.setAutoCommit(false);//关闭自动提交
}
stmt=conn.createStatement();
stmt.addBatch("Insert into Product(Product_Code,Description,Price)values(6,'Phone',100)");
stmt.addBatch("Insert into Product(Product_Code,Description,Price)values(7,'Laptop',200)");
stmt.addBatch("Insert into Product(Product_Code,Description,Price)values(8,'AirPods',300)");
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(Commit);
//查询
System.out.println("第四次查询表内容(批量更新):");
ps = conn.prepareStatement("select * from Product");
ResultSet result5 = ps.executeQuery();
while(result5.next())
System.out.println(result5.getString("Product_Code")+"\t"+result5.getString("Description")+"\t"+result5.getDouble("Price"));
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}