(一)学习总结
1 . 用思维导图对本周的学习内容进行总结。
2 . 通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery()方法中使用动态参数时,为什么要使用PreparedStatement接口而不使用Statement,比较使用两种接口的不同之处。
JDBC中Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
1>方法executeQuery
用于产生单个结果集(ResultSet)的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
//使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();
//执行查询语句
ResultSet rs =stmt.executeQuery("select * from teacher");
//把查询结果输出来
while (rs.next())
{
System.out.println(rs.getInt(1) + "/t" + rs.getString(2));
}
2>方法executeUpdate
用于执行 INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句,例如 CREATE TABLE 和DROPTABLE。INSERT、UPDATE或DELETE语句的效果是修改中零行或多行中的一列或多列。executeUpdate的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate 的返回值总为零。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
//使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();
//执行DML语句,返回受影响的记录条数
return stmt.executeUpdate(sql);
3>方法execute:
可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。
如:
//加载驱动
Class.forName(driver);
//获取数据库连接
conn = DriverManager.getConnection(url , user , pass);
//使用Connection来创建一个Statment对象
stmt = conn.createStatement();
//执行SQL,返回boolean值表示是否包含ResultSet
boolean hasResultSet = stmt.execute(sql);
//如果执行后有ResultSet结果集
if (hasResultSet){
//获取结果集
rs = stmt.getResultSet();
//ResultSetMetaData是用于分析结果集的元数据接口
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
//迭代输出ResultSet对象
while (rs.next())
{//依次输出每列的值
for (int i = 0 ; i < columnCount ; i++ )
{
System.out.print(rs.getString(i + 1) + "/t");
}
System.out.print("/n");
}
}else {
System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");
}
3 . 文本框内容的清空
清除文本的话可用setText("");
移除文本框的话可用remove(文本框);
(二)实验总结
实验内容:
使用JDBC实现实验七的宠物商店
完成实验内容,代码上传到码云,注意,务必将创建数据库的脚本文件随项目文件一起上传,在随笔中分析程序设计思路,用PowerDesigner画出类图结构,并对完成实验内容过程中遇到的问题、解决方案和思考等进行归纳总结,注意代码中必须有必要的注释。
格式如下:
程序设计思路:将实验七中的数据类都转换成Pet数据库中的表,建立JDBC类,连接数据库,对数据库中的数据进行读取放在ArrayList集合中,进行数据的查找添加删除,并进行对数据库内容的修改
问题1:所有对数据查询的时候出现问题
原因:在数据库中,对数据类型的定义为char类型,如果所输入的数据或存入数据不能达到所定义的位数,软件会用空格自动填充,所以和所查询时输入的字符串之间存在空格的差异,进行比较固然会显示错误。所有查询,包括用户登录时,都会遇到相同的问题。
解决方案:将数据库对数据定义的类型为varchar型,字符串长度设置相对较小,满足一般设定的需求,这样就不会有空格进行补位。
问题2:用户购买结束后,登录第二个用户时,购买界面还显示上一位用户的购买信息。
解决方案:使用清除文本的方法setText("");
实现代码:
public void showWelcomePetStorePlus() {
show.setText("
");
this.setVisible(false);
new WelcomePetStorePlus().setVisible(true);
}
问题3:第二位用户显示购买信息时,会在之前购买的内容上面叠加
原因:购买的信息存在了表buy内,表中的内容没有删除,所以叠加
解决方案:添加清除数据库的方法,在点击显示购买信息时,不光表用显示buy中数据的方法,在此之后在调用清除表buy中信息的方法。这样,在显示购买之后,清除了购买的内容,其他用户购买时,表buy是一个空表。
实现代码:
//显示按钮监听
showBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
showPet(); //调用显示方法
dell();
}
//清除购买列表
public boolean dell(){
boolean result=false;
Connection conn = null;
PreparedStatement pstmt = null;
try{
conn = JDBCUtils.getConnection(1);
String sql="delete from buy";
pstmt = conn.prepareStatement(sql);
if(pstmt.executeUpdate()>0){
result = true;
}
}catch(Exception e ){
e.printStackTrace();
}finally{
JDBCUtils.close(conn);
}
return result;
}
欢迎界面:
管理员界面:
用户登录界面:
用户注册界面:
购买界面:
(三)代码托管
- 码云commit历史截图