《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())
    

(三)代码托管

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 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 学习并掌握了本次学习内容,学习了数据库的应用。