本文使用JDBC连接MySQL,提供一个完整的使用JDBC的使用实例,方便以后复习或者拷贝。
1.介绍
1)JDBC是Java语言访问数据库的一种规范,是一套API,即Java数据库编程接口。其采用接口和实现分离的设计思想,它的接口包含在java.sql和javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE。这些接口的实现类叫做数据库驱动程序,由数据库的厂商或其它的厂商或者个人提供。
2)为了使客户端独立于特定的数据库驱动程序(独立于厂商),JDBC规范建议开发者使用基于接口的编程方式,即尽量使用仅依赖java.sql和javax.sql的接口和类(java的多态使得客户端不用依赖具体厂商开发的驱动程序,实现客户端的通用性)。
3)JDBC工作示意图
4)JDBC类结构:DriverManager、Driver、Connection、Statement、ResultSet:
- DriverManager:是一个实现类,属于工厂类,用来产生Driver对象。
- Driver:是驱动程序对象的接口,指向一个实实在在的数据库驱动程序对象,通过DriverManager的getDriver(String URL)方法获得。
- Connection:这个接口指向一个数据库连接对象,通过DriverManager的getConnection(String URL)方法获得。
- Statement:是用于执行静态的SQL语句的接口,通过Connection的createStatement()方法获得。
- ResultSet:用于指向结果集对象的接口,通过Statement的execute等方法获得。
5)通过JDBC访问数据库的一般步骤:
- 得到数据库的驱动程序
- 创建数据库连接
- 执行SQL语句
- 得到结果集
- 对结果集做相应的处理(增删查改)
- 关闭资源
相应的时序图如下所示:
2.编码
1)准备:
- 驱动程序包名:mysql-connector-java-5.0.4-bin.jar
- 驱动类名称:com.mysql.jdbc.Driver
- 数据库URL:jdbc:mysql://10.1.40.61:3306/dbname?user=root&password=root
2)编写JdbcTest.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql;
/*
* MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
* 为了避免中文乱码要指定Unicode和characterEncoding
* 执行数据库操作之前要在数据库管理系统上创建一个数据库,名字自己定
*/
String url = "jdbc:mysql://10.1.40.61:3306/test_bid_system?"
+"user=root&password=root&Unicode=true&characterEncoding=UTF8";
try {
//之所以要使用下面这条语句,是因为要使用MySQL的驱动,所以我们要把它驱动起来
//动态加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
//一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);
//Statement带有很多方法,比如executeUpdate方法可以实现插入,更新和删除等操作
stmt = conn.createStatement();
sql = "insert into bms_weekreport(userId,submitTime,lastWeek,thisWeek) values(10041,'2014-12-30','123','321')";
// executeUpdate语句会返回一个受影响的行数,如果返回-1就没有成功
int result = stmt.executeUpdate(sql);
System.out.println("result is:"+result);
sql = "select * from bms_weekreport";
// executeQuery会返回结果的集合,否则返回空
rs = stmt.executeQuery(sql);
//对结果集进行操作
while(rs.next()) {
System.out.println(rs.getInt(1)+","+rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭ResultSet资源
try {
rs.close();
} catch (Exception e2) {
e2.printStackTrace();
}
//关闭Statement资源
try {
stmt.close();
} catch (Exception e3) {
e3.printStackTrace();
}
//关闭Connection资源
try {
conn.close();
} catch (Exception e4) {
e4.printStackTrace();
}
}
}
}
注意:在最后关闭资源的时候,不能够写成如下的形式。
finally{
try{
//关闭ResultSet资源
rs.close();
//关闭Statement资源
stmt.close();
//关闭Connection资源
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
原因是,如果在conn.close()执行之前,rs.close()或者stmt.close()出现SQLException异常,那么它就得不到执行,因此资源不会被关闭,造成连接泄露。
3.运行结果
1)JdbcTest.java运行结果:
2)项目的包结构: