黑马程序员——JAVA基础---操作数据库

来源:互联网 发布:阿里云怎么开通信任付 编辑:程序博客网 时间:2024/06/13 20:50

一 加载JDBC驱动程序

要访问数据库,首先要加载数据库驱动程序,不过只需要在第一次访问数据库时加载一次。然后,在每次访问数据库时,创建一个Connection实例,获取数据库连接,之后就可以向数据库发送SQL语句来操作数据。最后,在完成数据库操作时,释放与数据库的连接。

加载数据库驱动,可以使用Class类的静态方法forName(),语法如下:
Class.forName(String driverManager)
参数说明:
driverManager:要加载的数据库驱动,加载成功,会将加载的驱动类注册给DriverManager。如果加载失败,则会抛出ClassNotFoundException异常。
下面加载数据库驱动,代码如下。

try {    Class.forName("net.sourceforge.jtds.jdbc.Driver");} catch (ClassNotFoundException e) {    e.printStackTrace();}

上面的代码加载连接SQL Server 2008数据库驱动jtds。
技巧:
通常将负责加载驱动的代码放在static块中,好处是static块所在的类第一次被加载时加载数据库驱动,即第一次访问数据库时,可以避免重复加载驱动程序,浪费计算机资源。
创建数据库连接
在前面的章节中,已经向大家介绍了数据库管理类DriverManager,该类负责建立与管理数据库连接。通过DriverManager类的静态方法getConnection(String url, String user, String password),可以建立数据库连接。
语法如下:
Connection conn = DriverManager.getConnection(String url,String user,String passWord);
参数说明:
url:指定连接数据库的url。
user:指定连接数据库的用户。
passWord:指定连接数据库的密码。
在项目中创建类CreateConnection,在该类中定义连接数据库方法getConn()。

说明:本书采用的是使用数据库驱动包jtds连接数据库,当然还可以使用其他的驱动包,如sqljdbc4.jar驱动包,只需要替换Class类forName()方法的参数,替换为com.microsoft.sqlserver.jdbc.SQLServerDriver,将DriverManager类的getConnection()方法指定连接数据库的URL替换为“jdbc:sqlserver://localhost: 1433;DatabaseName= db_database15”,就可以完成与数据库的连接。

本实例运行的结果如图所示。

这里写图片描述

图 实例的运行结果
注意:
本实例将连接数据库作为单独的一个方法,并以Connection对象作为返回值。这样写的好处是遇到对数据库执行操作的程序时,可直接调用Conn类getConnection()方法获取连接,增加了代码的重用性。
说明:
如果在确定正确地添加了数据库驱动、代码又书写正确后,还是提示无法连接,则可以检查防火墙是否屏蔽了SQL Server或Java IDE的网络访问端口,如果是,关闭防火墙,重启SQL Server和Java IDE,进行测试。

二 执行SQL语句

 建立数据库连接的目的是与数据库进行通信,实现方式为执行SQL语句,但是通过Connection实例并不能执行SQL语句,还需要利用Connection接口的createStatement()方法获取Statement对象。

例如,创建Statement对象state的代码如下:
Statement statement = con.createStatement();
上面代码中的con为Connection实例。
Statement实例只能执行静态的SQL语句,若要执行动态的SQL语句,还需要使用PreparedStatement实例。
要实现数据的修改、插入、删除等操作,可以通过Statement接口的executeUpdate()方法,要实现从数据库中查询数据,可以通过Statement接口的executeQuery()方法。

三 获得查询结果

通过Statement接口的executeUpdate()方法可以实现向数据库中添加、删除或修改数据的操作,该方法的返回值为int型数值,代表影响数据库记录的条数,而使用executeQuery()方法实行查询操作,将返回一个   ResultSet型的结果集,其中不仅包含所有满足查询条件的记录,还包含相应数据表的相关信息,如每一列的名称、类型和列的数量等。

例如,从tb_teacher表中查询所有记录总数,代码如下:
ResultSet res = statement.executeQuery(“select * from tb_teacher”);
ResultSet类似于一张数据表,要获取数据表中指定的列值,可以通过ResultSet实例的getXXX()方法。通过getXXX()方法,可以通过指定列的序号和名称来获取数据。
循环遍历查询结果集,代码如下。
while(res.next()){ //循环遍历查询结果集
int id = res.getInt(1); //获取结果集中第一列数据
String name = res.getString(“name”); //获取名称为“name”的列值
int age = res.getInt(4);
String sex = res.getString(“sex”);
String salary = res.getString(5);
}

上段代码中的语句“res.getString("name")”中的name就是数据表中的列名,此时如果该列是数据表中的第2列,则可以将该语句修改为“res.getString(2)”,如图所示。

这里写图片描述

图 结果集中的数据结构

四 关闭连接

在建立Connection、Statement和ResultSet实例时,均须占用一定的数据库和JDBC资源,所以每次访问数据库结束后,应该及时销毁这些实例,释放它们占用的所有资源,方法是通过各个实例的close()方法,并且在关闭时建议按照如下的顺序:

resultSet.close();
statement.close();
connection.close();
建议按上面的顺序关闭的原因在于,Connection是一个接口,close()方法的实现方式可能多种多样。如果是通过DriverManager类的getConnection()方法得到的Connection实例,在调用close()方法关闭Connection实例时,会同时关闭Statement实例和ResultSet实例。但是,通常情况下,会采用数据库连接池,在调用通过连接池得到的Connection实例的close()方法时,Connection实例可能并没有被释放,而是被放回到了连接池中,又被其他连接调用,在这种情况下,如果不手动关闭Statement实例和ResultSet实例,它们在Connection中可能会越来越多,虽然JVM的垃圾回收机制会定时清理缓存,但是如果清理得不及时,当数据库连接达到一定数量时,将严重影响数据库和计算机的运行速度,甚至导致软件或系统瘫痪。总之,应尽可能多地使用const关键字。

0 0
原创粉丝点击