JDBC(Java Data Base Connectivity,java数据库链接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
基本操作
1、连接数据库
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = null;
2、初始化驱动程序
Class.forName("com.mysql.jdbc.Driver");
3、创建一个Connection对象,建立连接
conn = (Connection) DriverManager.getConnection(url, username, password);
4、如何发送SQL语句
(1)创建Statement对象
PreparedStatement ps;
ps=(PreparedStatement)conn.prepareStatement(sql);
(2)使用Statement对象执行语句
方法1:executeUpdate()方法
int i=ps.executeUpdate();
方法2:executeQuery()方法
ResultSet r=ps.executeQuery();
方法3:execute()方法,仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。
(3)语句完成
(4)关闭Statement对象
5、添加数据
String sql="insert into course(cno,cname,cpno,ccredit) values(?,?,?,?)";
6、修改数据
String sql="update course set cno='"+course.getCno()+"'where cname='"+course.getCname()+"'";
7、删除数据
String sql="delete from course where cno="+cno;
8、查询数据
String sql="select * from course";
JDBC知识点
1、JDBC库包含的API为每个通常与数据库使用相关联的任务:连接到数据库、创建SQL或MySQL语句、执行QL或MySQL查询数据库、查看和修改结果记录。
2、JDBC架构
JDBC API支持两层和三层处理模式进行数据库访问,但在一般的JDBC体系结构由两层组成:JDBC API:提供了应用程序对JDBC的管理链接,JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库;JDBC Driver API:支持JDBC管理到驱动器连接;JDBC 驱动程序管理器可确保正确的驱动程序来访问每个数据源,该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。
3、常用接口
(1)Driver接口:此接口处理与数据库服务器通信。
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
例:装载MySQL驱动:Class.forName(“com.mysql.jdbc.Driver”);
装载Oracle驱动:Class.forName(“oracle.jdbc.Driver.OracleDriver”);
(2)Connecttion接口:与数据库中的所有的通信是通过唯一的连接对象。
Connecttion与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url,user,password)方法建立在JDBC URL中定义的数据库Connecttion连接上。
例:连接MySQL数据库:
Connection conn=DriverManager.getConnection(“jdbc:mysql://host:port/database”,“user”,“password”);
连接Oracle数据库:
Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:@host:port/database”,“user”,“password”);
连接SQLServer数据库:
Connection conn=DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port;DatabaseName=database”,“user”,“password”);
常用方法:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql):创建向数据库发送预编译sql的PrepareStatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit():在链接上提交事务。
rollback():在此链接上回滚事务。
(3)Statement接口:可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受执行存储过程的参数。
Statement:由createStatement创建,用于发送简单的sql语句(不带参数)。
PrepareStatement:继承自Statement接口,有PrepareStatement创建,用于发送含有一个或多个参数的sql语句。PrepareStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以一般使用PrepareStatement。
CallableStatement:继承自PrepareStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法:
execute(String sql):运行语句,返回是否有结果集。
executeQuery(String sql):运行select语句,返回ResultSet结果集。
executeUpdata(String sql):运行insert/updata/delete操作,返回更新的行数。
addBatch(String sql):把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
(4)ResultSet接口:这些对象保存在数据库后,执行使用Statement对象的SQL查询中检索数据。
ResultSet提供检索不同类型字段的方法,常用的有:
getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
getData(int index)、getData(String columnName):获得在数据库里是Data类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
getObject(int index)、getObject(String columnName):获得在数据库里任意类型的数据。
ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行。
Previous():移动到前一行。
absolute(int row):移动到指定行。
beforeLast():移动到ResultSet的最前面。
afterLast():移动到ResultSet的最后面。
(5)使用后依次关闭对象及连接:ResultSet----->Statement----->Connection
(6)SQLException:这个类处理发生在一个数据库应用程序的任何错误。
事务
知识点
当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时就应该为这多条语句定义一个事务。
1、事务开始于:(1)连接到数据库上,并执行一条DML语句(insert、delete、update);(2)前一个事务结束后,又输入了一条DML语句。
2、事务结束于:(1)执行conmmit或rollback语句;(2)执行一条DDL语句(例create table语句,在这种情况下,会自动执行commit语句);(3)执行一条DCL语句(例grant语句,在这种情况下,会自动执行commit语句);(4)执行一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句。
3、事务四大特性:
(1)原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。
(2)一致性:如果事务出现错误,则回到最原始的状态。
(3)隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果。
(4)持久性:当一个系统崩溃时,一个事务依然可以提交,当事务完成后,操作结果保存在磁盘中,不会被回滚。
4、事务隔离级别从高到低:读取为提交-----读取已提交-----可重复读-----序列化
编写事务
1、设置事务的提交方式为非自动提交模式。
conn.setAutoCommit(false);
2、在try块内添加事务的提交操作,表示操作无异常,提交事务。
conn.commit();
在catch块内添加回滚事务,表示操作出现异常,撤销操作。
conn.rollback();
3、
设置事务提交方式为自动提交模式:
conn.setAutoCommit(true);
示例
Connection conn =null;
Statement stmt = null;
try {
conn = getConn();
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE students SET age = '15' WHERE id = '1'");
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
System.out.print("");
}
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
System.out.print("");
}
}
}
}
JDBC示例1
数据库中原始表格
通过在eclipse中进行增删改查操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.PreparedStatement;
class Course{
private int cno;
private String cname;
private int cpno;
private int ccredit;
Course(int cno,String cname,int cpno,int ccridte){
this.cno=cno;
this.cname=cname;
this.cpno=cpno;
this.ccredit=ccridte;
}
public int getCno(){
return cno;
}
public void setCno(int cno){
this.cno=cno;
}
public String getCname(){
return cname;
}
public void setCname(String cname){
this.cname=cname;
}
public int getCpno(){
return cpno;
}
public void setCpno(int cpno){
this.cpno=cpno;
}
public int getCcredit(){
return ccredit;
}
public void setCcredit(int ccredit){
this.ccredit=ccredit;
}
}
public class JDBCDemo01 {
private static Connection getConn(){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = null;
Connection conn = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return conn;
}
private static int insert(Course course){
Connection conn=getConn();
int i=0;
String sql="insert into course(cno,cname,cpno,ccredit) values(?,?,?,?)";
PreparedStatement ps;
try{
ps=(PreparedStatement)conn.prepareStatement(sql);
ps.setInt(1,course.getCno());
ps.setString(2,course.getCname());
ps.setInt(3,course.getCpno());
ps.setInt(4, course.getCcredit());
i=ps.executeUpdate();
ps.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
return i;
}
private static int update(Course course){
Connection conn=getConn();
int i=0;
String sql="update course set cno='"+course.getCno()+"'where cname='"+course.getCname()+"'";
PreparedStatement ps;
try{
ps=(PreparedStatement)conn.prepareStatement(sql);
i=ps.executeUpdate();
System.out.println(i);
ps.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
return i;
}
private static int delete(int cno){
Connection conn=getConn();
int i=0;
String sql="delete from course where cno="+cno;
PreparedStatement ps;
try{
ps=(PreparedStatement)conn.prepareStatement(sql);
i=ps.executeUpdate();
System.out.println(i);
ps.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
return i;
}
private static Integer getAll(){
Connection conn=getConn();
String sql="select * from course";
PreparedStatement ps;
try{
ps=(PreparedStatement)conn.prepareStatement(sql);
ResultSet r=ps.executeQuery();
int c=r.getMetaData().getColumnCount();
System.out.println("-------------------");
while(r.next()){
for(int i=1;i<c;i++){
System.out.print(r.getString(i)+"\t");
if((i==4)&&(r.getString(i).length()<8)){
System.out.println("");
}
}
System.out.print("\n");
}
System.out.println("-------------------");
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
JDBCDemo01.getAll();
JDBCDemo01.insert(new Course(5,"linux",5,4));
JDBCDemo01.getAll();
JDBCDemo01.update(new Course(2,"unix",6,4));
JDBCDemo01.getAll();
JDBCDemo01.delete(1);
JDBCDemo01.getAll();
}
}
操作后数据库中表格
JDBC示例2
查询数据库中数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo02 {
String driver = "com.mysql.jdbc.Driver";
static String url = "jdbc:mysql://localhost:3306/test";
static String username = "root";
static String password = null;
public static void main(String[] args){
Connection conn = null;
Statement stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,username,password);
stmt = conn.createStatement();
String sql = "SELECT Cno,Cname FROM course";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int Cno = rs.getInt("Cno");
System.out.print("\n"+Cno);
String Cname= rs.getString("Cname");
System.out.print(" "+Cname);
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}