《Java技术》第八次作业
(一)学习总结
1.用思维导图对本周的学习内容进行总结

2.通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery()方法中使用动态参数时,为什么要使用PreparedStatement接口而不使用Statement,比较使用两种接口的不同之处。
-
Statement对象执行SQL语句有两种情况:
-
一种是数据定义和更新语句,如CREATE、DELETE、UPDATE和INSERT等语句,使用Statement对象的executeUpdate方法执行;
-
一种是数据查询语句,如SELECT语句,使用Statement对象的executeQuery 方法执行;
-
使用Statement接口,例如:
import java.sql.*;
public class Test {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(DBURL,DBUSER, DBPASS);
stmt = conn.createStatement();
String sqlStr = "insert into student(Sno,Sname,age,sex,place,birthday) values('201215112','王丽',18,'女','河北','1995-4-15')"; stmt.executeUpdate(sqlStr);
sqlStr = "update student set age = age+1";
stmt.executeUpdate(sqlStr);
sqlStr = "delete from student where Sname = '王丽'";
stmt.executeUpdate(sqlStr);
sqlStr = "select Sno,Sname,age,sex,place,birthday from student";
rs = stmt.executeQuery(sqlStr);
} catch (SQLException e) { e.printStackTrace(); }
}
} -
使用PreparedStatement接口,包含在PreparedStatement对象中的SQL语句可以带有一个或多个参数,使用“?”作为占位符,例如:
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
String no = input.next();
System.out.println("请输入姓名:");
String name = input.next();
try {
conn = DriverManager.getConnection(DBURL,DBUSER, DBPASS);
System.out.println("数据库连接成功");
String sqlStr = "insert into student(Sno,Sname) values(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sqlStr);
pstmt.setString(1,no); pstmt.setString(2,name);
int len = pstmt.executeUpdate();
System.out.println("更新了"+len+"条记录");
} catch (SQLException e) {
System.out.println("数据库连接失败"); e.printStackTrace();
}
3.其他总结
-
访问数据库必须要有的三个对象。
Connection conn = null; //获得Connection对象后
Statement stmt = null; //Statement对象可以执行SQL语句
ResultSet rs = null; //查询成功返回包含有结果数据的ResultSet对象 -
数据库中的属性要和Java中的输入或提取数据的类型相匹配。
varchar和string,int和int等。
(二)实验总结
1. 宠物商店
-
程序设计思路:
先建立数据库的连接,然后在数据库中把库建好,将需要的表和数据输入并存储。然后在java程序中利用SQL语句将数据库中的数据提取,存入或删除等。
最后关闭数据库连接。 -
类图

-
实验问题分析:
- 问题1: 不同的用户购买,出现了重复购买。
-
解决方案: 因为每次在数据库里添加了购买的宠物信息之后,数据库没有清空在同一个库中,同一个表的主键不可重复。每次购买完清空清单列表,让每一次购买都是新的表。
this.setVisible(false);
boolean result=false;
Connection conn = null;
PreparedStatement pstmt = null;
try{
conn = JDBCUtils.getConnection(1);
String sql="delete from petList";
pstmt = conn.prepareStatement(sql);
if(pstmt.executeUpdate()>0){
result = true;
}
}catch(Exception e ){
e.printStackTrace();
}finally{
JDBCUtils.close(conn);
}
JOptionPane.showMessageDialog(this, "结账完毕!(已将数据库中的清单列表删除,这样每次购买都是新的列表)"); -
问题2: 注册新用户时,从数据库中读取用户信息,查看是否重复时,无法比较,读取不了信息。
-
解决方案: 与宠物列表相似,先将数据库中的数据读取到User类的对象中。再用java语句提取数据进行比较。
-
问题3: 无法将java中的Date日期存入数据库的Datetime日期。第九章数据库应用的课件上有。
-
解决方案:
new java.sql.Date( user.getBirthday().getTime())
(三)代码托管
- 码云commit历史截图(代码地址)

(四)学习进度条
| 代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
|---|---|---|---|
| 目标 | 5000行 | 300小时 | |
| 第2-4周 | 400/400 | 40/40 | 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。 |
| 第5周 | 450/850 | 45/85 | 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了。解单列设计模式 等知识点,还将ppt上的程序打了一遍。 |
| 第6周 | 300/1250 | 35/120 | 从课外书上更深的了解了抽象类,同学介绍的网站上面了解了类图的画法。 |
| 第7周 | 400/1250 | 40/160 | 对接口了解不够深,请同学给我讲了讲,翻资料找了些关于接口的程序去敲。 |
| 第10周 | 400/1650 | 40/200 | 在网上找了许多关于set\list\map接口的实例和用法详解。去学习去理解 |
| 第12周 | 350/2000 | 40/240 | 学习并掌握了本次学习内容 |
| 第13周 | 150/2150 | 30/270 | 学习并掌握了本次学习内容,学习了数据库的应用。 |
浙公网安备 33010602011771号