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