实验4---JDBC编程2

2020-02-24  本文已影响0人  Riya

一、实验目的

本实验的目的是掌握数据库环境的搭建;掌握使用JDBC访问数据库的步骤;掌握使用Java API操作数据库。

二、实验内容

创建一个Product(Product_Code CHAR(7), Description VARCHAR(40), Price DECIMAL(10, 2))表,完成以下功能:

  1. 使用事务处理,将Product表中Description字段是'Toaster'的Price的值减少10,并将减少的10增加到Description字段为'Hair dryer'的Price属性值上。
  2. 使用批量更新,完成对Product表批量插入一批数据的功能。

三、实验步骤

  1. 在实验三的基础上,连接数据库,创建表,插入一些值

  2. 查询初始表中的内容

  3. (将Product表中Description字段是'Toaster'的Price的值减少10)将Toaster的所有属性值从表中取出,存入ResultSet中。操作ResultSet,将Toaster的price属性加10存入变量s中。将'Toaster'的Price的值更新为s

  4. (将减少的10增加到Description字段为'Hair dryer'的Price属性值上)与步骤三类似,将加10,改为减10;

  5. 使用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();
}
}
}
上一篇 下一篇

猜你喜欢

热点阅读