20145231 《Java程序设计》第九周学习总结
教材学习内容总结
第十六章:整合数据库
JDBC简介
•JDBC全名Java DataBase Connection,是Java联机数据库的标准规范,它定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口会由数据库厂商操作,通常称为JDBC驱动程序;如图:
•JDBC标准分为两个部分:JDBC应用程序开发接口者以及JDBC驱动程序开发者接口;
•JDBC应用程序开发接口相关API主要在java.sql与javax.sql两个包中;
•更换数据库时,应用程序无需进行修改,只需要更换数据库驱动程序成果,即可对另一个数据库进行操作;
连接数据库
•步骤如下:
一、 注册Driver对象;
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。
try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
提供JDBC连接的URL:
//例如:(MySql的连接URL)
jdbc:mysql:
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
二、 取得Connection操作对象;
要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。
使用DriverManager的getConnectin(String url , String username ,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("数据库连接失败!");
se.printStackTrace() ;
}
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:
*执行静态SQL语句。通常通过Statement实例实现。 *
*执行动态SQL语句。通常通过PreparedStatement实例实现。 *
*执行数据库存储过程。通常通过CallableStatement实例实现。 *
·具体的实现方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt =
con.prepareCall("{CALL demoSp(? , ?)}") ;
处理结果有两种情况:
1.执行更新返回的是本次操作影响到的记录数。 2.执行查询返回的结果是一个ResultSet对象。
三、 关闭Connection操作对象;
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1.关闭记录集
2.关闭声明
3.关闭连接对象
if(rs != null){ // 关闭记录集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
使用Statement、ResultSet
•要执行SQL,必须取得java.sql.Statement操作对象,可以使用Connection的createStatement()来建立Statement对象,然后使用executeUpdate()、executeQuery()等方法来执行SQL;
具体实现代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
使用PreparedStatement、CallableStatement
•要让SQL执行生效,要执行executeUpdate()或executeQuery()方法,在此次SQL执行完毕后,调用clearParemeters()清除设置的参数,就可以再次调用PreparedStatement实例;
JDBC进阶
•DriverManager类讲解
Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
DriverManager.registerDriver(new Driver()) DriverManager.getConnection(url, user, password)
•注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
1.查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
2.程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
•推荐方式:Class.forName("com.mysql.jdbc.Driver");
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
•Connection类讲解
JDBC程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:
·createStatement():创建向数据库发送sql的statement对象。
·prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
·prepareCall(sql):创建执行存储过程的callableStatement对象。
·setAutoCommit(boolean autoCommit):设置事务是否自动提交。
·commit() :在链接上提交事务。
·rollback() :在此链接上回滚事务。
•ResultSet类卷动、更新数据
JDBC程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
1.获取任意类型的数据
getObject(int index)
getObject(string columnName)
2.获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
3.ResultSet还提供了对结果集进行滚动的方法:
next()
:移动到下一行
Previous()
:移动到前一行
absolute(int row)
:移动到指定行
beforeFirst()
:移动resultSet的最前面。
afterLast()
:移动到resultSet的最后面。
教材中遇到的问题及解决方法
对于JDBC数据库的使用有了一定了解,但是对于其的实际意义还不太明确。
其他(感悟、思考等,可选)
通过本周学习了解了JDBC连接数据库的使用。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 21/41 | |
第三周 | 450/950 | 3/7 | 22/63 | |
第四周 | 450/1365 | 2/9 | 20/83 | |
第五周 | 450/1815 | 2/11 | 20/113 | |
第六周 | 450/2315 | 2/13 | 20/133 | |
第七周 | 300/2615 | 2/15 | 15/148 | |
第八周 | 300/2915 | 2/17 | 15/163 | |
第九周 | 200/3115 | 2/19 | 10/173 | 了解了JDBC |