JDBC(java DataBase Connectivity)是使用Jaca存取数据库系统的解决方案,它将不同数据库间各自差异API与标准SQL(Structured Query Language)语句分开看待,实现数据库无关的Java操作接口。开发人员使用JDBC同一的API接口,并专注于标准SQL语句,就可以避免直接处理底层数据库驱动程序与相关操作接口的差异性。
1. 简介JDBC
简单地说,JDBC希望达到的目的,是让Java程序设计人员在编写数据库操作程序的时候,可以有个同意的操作接口,无需依赖于特定的数据库API,希望达到“写一个Java程序,适合所有的数据库”的目的。
JDBC数据库驱动程序按实现方式可以分为4个类型:
◆ Type 1 : JDBC-ODBC Bridge
◆ Type 2 : Native-API Bridge
◆ Type 3 : JDBC-middleware
◆ Type 4 : Pure Java Driver
使用纯Java程序来编写驱动程序与数据库进行沟通,而不通过桥接或中间件来存取数据库。
应用程序-àPure Java Driver--à数据库
2. 连接数据库
接下来将使用MySQL数据库进行操作,所以请将下载的tar.gz文件使用解压缩软件解开,并将其中mysql-connector-*.jar加入至Classpath的设置之中,假设是D:/MyStrutsProject/WebRoot/WEB-INF/lib/mysql-connector-java-3.0.17-ga-bin.jar,则Classpath中必须有D:/MyStrutsProject/WebRoot/WEB-INF/lib/mysql-connector-java-3.0.17-ga-bin.jar这个路径设置。
在Java SE中与数据库操作相关的JDBC类都位于java.sql包中,要连接数据库,基本上必须有以下几个动作。
◆ 加载JDBC驱动程序
首先必须通过java.lang.Class 类的forName()动态加载驱动程序类,并向DriverManager注册JDBC驱动程序(驱动程序会自动通过DriverManager.registerDriver()方法注册)。MySQL 的驱动程序类是com.mysql.jdbc.Driver,一个加载JDBC驱动程序的程序片段如下所示:
Try{
Class.forName(“com.mysql.jdbc.Driver”):
}
Catch(ClassNotFoundException e){
System.out.println(“找不到驱动程序类”);
}
◆ 提供JDBC URL
JDBC URL定义了连接数据库时的协议、子协议、数据源识别。
协议:子协议:数据源识别
jdbc : mysql : // 主机名称:连接端口/数据库名称?参数=值 &参数=值
jdbc : mysql : // localhost:3306/demo?user=root&password=123456
● ”协议”在JDBC中总是jdbc开始
● “子协议”是桥接的驱动程序或是数据库管理系统名称,使用MySQL的话是”mysql”
● “数据源识别”标出找出数据库来源的地址与连接端口。
◆ 获得Connection
要连接数据库,可以向java.sql.DriverManager要求并获得java.sql.Connection对象。Connection是数据库连接的具体代表对象,一个Connection对象就代表一个数据库连接,你可以使用DriverManager的getConnection()方法,指定JDBC URL作为自变量并获得Connection对象
Try{
String url=”jdbc:mysql://localhost:3306/demo?”+”user=root&password=123456”;
Connection conn = DriverManager.getConnection(url);
}
Catch(SQLException e){
~~~~~~
}
Java.sql.SQLException是在处理JDBC时经常遇到的异常对象,SQLException是受检异常(Checked Exception),你必须使用try……catch或throws明确处理,它表示JDBC操作过程中入发生错误时的具体对象代表。
获得Connection对象或,可以使用isClosed()方法测试与数据库的连接是否关闭,在操作完数据库之后,如果确定不再需要连接,则必须使用close()来关闭与数据库的连接,以释放连接时相关的必要资源。
3. 使用JDBC进行数据操作
◆ Statement / ResultSet
Connection对象是java中数据库连接的代表对象,接下来要执行SQL的话,必须获得java.sql.Statement对象,它是java中一个SQL叙述的具体代表对象,可以使用Connection的createStatement()来建立Statement:
Statement stmt = conn.createStatement();
获得Statement对象之后,可以使用executeUpdate(),executeQuery()等方法来执行SQL.
executeUpdate()主要用来执行CREATE TABLE/ INSERT DROP TABLE/ALTER TABLE等来改变数据库内容的SQL. executeUpdate()方法会返回int结果,表示记录变动的数目。
Stmt.executeUpdate(INSERT INTO t_message values (1,’xuweijian’));
executeQuery()方法主要用于SELECT等查询数据库的SQL, executeQuery()方法会返回java.sql.ResultSet()对象,代表查询的结果,查询的结果会是一条一条的记录。可以使用ResultSet 的next()来移动至一条记录,它会返回true或false表示是否有下一条记录,接着可以使用get???()方法来获得数据,例如getString(),getInt(),getFloat(),getDouble()等方法,分别获得相对应的字段类型记录,get???()方法都提供有按字段名称获得记录,或是按字段顺序获得记录的方法。
ResultSet result = stmt.executeQuery(“select * from t_message”);
Whilt(result.next()){
System.out.print(result.getInt(”id”)+”/t”);
System.out.print(result.getString(”name”)+”/t”);
}
◆ Statement主要用于执行静态的SQL语句,也就是在执行executeQuery() executeUpdate()等方法时,指定内容固定不变的SQL语句字符串,每一句SQL只适合于当时的执行,如果你有些操作只是SQL语句中某些参数会有所不同,其余的SQL子句皆相同,则你可以使用java.sql.PrepareStatement.。
使用Connection的preparedStatement()方法建立好一个预先编译(precompile)的SQL语句,其中参数会变动的部分,先指定“?”作为占位符。
PreparedStatement stmt = conn.prepareStatement(“INSERT INTO t_message VALUES(?,?,?,)”);
等到需要真正指定参数执行时,再使用相对应的setInt()/setString()等方法,指定“?”处真正应该有的参数。
Stmt.setInt(1,2);
Stmt.setString(2,”momor”);
Stmt.setString (3,”momor@mail.com”);
Stmt.setString (4,”message2”);
例如:
PreparedStatement stmt = conn.prepareStatement(“INSERT INTO t_message VALUES(?,?,?,)”);
Stmt.setInt(1,2);
Stmt.setString(2,”momor”);
Stmt.setString (3,”momor@mail.com”);
Stmt.setString (4,”message2”);
Stmt.executeUpdate();
Stmt.clearParameters();