三十九,JDBC操作详解

1.JDBC的基本概念

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

JDBC使用中的方式:

JDBC-ODBC:实际开发中使用很少,效率非常低.

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

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

2.JDBC的操作步骤

操作步骤:

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

②连接数据库,通过Connection接口和DriverManger类完成.

③操作数据库,通过Statement,PreparedStatement,ResultSet三个接口完成.

④关闭数据库.

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; // 表示数据库的连接的对象
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		System.out.println(conn);
		// 4、关闭数据库
		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 ;	// 表示数据库的更新操作
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、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数据库的时间日期格式.
		// 4、关闭数据库
		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 ;// 表示接收数据库的查询结果
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、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 + ";") ;
		}
		// 4、关闭数据库
		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) ;
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、Statement接口需要通过Connection接口进行实例化操作
		stmt = conn.createStatement();
		// 执行SQL语句,更新数据库
		stmt.executeUpdate(sql);
		// 4、关闭数据库 
		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) ;
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、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();
		// 4、关闭数据库 
		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 ?" ;
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、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 + ";") ;
		}
		// 4、关闭数据库
		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) ;
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 3、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);
		// 4、关闭数据库 
		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; // 表示数据库的更新操作
		// 1、使用Class类加载驱动程序
		Class.forName(DBDRIVER);
		// 2、连接数据库
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		conn.setAutoCommit(false) ;	// 取消自动提交
		// 3、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() ;// 回滚
		}
		// 4、关闭数据库 
		stmt.close() ;
		conn.close();
	} 
}





20150528


JAVA学习笔记系列

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

                    联系方式

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

        Weibo: ARESXIONG

        E-Mail: [email protected]

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




你可能感兴趣的:(Connection,jdbc,ResultSet,statement)