您的位置:首页 > 其它

day10—JDBC

2016-03-08 20:27 337 查看
JDBC:Java Database Connectivity:Java访问数据库的解决方案。
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();
				}
			}
		}
		
		
	}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: