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

浙公网安备 33010602011771号