JAVA学习:连接MySQL数据库
2008-3-4 17:39java操作数据库一般要经过加载驱动程序类,建立数据库连接,创建Statement对象,执行SQL,关闭Statement对象,关闭数据库连接几个过程。
1.加载驱动程序类:
java中加载数据库驱动是通过DriverManager 来完成的,DriverManager 类是 JDBC 的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。 另外,DriverManager 类也处理诸如驱动程序登录时间限制及登录和 跟踪消息的显示等事务。DriverManager 类包含一列 Driver 类,它们已通过调用方法 DriverManager.registerDriver 对自己进行了注册。所有 Driver类都必须包含有一个静态部分。它创建该类的实例,然后在加载该实例时 DriverManager 类进行注册。这样,用户正常情况下将不会直接调用 DriverManager.registerDriver;而是在加载驱动程序时由驱动程序自动调用。加载 Driver 类,然后自动在 DriverManager中注册的方式有两种:
A.Class.forName。这将显式地加载驱动程序类。由于这与外部设置无关,因此经常使用这种加载驱动程序的方法。以下代码加载类 acme.db.Driver
Class.forName("acme.db.Driver");
*注:Class.forName(xxx.xx.xx)要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。Class.forName(xxx.xx.xx).newInstance()可以通过含有一个类的包名和类名的字符串来实例化一个类。newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。和关键字new相比,它是个弱类型的,效率相对较低,只能调用无参构造。
B.通过将驱动程序添加到java.lang.System的属性jdbc.drivers中这是一个由DriverManager类加载的驱动程序类名的列表,由冒号分隔:初始化DriverManager类时,它搜索系统属性jdbc.drivers,如果用户已输入了一个或多个驱动程序,则DriverManager类将试图加载它们。以下代码说明程序员如何在~/.hotjava/properties中输入三个驱动程序类(启动时,HotJava将把它加载到系统属性列表中):
jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;
2.建立数据库连接:
加载Driver类并在DriverManager类中注册后,它们即可用来与数据库建立连接。当调用DriverManager.getConnection方法发出连接请求时,DriverManager 将检查每个驱动程序,查看它是否可以建立连接。
连接代码形式:Connection con = DriverManager.getConnection(dateBaseUrl, dbUser, dbPassword);
3.创建Statement对象
Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句:Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法;而CallableStatement 添加了处理 OUT 参数的方法。CallableStatement 添加了处理 OUT 参数的方法。创建Statement代码:Statement stmt = con.createStatement();
4.执行SQL语句
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
* 方法executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。
* 方法executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate的返回值总为零。
* 方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能,所以本概述后面将在单独一节中对其进行介绍。
执行语句的所有方法都将关闭所调用的 Statement 对象的当前打开结果集(如果存在)。这意味着在重新执行 Statement 对象之前,需要完成对当前 ResultSet 对象的处理。
5.最后用close()方法来关闭查询结果集和数据库连接:
例如:rs.close();con.close();
附:一个简单的MySQL数据查询操作例子:
- import java.sql.*;
- import java.io.*;
- public class MySQLTest {
- public static void main(String[] args) {
- String tableName = "test";// 表名
- String dbhost = "jdbc:mysql://localhost/test";
- String dbuser = "test";
- String dbpwd = "test";
- BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
- try {
- Class.forName("com.mysql.jdbc.Driver");// 加载驱动程序
- System.out.println("数据库驱动加载成功!");
- Connection con = DriverManager.getConnection(dbhost, dbuser, dbpwd);//建立数据库连接
- con.setCatalog("test");
- System.out.println("数据库连接成功!");
- Statement statement = con.createStatement();// 数据库操作
- System.out.print("请输入想查询的表名:");
- tableName = input.readLine();
- String sql = "SELECT * FROM " + tableName;
- ResultSet rs = statement.executeQuery(sql);
- System.out.print("请输入想列出列名:");
- String cName = input.readLine();
- // 获得数据结果集合
- if (!rs.next())
- System.out.println("表名或列名输入有误或到了末尾");
- else {
- System.out.println("查询结果为:");
- do {
- String result = rs.getString(cName);
- result = new String(result.getBytes("ISO-8859-1"), "UTF-8");
- System.out.println(result);
- } while (rs.next());
- }
- rs.close();
- con.close();
- } catch (Exception ex) {
- System.out.println(ex);
- System.exit(0);
- }
- }
- }