JDBC:Java Database Connectivity:Java访问数据库的解决方案。
JDBC中定义了一些接口:
1、驱动管理:DriverManager
2、连接接口:Connection、DatabasemetaData
3、语句对象接口:Statement、PreparedStatement、CallableStatement
4、结果集接口:ResultSet、ResultSetMetaData
JDBC访问数据库的工作过程:
1、加载驱动
2、建立连接
3、获取SQL连接对象
4、执行SQL语句
5、处理结果集
6、关闭连接
一、加载驱动
Driver接口及驱动类加载:以oracle为例
要使用JDBC接口,需要先将对应数据库的实现部分
(驱动)加载进来。
驱动类加载方式(Oracle):
Class.forName("oracle.jdbc.driver.OracleDriver");
二、建立连接
Connection接口
Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。
Connection conn = DriverManager.getConnection(url,username,password);
其中url为固定写法字符串:
jdbc:oracle:thin:@ip:1521:sid
三、获取SQL连接对象
Statement接口
Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建:Statement stmt=conn.createStatement();
主要有三个常用方法:
1、boolean execute(sql)
如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
2、ResultSet executeQuery(sql)
执行查询语句,返回结果集
3、boolean executeUpdate(sql)
执行DML语句,返回影响的记录数
PreparedStatement
Statement主要用于执行静态SQL语句,即内容固定不变的SQL语句。Statement每执行一次都要对传入的SQL语句编译一次,效率较差。
某些情况下,SQL语句只是其中的参数有所不同,其余子句完全相同,适用于PreparedStatement。
PreparedStatement的另外一个好处就是预防sql注入攻击
PreparedStatement是接口,继承自Statement接口。
使用PreparedStatement时,SQL语句已提前编译,三种常用方法 execute、 executeQuery 和 executeUpdate 已被更改,以使之不再需要参数。
PreparedStatement 实例包含已事先编译的 SQL 语句,SQL 语句可有一个或多个 IN 参数,IN参数的值在 SQL 语句创建时未被指定。该语句为每个 IN 参数保留一个问号(“?”)作为占位符。
预编译的SQL语句写法如下:
select * from t where username = ? and password = ?;
通过PreparedStatement pstmt = conn.prepareStatement(sql)
对占位符进行初始化
pstmt.setString(1, "system");
pstmt.setInt(1, 123456);
ps:PreparedStatement比Statement接口更常用,PreparedStatement能有效防止SQL Injection(SQL注入)。
四、执行sql语句,接收结果集
ResultSet接口
执行查询SQL语句后返回的结果集,由ResultSet接口接收。
常用处理方式:遍历 / 判断是否有结果(登录)。
String sql = "select * from emp";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(
rs.getInt("empno")+","+rs.getString("ename") );
}
查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。
JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
JDBC中定义了一些接口:
1、驱动管理:DriverManager
2、连接接口:Connection、DatabasemetaData
3、语句对象接口:Statement、PreparedStatement、CallableStatement
4、结果集接口:ResultSet、ResultSetMetaData
其中,我们常用的接口仅有:
DriverManager、Connection、Statement(少用)、PreparedStatement(常用)、ResultSet、
JDBC访问数据库的工作过程:
1、加载驱动
2、建立连接
3、获取SQL连接对象
4、执行SQL语句
5、处理结果集
6、关闭连接
一、加载驱动
Driver接口及驱动类加载:以oracle为例
要使用JDBC接口,需要先将对应数据库的实现部分
(驱动)加载进来。
驱动类加载方式(Oracle):
Class.forName("oracle.jdbc.driver.OracleDriver");
二、建立连接
Connection接口
Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。
Connection conn = DriverManager.getConnection(url,username,password);
其中url为固定写法字符串:
jdbc:oracle:thin:@ip:1521:sid
三、获取SQL连接对象
Statement接口
Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建:Statement stmt=conn.createStatement();
主要有三个常用方法:
1、boolean execute(sql)
如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
2、ResultSet executeQuery(sql)
执行查询语句,返回结果集
3、boolean executeUpdate(sql)
执行DML语句,返回影响的记录数
PreparedStatement
Statement主要用于执行静态SQL语句,即内容固定不变的SQL语句。Statement每执行一次都要对传入的SQL语句编译一次,效率较差。
某些情况下,SQL语句只是其中的参数有所不同,其余子句完全相同,适用于PreparedStatement。
PreparedStatement的另外一个好处就是预防sql注入攻击
PreparedStatement是接口,继承自Statement接口。
使用PreparedStatement时,SQL语句已提前编译,三种常用方法 execute、 executeQuery 和 executeUpdate 已被更改,以使之不再需要参数。
PreparedStatement 实例包含已事先编译的 SQL 语句,SQL 语句可有一个或多个 IN 参数,IN参数的值在 SQL 语句创建时未被指定。该语句为每个 IN 参数保留一个问号(“?”)作为占位符。
预编译的SQL语句写法如下:
select * from t where username = ? and password = ?;
通过PreparedStatement pstmt = conn.prepareStatement(sql)
对占位符进行初始化
pstmt.setString(1, "system");
pstmt.setInt(1, 123456);
ps:PreparedStatement比Statement接口更常用,PreparedStatement能有效防止SQL Injection(SQL注入)。
四、执行sql语句,接收结果集
ResultSet接口
执行查询SQL语句后返回的结果集,由ResultSet接口接收。
常用处理方式:遍历 / 判断是否有结果(登录)。
String sql = "select * from emp";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(
rs.getInt("empno")+","+rs.getString("ename") );
}
查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。
连接代码如下:
public class Demo {
public static void main(String[] args) {
String driverStr = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String username = "test";
String pwd = "123456";
String sql = "select empno,ename,sal from emp";
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName(driverStr);
//2.获取连接
conn = DriverManager.getConnection(url,username,pwd);
//3.获取sql连接对象
stat =conn.createStatement();
//4.执行sql;
rs = stat.executeQuery(sql);
//5.循环遍历结果集
while(rs.next()){
//System.out.println(rs.getString("empno")+"--"+rs.getString("ename")+"-- "+rs.getString("sal"));
System.out.println(rs.getString(1)+"--"+rs.getString(2)+"--"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{//关闭连接
if(null != rs){
try {
rs.close();
rs=null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null != stat){
try {
stat.close();
stat=null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null != conn){
try {
conn.close();
conn=null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}