• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Tonya
博客园    首页    新随笔    联系   管理    订阅  订阅
201521123007《Java程序设计》第14周学习总结

1. 本周学习总结

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


2. 书面作业

1. MySQL数据库基本操作

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

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

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 id=" + id + ";";//关键语句
        }

	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 (...) {...}

现在来看一下运行的结果

我们发现使用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历史-设置时间段”, 然后搜索并截图

posted on 2017-05-28 20:15  七秒の鱼  阅读(213)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3