三十九,JDBC操做详解

1.JDBC的基本概念

JDBC:java database connective数据库连接,是一组专门负责连接并操做数据库的标准, 在整个JDBC,实际上提供了大量的接口.要使用java对数据库进行数据库的开发,则确定必须对这些标准有所支持. java

JDBC使用中的方式: sql

JDBC-ODBC:实际开发中使用不多,效率很是低. 数据库

JDBC链接: 使用各个数据库提供商给定的数据库驱动程序,完成JDBC的开发,这时须要在classpath中配置驱动程序. 网络

JDBC网络链接:主要使用网络链接数据库. oracle

2.JDBC的操做步骤

操做步骤: 学习

①加载数据库驱动程序,classpath中配置. this

②链接数据库,经过Connection接口和DriverManger类完成. spa

③操做数据库,经过Statement,PreparedStatement,ResultSet三个接口完成. code

④关闭数据库. orm

3.JDBC的链接操做

链接步骤:

①经过Class.forName加载数据库的驱动程序.

②经过DriverManager类进行数据库的链接,链接时须要输入数据库的链接地址,用户名,密码.

③经过Connection接口接收链接.

链接示例:

package com.ares.connectdemo;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectJDBC {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		System.out.println(conn);
		// 四、关闭数据库
		conn.close();
	}

}




4.数据库更新操做

执行数据库的更新操做须要Statement接口支持,能够执行增,,改操做.

4.1增长操做示例

package com.ares.updatedemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class StatementDemo01 {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		Statement stmt = null ;	// 表示数据库的更新操做
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口须要经过Connection接口进行实例化操做
		stmt = conn.createStatement() ;
		// 执行SQL语句,更新数据库
		stmt.executeUpdate("INSERT INTO person(pid,name,age,birthday,salary) VALUES 
                (perseq.nextval,'张三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			//TO_DATE是oracle数据库的时间日期格式.
		// 四、关闭数据库
		conn.close();
	}
}

4.2更新操做示例

stmt.executeUpdate("UPDATE person SET name='李四',age=33,
birthday=sysdate,salary=8000.0 WHERE pid=4") ;

4.3删除操做示例

stmt.executeUpdate("DELETE FROM person WHERE pid=4") ;

4.4查询操做示例

经过SELECT命令查询数据库,程序经过ResultSet保存所有的查询结果,经过Statement接口中的executeQuery()方法查询.经过next()方法找到返回的没一行数据,没一行中的各个列数据须要经过getXXX方法得到.

示例代码:

package com.ares.resultdemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;

public class ResultSetDemo01 {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		Statement stmt = null ;	// 表示数据库的更新操做
		ResultSet result = null ;// 表示接收数据库的查询结果
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口须要经过Connection接口进行实例化操做
		stmt = conn.createStatement() ;
		// 执行SQL语句,查询数据库
		result = stmt.executeQuery("SELECT pid,name,age,birthday,salary FROM person") ;
		while(result.next()){// 是否有下一行数据
			int pid = result.getInt("pid") ;
			String name = result.getString("name") ;
			int age = result.getInt("age") ;
			Date birthday = result.getDate("birthday") ;
			float salary = result.getFloat("salary") ;
			System.out.print("pid = " + pid + ";") ;
			System.out.print("name = " + name + ";") ;
			System.out.print("age = " + age + ";") ;
			System.out.print("birthday = " + birthday + ";") ;
			System.out.println("salary = " + salary + ";") ;
		}
		// 四、关闭数据库
		result.close() ;
		stmt.close() ;
		conn.close();
	}
}

数据查询后取值的另外一种方式:

int pid = result.getInt(1) ;

String name = result.getString(2) ;

int age = result.getInt(3) ;

Date birthday = result.getDate(4) ;

float salary = result.getFloat(5) ;




5.动态操做数据库

插入数据示例:

InputData

package com.ares.execdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class InputData {
	private BufferedReader buf = null;

	public InputData() {
		this.buf = new BufferedReader(new InputStreamReader(System.in));
	}

	public String getString(String info) {
		String str = null;
		System.out.print(info);// 打印提示信息
		try {
			str = this.buf.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return str;
	}

	public int getInt(String info, String err) {
		int temp = 0;
		boolean flag = true;// 定义一个标志位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d+")) {
				temp = Integer.parseInt(str);
				flag = false;// 退出循环
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public float getFloat(String info, String err) {
		float temp = 0.0f;
		boolean flag = true;// 定义一个标志位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d+.?\\d+")) {
				temp = Float.parseFloat(str);
				flag = false;// 退出循环
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public char getChar(String info, String err) {
		char temp = ' ';
		boolean flag = true;// 定义一个标志位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\w")) {
				temp = str.charAt(0);
				flag = false;// 退出循环
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public Date getDate(String info, String err) {
		Date temp = null ;
		boolean flag = true;// 定义一个标志位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d{4}-\\d{2}-\\d{2}")) {
				try {
					temp = new SimpleDateFormat("yyyy-MM-dd").
                                                    parse(str) ;
				} catch (ParseException e) {
					System.out.print(err) ;
				}
				flag = false;// 退出循环
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}
}

InsertDemo类示例:

package com.ares.execdemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class InsertDemo {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		Statement stmt = null; // 表示数据库的更新操做
		InputData input = new InputData() ;
		String name = input.getString("请输入姓名:");
		int age = input.getInt("请输入年龄:", "年龄必须是数字,");
		String date = input.getString("请输入生日:");
		float salary = input.getFloat("请输入工资:", "输入的工资必须是数字,");
		String sql = "INSERT INTO person(pid,name,age,birthday,salary)
                                 VALUES (perseq.nextval,'"
				+ name + "'," + age + ",TO_DATE('"
				+ date + "','yyyy-mm-dd'),"	+ salary + ") ";
		System.out.println(sql) ;
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口须要经过Connection接口进行实例化操做
		stmt = conn.createStatement();
		// 执行SQL语句,更新数据库
		stmt.executeUpdate(sql);
		// 四、关闭数据库 
		conn.close();
	} 
}

备注:这种拼凑的SQL语句其实是有问题的,好比单引号就会出现解析异常,同时也会出现数据库的注入非法操做等等.


6.PreparedStatement接口

PreparedStatementStatement接口的子接口,也是实际操做中使用较多的接口,表示预处理操做.

插入示例:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Date;

public class InsertDemo {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		PreparedStatement pstmt = null; // 表示数据库的更新操做
		InputData input = new InputData() ;
		String name = input.getString("请输入姓名:");
		int age = input.getInt("请输入年龄:", "年龄必须是数字,");
		Date date = input.getDate("请输入生日:","输入的不是日期,");
		float salary = input.getFloat("请输入工资:", "输入的工资必须是数字,");
		String sql = "INSERT INTO person(pid,name,age,birthday,salary) 
                                VALUES (perseq.nextval,?,?,?,?) ";
		System.out.println(sql) ;
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口须要经过Connection接口进行实例化操做
		pstmt = conn.prepareStatement(sql) ;// 使用预处理的方式建立对象
		pstmt.setString(1, name) ;// 第一个?号的内容
		pstmt.setInt(2, age) ;	// 第二个?号的内容
		pstmt.setDate(3, new java.sql.Date(date.getTime())) ;
 //将util下的格式转为sql下的格式.
		pstmt.setFloat(4,salary) ;
		// 执行SQL语句,更新数据库
		pstmt.executeUpdate();
		// 四、关闭数据库 
		pstmt.close() ;
		conn.close();
	} 
}

查询操做示例:

String sql = "SELECT pid,name,age,birthday,salary FROM person" ;
… ...
pstmt = conn.prepareStatement(sql) ;
		// 执行SQL语句,查询数据库
result = pstmt.executeQuery() ;
while(result.next()){// 是否有下一行数据
			int pid = result.getInt(1) ;
			String name = result.getString(2) ;
			int age = result.getInt(3) ;
			Date birthday = result.getDate(4) ;
			float salary = result.getFloat(5) ;
		}

模糊查询操做:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;

public class SelectDemo02 {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		PreparedStatement pstmt = null ;	// 表示数据库的更新操做
		ResultSet result = null ;// 表示接收数据库的查询结果
		String keyWord = "" ;
		String sql = "SELECT pid,name,age,birthday,salary FROM person 
                                WHERE name LIKE ? OR birthday LIKE ?" ;
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口须要经过Connection接口进行实例化操做
		pstmt = conn.prepareStatement(sql) ;
		pstmt.setString(1,"%"+keyWord+"%") ;
		pstmt.setString(2,"%"+keyWord+"%") ; 
		// 执行SQL语句,查询数据库
		result = pstmt.executeQuery() ;
		while(result.next()){// 是否有下一行数据
			int pid = result.getInt(1) ;
			String name = result.getString(2) ;
			int age = result.getInt(3) ;
			Date birthday = result.getDate(4) ;
			float salary = result.getFloat(5) ;
			System.out.print("pid = " + pid + ";") ;
			System.out.print("name = " + name + ";") ;
			System.out.print("age = " + age + ";") ;
			System.out.print("birthday = " + birthday + ";") ;
			System.out.println("salary = " + salary + ";") ;
		}
		// 四、关闭数据库
		result.close() ;
		pstmt.close() ;
		conn.close();
	}
}




7.批处理

定义:多条SQL语句能够一次性执行完毕,称为批处理操做.批处理是JDBC2.0以后提出的一个概念.2.0还有滚动的结果集及用滚动结果集更新数据等,可是这些操做使用较少.

Statement上定义了一个addBatch()方法,此方法能够加入批处理,以后使用executeBatch()方法执行批处理操做.
代码示例:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class BatchInsertDemo {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		PreparedStatement pstmt = null; // 表示数据库的更新操做
		String sql = "INSERT INTO person(pid,name,age,birthday,salary) 
                                VALUES (perseq.nextval,?,?,?,?) ";
		System.out.println(sql) ;
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口须要经过Connection接口进行实例化操做
		pstmt = conn.prepareStatement(sql) ;// 使用预处理的方式建立对象
		for(int i=0;i<10;i++){
			pstmt.setString(1, "lxh-" + i);// 第一个?号的内容
			pstmt.setInt(2, 20 + i); // 第二个?号的内容
			pstmt.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
			pstmt.setFloat(4, 900*i);
			pstmt.addBatch() ;	// 增长批处理
		}
		// 执行SQL语句,更新数据库
		int i[] = pstmt.executeBatch() ; 
		System.out.println(i.length);
		// 四、关闭数据库 
		pstmt.close() ;
		conn.close();
	} 
}




8.事务处理

经过commit提交事务,经过rollback回滚事务.事务处理须要依靠Connection完成.commit是提交更新操做,rollback表示提交执行过程当中出现异常,取消操做,回滚.由于数据库的操做不用事务处理的话,操做都是当即执行的.

package com.ares.trandemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class TransactionDemo02 {
	// 驱动程序就是以前在classpath中配置的jdbc的驱动程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 链接地址是由各个数据库生产商单独提供的,因此须要单独记住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 链接数据库的用户名
	public static final String DBUSER = "scott";
	// 链接数据库的密码
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示数据库的链接的对象
		Statement stmt = null; // 表示数据库的更新操做
		// 一、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 二、链接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		conn.setAutoCommit(false) ;	// 取消自动提交
		// 三、Statement接口须要经过Connection接口进行实例化操做
		stmt = conn.createStatement() ;
		try{
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'张三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'李四',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'王'五',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'赵六',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'孙七',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			// 执行SQL语句,更新数据库
			int i[] = stmt.executeBatch() ; 
			System.out.println(i.length);
			conn.commit() ;// 提交
		}catch(Exception e){
			conn.rollback() ;// 回滚
		}
		// 四、关闭数据库 
		stmt.close() ;
		conn.close();
	} 
}





20150528


JAVA学习笔记系列

--------------------------------------------

                    联系方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------
相关文章
相关标签/搜索