Java第八次作业 李新磊

(一)学习总结

1.用思维导图对本周的学习内容进行总结。

2.通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery()方法中使用动态参数时,为什么要使用PreparedStatement接口而不使用Statement,比较使用两种接口的不同之处。

  • 执行动态SQL语句,通常通过PreparedStatement实例实现;
    执行数据定义和更新语句时,如CREATE、DELETE、UPDATE和INSERT等语句,使用Statement对象的executeUpdate方法执行。
//获取所有用户数据
	public ArrayList<UserItem> queryAllUserData(){
		Connection conn = null;
		Statement stmt = null;        //定义Statement实例
		ResultSet rs = null;
		ArrayList<UserItem> list = new ArrayList<UserItem>();
		try{
			conn = JDBCUtils.getConnection(1);
			stmt = conn.createStatement();
			String sql = "select name,keys,email,number,kind  from Users";
			rs = stmt.executeQuery(sql);
			while(rs.next()){
				UserItem thisUser = new UserItem();
				thisUser.setName(rs.getString("name"));
				thisUser.setKey(rs.getString("keys"));
				thisUser.setEmail(rs.getString("email"));
				thisUser.setNumber(rs.getString("number"));
				thisUser.setKind(rs.getString("kind"));
				list.add(thisUser);				
			}
			return list;
		}catch(Exception e ){
			e.printStackTrace();
		}finally{
			JDBCUtils.close(conn);
		}
		return null;
	}
  • 执行静态SQL语句时,通常通过Statement实例实现;
    执行数据查询语句时,如SELECT语句,使用Statement对象的executeQuery 方法执行。
	//添加用户数据
	public boolean addUserItem(UserItem user){
		Connection conn = null;
		PreparedStatement pstmt = null;	    //定义PreparedStatement实例
		boolean result=false;
		try{
			conn = JDBCUtils.getConnection(1);
			String sql = "insert into Users (name,keys,email,number,kind) values (?,?,?,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,user.getName());
			pstmt.setString(2,user.getKey());
			pstmt.setString(3,user.getEmail());
			pstmt.setString(4,user.getNumber());
			pstmt.setString(5,user.getKind());
			if(pstmt.executeUpdate() > 0){
				result = true;
			}			
		}catch(Exception e ){
			e.printStackTrace();
		}finally{
			JDBCUtils.close(conn);
		}	
		return result;
	}
  • Statement

Statement对象,用于执行不带参数的简单SQL语句。在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。

Statement stmt = con.createStatement();  
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table"); 
  • PreparedStatement

PreparedStatement 实例包含已编译的 SQL 语句。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

PreparedStatement pstmt = con.prepareStatement("UPDATE table SET name = ? WHERE age= ?");

在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 String,则使用的方法就是 setString。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。

pstmt.setString(1, tom);

由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

(二)实验总结

程序设计思路

  • 设计数据库,分别创建宠物表(存储宠物信息),和用户表(存储用户信息);运用JDBC连接数据库,通过Statement实例,执行SQL语句,实现数据的读取和添加、修改、删除。

类图

问题1.连接访问数据库,对数据库内容进行操作

通过连接数据库,将宠物信息存入ArrayList中;当执行添加、修改、删除操作时,先通过查找List中的数据,如果查找成功,再调用dao层的方法,对数据库进行操作。

/*连接SQLSERVER数据库*/	
	private static Connection getConnectionSQL()
	{
		Connection conn=null;
		final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
		final String DBURL = "jdbc:sqlserver://localhost:1433;databaseName=Pet";
		final String DBUSER = "absalom";
		final String DBPASS = "@jb230154789";		
		try {
			Class.forName(DBDRIVER);
			conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
		} catch (ClassNotFoundException e) {				
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		return conn;
	}
//获取所有宠物数据
	public ArrayList<PetItem> queryAllData(){	
			Connection conn = null;
			Statement stmt = null;
			ResultSet rs = null;
			ArrayList<PetItem> list = new ArrayList<PetItem>();//新建ArrayList对象,将数据库宠物表中的信息存储到list中
			try{
				conn = JDBCUtils.getConnection(1);
				stmt = conn.createStatement();
				String sql = "select id,kind,price,age,number  from Petshop";//sql语句,获取宠物表内的所有信息
				rs = stmt.executeQuery(sql);
				while(rs.next()){
					PetItem thisPet = new PetItem();
					thisPet.setId(rs.getString("id"));
					thisPet.setKind(rs.getString("kind"));
					thisPet.setPrice(rs.getDouble("price"));
					thisPet.setAge(rs.getInt("age"));
					thisPet.setNumber(rs.getInt("number"));
					list.add(thisPet);				
				}
				return list;
			}catch(Exception e ){
				e.printStackTrace();
			}finally{
				JDBCUtils.close(conn);
			}
			return null;
	}

问题2.查找数据库内容时出错

用户注册时,需要判断注册用户的用户名、邮箱、电话是否已注册(数据库中是否存在此信息)。
而数据库中表格信息设计为char型,使得添加数据时自动补位(填补空格),导致表格中内容与实际输入内容不一致;在查找用户名时执行user.getName().equals(name),而user.getName()的值实际为"name ",不是"name",使得数据无法被查找到。

将数据类型定义为可变长度字符串varchar后,问题解决。

//宠物信息表
create table Petshop(
id varchar(30) not null primary key,
kind varchar(30) not null,
price double precision,
age int,
number int
)
//用户信息表
create table Users(
name varchar(30) not null primary key,
keys varchar(30) not null,
email varchar(30),
number char(11) not null,
kind varchar(30) not null
)

(三)代码托管

https://git.oschina.net/hebau_cs15/Java-CS02lxl

posted on 2017-05-13 12:11  押沙龙  阅读(261)  评论(0)    收藏  举报