JAVAOO之JDBC

JDBC

JDBC是java database connection 即数据库连接技术。本文将简述jdbc常用类、jdbc编程步骤、驱动的四种类型、3种编译方式及结果集的处理方式及处理大对象类型数据等内容。
JAVAOO之JDBC

JDBC常用类

在JDBC的基本操作中,最常用的类和接口包括DriverManager、Connection、Statement、PreparedStatement、CallableStatement和ResultSet。使用这几个类,就可以完成大部分的数据库操作工作。
DriverManager类用于管理JDBC驱动的服务类,程序中主要使用该类获得Connection对象。
Connection接口代表数据库连接,每个Connection对象代表一个与数据库的物理连接会话。要想访问数据库,就必须先获得数据库连接。
Statement接口代表SQL语句,Statement对象用于执行SQL语句,它可以用于执行DML、DDL和DCL语句。当执行SQL查询时,返回查询到的结果集。
PreparedStatement接口是Statement的子接口,代表预编译的SQL语句。使用PreparedStatement对象可以执行预编译的SQL语句,性能更好。
CallableStatement接口也是Statement的子接口,代表数据库中的存储过程。使用CallableStatement对象可以执行数据库中的存储过程。
ResultSet接口代表返回的结果集。ResultSet包含访问查询结果的方法,它可以通过列索引或者列名获得列数据。使用Result对象可以操作查询返回的结果集。

JDBC编程步骤

JDBC编程一般包括如下六个步骤:
步骤一:根据应用程序所用的数据库,选择JDBC驱动程序类型。
步骤二:连接到数据库,得到Connection对象。
步骤三:通过Connection创建Statement对象
步骤四:使用Statement对象提交SQL语句
步骤五:操作结果集
步骤六:回收数据库资源
如要通过JAVA与学校数据库连接,在学生表中插入一条学生信息

驱动的四种类型

1、 类型一(JDBC-ODBC桥加ODBC驱动程序):类型一是一种JDBC-ODBC桥加上ODBC驱动程序混合方式,通过ODBC驱动程序提供JDBC访问。在Java刚出现的时候,大多数数据库只支持ODBC访问,所以这也是当时唯一可用的驱动程序。
2、 类型二(本地API和部分基于Java的驱动程序):这种类型的驱动程序将JDBC调用转换为客户端API上的Oracle、Sybase、Informix或其他DBMS的调用。
3、 类型三(为数据库中间件实现的纯Java驱动程序):这种驱动程序将JDBC调用转换为与中间件厂商的网络协议,然后又通过中间件服务器转换为DBMS协议。
4、 类型四(本地协议纯Java驱动程序):这类驱动程序将JDBC调用直接转换为DBMS所使用的网络协议,来自客户端机器上的请求可直接调用DBMS服务器。
**

加载驱动

Class.forName(驱动程序类);
这里驱动程序类就是数据库驱动类所对应的字符串。例如,如下是加载SQL Server、MySQL和Oracle驱动程序的代码:

	//加载SQL Server驱动程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

//加载MySQL驱动程序
Class.forName("com.mysql.jdbc.Driver");  

//加载Oracle驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");

编译的3种方式

Statement
直接编译,在定义sql语句用‘“++”’连接需要参数如下:

String sql=" select * from t_student where id=’"+student.getId()+"’";
此编译可能会出现注入攻击,在输入时恶意破坏。

PrepareStatement
预编译
Statement常用于执行一个肯定只发生一次,并且没有参数的SQL语句。如果我们有SQL语句要执行很多次,不管这个语句是否带有参数,都应该使用PreparedStatement。

psmt = conn.prepareStatement("insert into Employee values(?, ?, ?)");
psmt.setXX(index,values);//set何种数据类型,index是第几个从1开始,values值是什么

CallableStatement
用于编译存储过程

执行方式

execute 在不知道执行语句是更新还是查询时使用
executeUpdate 在执行语句为插入、修改、删除的语句,返回一个int值
executeQuery 在执行语句为查询的语句时,采用此方法。返回一个ResultSet结果集

结果集的处理方式

判断结果集中是否有数据,使用next()方法
获得结果集中的数据,使用getxx()的方法,可以通过索引和列名得到值。
ORM对象关系映射,把从数据库获得的数据,对象关系实体映射。

如:学生表中的数据添加一条记录,学生表在学校数据库中
思路如下:
1、通过JavaBean新建学生类
2、连接数据库
代码如下:

新建学生类:

package com.gezhi.bean;

import java.io.Serializable;
/**
 * 学生类
 * @author Administrator
 *
 */
public class StudentBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 学生名字
	 */
	private String stuName;
	/**
	 * 性别
	 */
	private Integer gender;
	/**
	 * 年龄
	 */
	private Integer age;
	/**
	 * 班级编号
	 */
	private int classId;
	public StudentBean() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public Integer getGender() {
		return gender;
	}
	public void setGender(Integer gender) {
		this.gender = gender;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public int getClassId() {
		return classId;
	}
	public void setClassId(int classId) {
		this.classId = classId;
	}
	@Override
	public String toString() {
		return "StudentBean [stuName=" + stuName + ", gender=" + gender + ", age=" + age + ", classId=" + classId + "]";
	}
	

}

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

import com.gezhi.bean.StudentBean;

public class ConnectionDB {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	/**
	 * 准备数据
	 */
	StudentBean student=new StudentBean();
	student.setStuName("张三");
	student.setAge(18);
	student.setGender(0);
	student.setClassId(2);
	
	/**
	 * 加载驱动
	 */
	String driver="com.mysql.jdbc.Driver";
	try {
		Class.forName(driver);
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	/**
	 * 连接数据库
	 */
	Connection conn =null;
	String url="jdbc:mysql://localhost:3306/DatabaseName=test?useUnicode=true&characterEncoding=UTF8";
	String user="root";
	String password="1234";
	try {
		conn=DriverManager.getConnection(url, user, password);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	PreparedStatement ps=null;
	/**
	 * 声明sql语句
	 */
	String sql="insert into(student_name,gender,age,class_id) values(?,?,?,?)";
	try {
		ps=conn.prepareStatement(sql);
		ps.setString(1,student.getStuName());
		ps.setInt(2, student.getGender());
		ps.setInt(3, student.getAge());
		ps.setInt(4, student.getClassId());
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	/**
	 * 执行sql语句
	 */

	try {
		ps.executeUpdate();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	/**
	 * 关闭连接
	 */
	try {
		conn.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}