学号 20175206 《Java程序设计》第九周学习总结
教材学习内容总结
第十一章:JDBC数据库操作
主要内容
MySQL数据库管理系统
连接MySQL数据库
JDBC
连接数据库
查询操作
更新、添加与删除操作
使用预处理语句
事务
批处理
重点和难点
重点:创建数据源和掌握JDBC连接的方法;实现查询功能
难点:预处理,事务
MySQL数据库管理系统
MySQL数据库管理系统,简称MySQL,是世界上最流行的开源数据库管理系统,其社区版(MySQL Community Edition)是最流行的免费下载的开源数据库管理系统。MySQL最初由瑞典MySQL AB公司开发,目前由Oracle公司负责源代码的维护和升级,Oracle将MySQL分为社区版和商业版,并保留MySQL开放源码这一特点。目前许多应用开发项目都选用MySQL,其主要原因是MySQL的社区版性能卓越,满足许多应用已经绰绰有余,而且MySQL的社区版是开源数据库管理系统、可以降低软件的开发和使用成本。
JDBC
Java提供了专门用于操作数据库的API,即JDBC (Java DataBase Connection)。JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库(如图11.15).程序经常使用JDBC进行如下的操作 :
(1)与一个数据库建立连接。
(2)向数据库发送SQL语句。
(3)处理数据库返回的结果。
连接MySQL数据库
MySQL数据库服务器启动后(见11.2),应用程序为了能和数据库交互信息,必须首先和MySQL数据库服务器上的数据库建立连接。目前在开发中常用的连接数据库的方式是加载JDBC-数据库驱动(连接器)(用Java语言编写的数据库驱动称作JDBC-数据库驱动),即JDBC调用本地的JDBC-数据库驱动和相应的数据库建立连接,如图11.16所示意。Java运行环境将JDBC-数据库驱动转换为DBMS(数据库管理系统)所使用的专用协议来实现和特定的DBMS交互信息。
查询操作
得到SQL查询语句对象
处理查询结果
有了SQL语句对象后,这个对象就可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中。也就是说SQL查询语句对数据库的查询操作将返回一个ResultSet对象,ResultSet对象是按“列”(字段)组织的数据行构成。
ResultSet rs = sql.executeQuery("SELECT * FROM students");
ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,获得一行数据后,ResultSet对象可以使用getXxx方法获得字段值(列值),将位置索引(第一列使用1,第二列使用2等)或列名传递给getXxx方法的参数即可。表11.1给出了ResultSet对象的若干方法。
无论字段是何种属性,总可以使用
getString(int columnIndex)或
getString(String columnName)
方法返回字段值的串表示
关闭连接
ResultSet对象和数据库连接对象(Connection对象)实现了紧密的绑定,一旦连接对象被关闭,ResultSet对象中的数据立刻消失。这就意味着,应用程序在使用ResultSet对象中的数据时,就必须始终保持和数据库的连接,直到应用程序将ResultSet对象中的数据查看完毕
顺序查询
所谓顺序查询,是指ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,next()方法最初的查询位置,即游标位置,位于第一行的前面。next()方法向下(向后、数据行号大的方向)移动游标,移动成功返回true,否则返回false。
条件与排序查询
where子语句
一般格式:
select 字段 from 表名 where 条件
排序
更新、添加与删除操作
1.更新
update 表 set 字段 = 新值 where <条件子句>
2.添加
insert into 表(字段列表) values (对应的具体的记录)
或
insert into 表 values (对应的具体的记录)
3.删除
delete from 表名 where <条件子句>
使用预处理语句
如果应用程序能针对连接的数据库,事先就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。
Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该底层内部命令被数据库执行。
连接SQL Server数据库加载SQL Server驱动程序代码如下:
try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(Exception e){
}
连接的代码如下:
try{
String uri=
"jdbc:sqlserver://192.168.100.1:1433;DatabaseName=warehouse";
String user="sa";
String password="dog123456";
con=DriverManager.getConnection(uri,user,password);
}
catch(SQLException e){
System.out.println(e);
}
应用举例
数据库设计
在清楚了用户的需求之后,就需要进行数据库设计。数据库设计好之后才能进入软件的设计阶段,因此当一个应用问题的需求比较复杂时,数据库的设计(主要是数据库中各个表的设计) 就显得尤为重要
数据模型
程序应当将某些密切相关的数据封装到一个类中,例如,把数据库的表的结构封装到一个类中,即为表建立数据模型。其目的是用面向对象的方法来处理数据
数据处理者
程序应尽可能能将数据的存储与处理分开,即使用不同的类。数据模型仅仅存储数据,数据处理者根据数据模型和需求处理数据,比如当用户需要注册时,数据处理者将数据模型中的数据写入到数据库的表中
视图
程序尽可能提供给用户交互方便的视图,用户可以使用该视图修改模型中的数据。并利用视图提供的交互事件(例如ActionEvent事件),将模型交给数据处理者
代码调试中的问题和解决过程
- 问题1:resultset的表
- 问题2:关闭自动提交模式与撤销操作
- 问题2解决方案:
import java.sql.*;
public class Example11_7{
public static void main(String args[]){
Connection con = null;
Statement sql;
ResultSet rs;
String sqlStr;
con = GetDBConnection.connectDB("students","root","");
if(con == null ) return;
try{ float n = 0.02f;
con.setAutoCommit(false); //关闭自动提交模式
sql = con.createStatement();
sqlStr = "select name,height from mess where number='R1001'";
rs = sql.executeQuery(sqlStr);
rs.next();
float h1 = rs.getFloat(2);
System.out.println("事务之前"+rs.getString(1)+"身高:"+h1);
sqlStr = "select name,height from mess where number='R1002'";
rs = sql.executeQuery(sqlStr);
rs.next();
float h2 = rs.getFloat(2);
System.out.println("事务之前"+rs.getString(1)+"身高:"+h2);
h1 = h1-n;
h2 = h2+n;
sqlStr = "update mess set height ="+h1+" where number='R1001'";
sql.executeUpdate(sqlStr);
sqlStr = "update mess set height ="+h2+" where number='R1002'";
sql.executeUpdate(sqlStr);
con.commit(); //开始事务处理,如果发生异常直接执行catch块
con.setAutoCommit(true); //恢复自动提交模式
String s = "select name,height from mess"+
" where number='R1001'or number='R1002'";
rs =
sql.executeQuery(s);
while(rs.next()){
System.out.println("事务后"+rs.getString(1)+
"身高:"+rs.getFloat(2));
}
con.close();
}
catch(SQLException e){
try{ con.rollback(); //撤销事务所做的操作
}
catch(SQLException exp){}
}
}
}
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3500行 | 8篇 | 100小时 | |
第九周 | 350/500 | 2/2 | 15/20 | |
第十周 | 0/500 | 0/2 | 0/30 | |
第十一周 | 0/1000 | 0/2 | 0/25 | |
第十二周 | 0/1500 | 0/2 | 0/25 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:20小时
实际学习时间:15小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)