《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号