何为JDBC?
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
如何连接?
常用接口
Driver接口
1.Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。
2. 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
- 驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。
- 装载mysql驱动:Class.forName(“com.mysql.jdbc.Driver”);
- 装载oracle驱动:Class.forName(“com.jdbc.driver.OracleDriver”);
DriverManager接口
- DriverManager接口是JDBC的管理层,作用于用户和驱动程序之间。
- DriverManager跟踪可用的驱动程序,并在数据库和相应的驱动之间建立连接。
Connection接口
- Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并返回结果。
- DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上
-Mysql
Connection con = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);
-Oracle
Connection con = DriverManager.getConnection(“jdbc:oracle:thin@host:port/database”, “user”, “password”);
Statement接口
- 用于执行静态SQL语句并返回它所生成结果的对象。
- 三种Statement类:
- Statement:
由createStatement创建,用于发送简单的SQL语句(不带参数)
- PreparedStatement:
- 继承自Statement接口,有preparedStatement创建,用于发送含有一个或者多个输入参数的SQL语句。PreparedStatement对象
比Statement对象效率更高,并且是防止SQL注入。我们一般都使用PreparedStatement。
- CallableStatement:
- 继承自preparedStatement。由方法prePareCall创建,用于调用存储过程。
- 常用的Statement方法
- execute():运行语句,返回是否有结果集。
- executeQuery():运行select语句,返回ResultSet结果节
- executeUpdate():运行insert/update/delete操作,返回更新的行数。
具体操作(数据库以oracle为例)
-
在lib目录下导入相应jar包并且构建路径(Build Path)
2.四个步骤
加载驱动
建立连接
得到连接并创建编译对象
执行sql语句eg1: 向数据库某表中添加一条记录(增删改类似)
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class insertdemo {
public static void main(String[] args) {
//声明对象
Connection conn =null;
PreparedStatement pstmt = null;
//oracle数据的驱动
final String driver ="oracle.jdbc.driver.OracleDriver";
//oracle数据的地址
final String url ="jdbc:oracle:thin:@localhost:1521:orcl";
//sql语句
final String sql ="insert into dept(deptno,dname,loc) values(?,?,?)";
try {
// 1.把数据库连接的驱动加载到java虚拟机中
Class.forName(driver);
// 2. 得到连接
conn = DriverManager.getConnection(url,"scott","root");
// 3.通过连接对象创建编译对象
pstmt= conn.prepareStatement(sql);
// 4.对sql语句中的?进行赋值
pstmt.setInt(1, 60);
pstmt.setString(2, "boss");
pstmt.setString(3, "zhengzhou");
// 5.通过编译对象向数据库发出sql指令
int i =pstmt.executeUpdate();
System.out.println(i);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
//关闭
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
eg2:查询表中的记录
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class selectdemo2 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement ps= null;
ResultSet rs =null;
final String driver ="oracle.jdbc.driver.OracleDriver";
final String url ="jdbc:oracle:thin:@localhost:1521:orcl";
String sql ="select * from dept where dname = ? and deptno = ?";
try {
// 加载驱动
Class.forName(driver);
//建立连接
conn = DriverManager.getConnection(url,"scott","root");
//得到sql语句
ps= conn.prepareStatement(sql);
ps.setString(1, "SALES");
ps.setInt(2, 30);
//此时rs表示所查询的全部记录
rs =ps.executeQuery();
// 遍历rs中存在所有记录 rs.next() 指的是下一条记录
while(rs.next()) {
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}