1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容。

201521123007《Java程序设计》第14周学习总结


2. 书面作业

1. MySQL数据库基本操作

建立数据库,将自己的姓名、学号作为一条记录插入。(截图,需出现自己的学号、姓名)

在自己建立的数据库上执行常见SQL语句(截图)

201521123007《Java程序设计》第14周学习总结

201521123007《Java程序设计》第14周学习总结

201521123007《Java程序设计》第14周学习总结

201521123007《Java程序设计》第14周学习总结

2. 使用JDBC连接数据库与Statement

2.1 使用Statement操作数据库。(粘贴一段你认为比较有价值的代码,出现学号)

//201521123007
	public static void displayAll() {
		// 显示所有学生的学号、名字和出生时间,select
		String sql = "select stuno,name,birthdate from student";//关键语句
        }

	public static int insert(Student stu) {
		// 插入学生,insert
		String sql = "insert into student(stuno,name,age,birthdate) " + "values('" + stu.getStuno() + "','"
				+ stu.getName() + "'," + stu.getAge() + ",'" + stu.getBirth() + "');";//关键语句
        }

	public static void displayAllOrderByIdDesc(int id) {
		// 打印出学生的ID号、姓名和出生年日期,并按id降序排列。
		String sql = "select * from student order by " + id + " desc;";//关键语句
        }

	public static int deleteStudent(int id) {
		// 按id删除某个学生,返回值为删除学生的个数,delete
		String sql = "delete from student where ;//关键语句
        }

	public static int updateStudentAge() {
		// 将每个学生的年龄+1,update语句
		String sql1 = "select id,age from student;";
		int resultNum = 0;
		try (Connection conn = DriverManager.getConnection(URL, userName, password)) {
			Class.forName(driverName);
			java.sql.Statement statement = conn.createStatement();
			ResultSet resultSet = statement.executeQuery(sql1);
			while (resultSet.next()) {
				java.sql.Statement statement1 = conn.createStatement();
				String sql2 = "update student set age='" + resultSet.getInt("age") + 1 + "' where id="
						+ resultSet.getInt("id") + ";";
				resultNum += statement1.executeUpdate(sql2);
			}

		} catch (SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		return resultNum;
	}

2.2 使用JDBC操作数据库主要包含哪几个步骤?

  1. 装载驱动,jdbc4.0后不再需要手动加载驱动;
  2. 与数据库建立连接;
  3. 向数据库发送SQL语句;
  4. 获得和处理查询更新语句返回的结果;
  5. 关闭连接,释放资源。

3. PreparedStatement与参数化查询

3.1 使用PreparedStatement根据用户指定的查询条件进行查询。(粘贴一段你认为比较有价值的代码,出现学号)

//201521123007
	 public static double getAvgAbove(int age){
		//显示所有年龄超过传入参数age的同学的姓名与年龄平均值(使用avg函数)
		/*	select name,avg(age) avgAge from student where age>? 
		注意:avg(age) avgAge指的是将年龄求平均后作为avgAge列输出,即列名为avgAge*/
		 double avgAge=0;
		 String sql1="select name from student where age>"+age+";";//好像是因为版本太低的问题name和avg(age)不能放一起select
		 String sql2="select avg(age) from student where age>"+age+";";
		 try(Connection conn=DriverManager.getConnection(URL,userName,password)){
				Class.forName(driverName);
				java.sql.Statement statement=conn.createStatement();
				ResultSet resultSet1=statement.executeQuery(sql2);
				resultSet1.next();
				avgAge=resultSet1.getDouble("avg(age)");
				ResultSet resultSet=statement.executeQuery(sql1);
				while(resultSet.next())
					System.out.println("name=" + resultSet.getString("name"));
				resultSet.close();
				
		 } catch (SQLException | ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 return avgAge;
	 }  

3.2 批量更新-批量插入1000个学生,统计整个操作所消耗的时间。(使用方法executeBatch)

以下是不使用executeBatch方法和使用executeBatch方法的关键代码:

//201521123007
   @Test
    public void slowTest() {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        SimpleDateFormat hmFromat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");// 格式化日期
        String driverName = "com.mysql.jdbc.Driver";

        try {
            Class.forName(driverName);
            con = DriverManager.getConnection(url, userName, password);
            con.setAutoCommit(false);
            // 根据参数的插入数据
            pstmt = con.prepareStatement(strSql);
            for (int i = 0; i < num; i++) {
                pstmt.setString(1, "20150111");
                   ...
                pstmt.executeUpdate();
            }
            con.commit();

        } catch (...) {...}

    @Test
    public void batchTest() {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        SimpleDateFormat hmFromat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");// 格式化日期
        String driverName = "com.mysql.jdbc.Driver";

        try {
            Class.forName(driverName); 
            con = DriverManager.getConnection(url, userName, password);
            con.setAutoCommit(false);
            pstmt = con.prepareStatement(strSql);
            for (int i = 0; i < num; i++) {
                pstmt.setString(1, "20150111");
                  ...
                pstmt.addBatch();
            }
            pstmt.executeBatch();
            con.commit();

        } catch (...) {...}

现在来看一下运行的结果
201521123007《Java程序设计》第14周学习总结

我们发现使用executeBatch方法比不使用快了很多。

4. JDBCUtil与DAO

4.1 粘贴一段你认为比较有价值的代码,出现学号

//201521123007
	@Override
	public int add(Student stu) {//添加学生信息
		int rs=0;
		String sql = "insert into student(id,name) values(?,?); ";
		try(Connection conn = DriverManager.getConnection(URL, userName, password)) {
			Class.forName(driverName);
			PreparedStatement pstat = conn.prepareStatement(sql);
			pstat.setInt(1, stu.getId());
			pstat.setString(2, stu.getName());
			rs = pstat.executeUpdate();
		}catch (SQLException | ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}

	@Override
	public List<Student> findByName(String name) {
		List<Student> list = new ArrayList<Student>();
		String sql = "select * from student where name like ?";//模糊查询
		try(Connection conn = DriverManager.getConnection(URL, userName, password)) {
			Class.forName(driverName);
			PreparedStatement pstat = conn.prepareStatement(sql);
			pstat.setString(1, "%"+name+"%");
			ResultSet rs = pstat.executeQuery();
			while(rs.next()){
				list.add(new Student(rs.getInt("id"),rs.getString("name")));
			}
		} catch (SQLException | ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	
	public Map<String,Student> maptest(){//把所有学生信息放入一个Map
		Map<String,Student> smap=new HashMap<String,Student>();
		List<Student> list =findAll();
		for (Student e : list) {
			smap.put(e.getName(), e);
		}
		return smap;
	}
	
	public Student findByName1(String name){
		String sql="select *from student where name="+name;//按指定姓名查询
		Student stu=null;
		try(Connection conn=DriverManager.getConnection(URL, userName, password)){
			Class.forName(driverName);
			Statement st=conn.createStatement();
			ResultSet rs=st.executeQuery(sql);
			rs.next();
			stu=new Student(rs.getInt("id"),rs.getString("name"));
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return stu;
	}

4.2 使用DAO模式访问数据库有什么好处?

以下是搜到的

DAO使程序层次分明,把对数据库的操作都放在这一层,这样其他层的逻辑控制就变得清晰明了了。
对于实现业务逻辑而言,DAO层是基石。
而且分层后DAO的代码维护与变更等也变得清晰可理解。
DAO的存在大部分是为了理清思路,代码简洁易懂

5. 使用数据库改造购物车系统

5.1 使用数据库改造以前的购物车系统(应有图形界面)。如果以前为完成购物车系统,可编写基于数据库的学生管理系统。包括对学生的增删改查,要求使用。

	private static PreparedStatement ps = null;

	private static ResultSet rs = null;

	public static ArrayList<Goods> getAllGoods() {// 获取购物车商品的信息
		ArrayList<Goods> alist = new ArrayList<Goods>();
		try (Connection ct = new Connect().getConn();) {

			String sql = "select * from goodsbean where name in (";
			Iterator<String> it = hm.keySet().iterator();
			while (it.hasNext()) {
				String goodsname = it.next();
				if (it.hasNext()) {
					sql +="'"+ goodsname + "',";
				} else {
					sql += "'"+goodsname + "')";
				}
			}
			ps = ct.prepareStatement(sql);
			rs = ps.executeQuery();
			while (rs.next()) {
				alist.add(new Goods(rs.getInt("id"), rs.getString("name"), Double.parseDouble(rs.getString("price"))));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return alist;
	}

5.2 相比较使用文件,使用数据库存储与管理数据有何不一样?

减少了数据的冗余度,从而大大地节省了数据的存储空间;实现数据资源的充分共享
操作直观,使用灵活,编程方便,环境适应广泛


3. 码云

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

201521123007《Java程序设计》第14周学习总结

相关文章: