使用JDBC连接数据大概可以分为5步操作:
- 注册JDBC驱动(只做一次)
- 建立连接 Connection
- 创建执行SQL的语句(Statement)
- 处理执行结果(ResultSet)
- 释放资源
1.注册JDBC驱动程序
JDBC驱动程序实现JDBC API中定义的接口,用于与数据库服务器进行 交互。初始化驱动程序,就是打开与数据库的通信通道。
JDBC注册驱动,首先导入对应的驱动包,我在这里使用的是mysql的驱动包mysql-connector-java-5.1.25.jar,如果是连接的是其他的数据库需导入相应的驱动包。
注册的方式大概可以分为三种:
1.第一种方式:
Class.forName(“com.mysql.jdbc.Driver”);
这种方式使用了Class.forName(String className)方法动态的加载驱动程序的类到内存中,在这里使用了类加载器和反射的概念。这种方式不会对具体的驱动类依赖(推荐使用这种方式)
下面的示例使用Class.forName()来注册Oracle驱动程序:
// 静态代码块,初始化一次用于注册驱动
static {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("注册jdbc驱动");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError();
}
}
2.第二种方式:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这种方式会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖,至于为什么会有两个驱动,可以结合第一种方式来看一下,这里就细说了。
3.第三种方式:
System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
通过系统的属性设置注册驱动,如果要注册多个驱动,则System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver:com.oracle.jdbc.Driver”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
2.建立连接
Connectionconn =DriverManager.getConnection(url,user, password);
url格式:
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…..
user,password可以用“属性名=属性值”的方式告诉数据库;
其他参数如:
useUnicode=true&characterEncoding=GBK
3.创建sql并执行
Stringsql= “select * from table_namewhere col_name=?”;
PreparedStatement ps= conn.preparedStatement(sql);
ps.setString(1,“col_value”);
ps.executeQuery();
这是个查询的示例代码,在这里使用了PreparedStatement接口,它继承与Statement 它可以过滤掉参数中的 一些特殊字符,没有sql注入问题比Statement更具有优势,具体的方法可以javaAPI文档。
4.处理结果
// 处理结果
while (rs.next()) {
System.out.println(rs.getObject("name") + "\t"
+ rs.getObject("age") + "\t" + rs.getObject("birthday")
+ "\t");
}
这里可以根据需求封装成bean或者其他对象返回,提高代码的复用性等。
5.释放资源
释放ResultSet,Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。这些接口都有自己的close()方法。
以下是jdbc连接数据库的示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* jdbc工具类
*
* @author Administrator
*
*/
public final class JdbcUtils {
// 常量值
private static String url = "jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true";
private static String user = "root";
private static String password = "root";
// 让构造函数为private,这样该类就不会被实例化
private JdbcUtils() {
}
// 静态代码块,初始化一次用于注册驱动
static {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("注册jdbc驱动");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException{
Connection conn = null;
try {
conn=DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 释放资源
public static void free(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
基本的CRUD操作:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 数据库基本的CRUD操作
* @author Administrator
*
*/
public class CRUD {
public static void main(String[] args) {
// create();
// update();
delete();
read();
}
// 查询操作
public static void read() {
Connection conn = null;
//使用Statement这种方式有sql注入的危险,可使用PreparedStatement,例子可参照本包下的SQLInject类
Statement st = null;
ResultSet rs = null;
try {
// 建立连接
conn = JdbcUtils.getConnection();
// 创建语句
st = conn.createStatement();
// 执行语句
rs = st.executeQuery("select * from user");
// 处理结果
while (rs.next()) {
System.out.println(rs.getObject("name") + "\t"
+ rs.getObject("age") + "\t" + rs.getObject("birthday")
+ "\t");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JdbcUtils.free(rs, st, conn);
}
}
// 插入操作
public static void create() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 建立连接
conn = JdbcUtils.getConnection();
// 创建语句
st = conn.createStatement();
String sql = "insert into user(name,age,birthday)" + "values('天语',"
+ 23 + ",'1990-07-29')";
// 执行语句
int i = st.executeUpdate(sql);
System.out.println("i=" + i);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.free(rs, st, conn);
}
}
// 更新操作
public static void update() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 建立连接
conn = JdbcUtils.getConnection();
// 创建语句
st = conn.createStatement();
String sql = "update user set age=age+1";
// 执行语句
int i = st.executeUpdate(sql);
System.out.println("i=" + i);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.free(rs, st, conn);
}
}
// 删除操作
public static void delete() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 建立连接
conn = JdbcUtils.getConnection();
// 创建语句
st = conn.createStatement();
String sql = "delete from user where id>2";
// 执行语句
int i = st.executeUpdate(sql);
System.out.println("i=" + i);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}