JDBC API :

是一系列的编程接口,可以用来连接数据库,访问数据等。

DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持。

Connection:用于连接某一指定的数据库

Statement : 提供了执行sql语句,获取查询结果的方法。有两个子接口。分别是:

  • PrepareStatement:用于执行预编译的sql语句


ResultSet : 提供了对结果集处理的方法



JDBC Driver API

是面向驱动程序开发商的接口,JDBC驱动程序主要有四种类型:

  • JDBC-ODBC bridge : 将JDBC的调用全部委托给其他其他编程接口调用

  • 部分Java技术的本地API驱动程序: 部分基于java,其他的委托给本地客户端的代码实现

  • 全部基于java技术的本地API驱动程序

  • 全部基于java技术的本地协议驱动。





写一个JDBC的应用程序:

首先,在mysql中创建表:

/*创建用户表*/
create table tbl_user(
	id int(11) unsigned not null auto_increment,
	name varchar(50) not null default '',
	password varchar(50) not null default '',
	email varchar(50) default '',
	primary key (id)
)
engine = InnoDB	   /*mysql存储引擎的一种,支持事务*/
default charset = utf8;

/*创建地址表*/
create table tbl_address(
	id int(11) unsigned not null auto_increment,
	city varchar(20) default null,
	country varchar(20) default null,
	user_id int(11) unsigned not null,  /*用户表的主键*/
	primary key(id)
)
engine = InnoDB
default charset = utf8;


在数据库中显示如下:

JSP (3)------JDBC编程1_Java Web

JSP (3)------JDBC编程1_Java Web_02

JSP (3)------JDBC编程1_Java Web_03

/*向表中插入数据*/
insert into tbl_user(id, name, password, email) values
(1,'xiaoming', '123456', 'xiaom@sina.com'),
(2, 'daming', '654321','daming@163.com');

insert into tbl_address(city, country, user_id) values
('beijing', 'china', 1),
('NewYork', 'USA', 2);


JDBC 编程的步骤:

  • 加载驱动

  • 打开连接

  • 执行查询

  • 处理结果

  • 清理环境


添加java代码测试:将user表中的数据输出

package com.jike.jdbc;

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

public class JDBCTest {
	public static void main(String[] args) {
		String sql = "SELECT * FROM tbl_user";
		Connection conn = null;   // 当前的数据连接
		Statement st = null;   // 向数据库发送sql语句
		ResultSet rs = null;   // 封装从数据库里查询到的数据
		// 用ctrl+shift+o自动导入以上用到的三个接口
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 注册MySQL的jdbc驱动程序  
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******", "*******");// 获取数据库连接,后面两个分别是数据库用户名和密码
			st = conn.createStatement();
			rs = st.executeQuery(sql);   // 发送sql语句
			
			while(rs.next()){
				System.out.print(rs.getInt("id")+" ");
				System.out.print(rs.getString("name")+" ");
				System.out.print(rs.getString("password")+" ");
				System.out.print(rs.getString("email")+" ");
				System.out.println();
				
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{ // 关闭顺序由小到大
			try{
				rs.close();
			}catch(Exception e2){
			}
			try {
				st.close();
			} catch (Exception e3) {
				// TODO: handle exception
			}
			try {
				conn.close();
			} catch (Exception e4) {
				// TODO: handle exception
			}
		}
	}
}


JDBC数据库的插入,更新,删除


package com.jike.jdbc;

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

public class JDBCTest {
	
	// 获取数据库连接
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");  
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "********", "*********");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}
	
	// 向数据库表中插入数据
	public static void insert(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_user(name, password, email)"+
							"values('deci', '2255225', 'deci@mail.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库中插入了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	// 更新内容
	public static void update(){
		Connection conn = getConnection();
		try {
			String sql = "update tbl_user set email='dddd@123.com' where name = 'deci'";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库中更新了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	//删除记录
	public static void delete(){
		Connection conn = getConnection();
		try {
			String sql = "delete from tbl_user where name = 'deci'";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库删除了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//insert();
		//update();
		delete();
	}
}


依次调用定义的方法,得到如图结果:

JSP (3)------JDBC编程1_Java Web_04





JDBC 编程 ----事务处理:

事务:维护数据一致性的工作单位,要么全部执行,要么全部不执行。

事务的基本特征:

  • 原子性

  • 一致性

  • 隔离性

  • 持久性


与事务相关的sql语句

开始事务: begin transaction

提交事务: commit transaction

回滚事务:rollback transaction


举例:在用户表和地址表中分别插入数据:

用户表 插入:

"insert into tbl_user(id, name, password, email)"+
         "values(10, 'Tom', '2525252', 'tom@123.com')"

地址表插入:

"insert into tbl_address(id, city, country, user_id)"+
	"values(1, 'shanghai', 'china', '10')";


可以看出,原有的数据库中地址表中已经有主键id=1的数据,程序会报出主键冲突的错误,具体代码如下:

package com.jike.jdbc;

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

public class TransactionTest {
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******","*******");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}
	
	// 向用户表中插入数据
	public static void insertUserData(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_user(id, name, password, email)"+
						"values(10, 'Tom', '2525252', 'tom@123.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向用户表中插入了"+count+"条数据");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	// 向地址表中插入数据
	public static void insertAddressData(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_address(id, city, country, user_id)"+
						"values(1, 'shanghai', 'china', '10')";
			//这里注意, 因为这条语句规定插入地址表中的数据id号为1,但是地址表中已经有id=1的数据,因此会抛出异常
			// 这是一个很严重的问题,因为数据只有部分被插入。需要采用事务保证数据要么完全插入,要么全部回滚。
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向地址表中输入了"+count+"条记录");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		insertUserData();
		insertAddressData();
	}
	
	
}


程序报出异常如图:

JSP (3)------JDBC编程1_Java Web_05


这是,数据表中的插入结果如下:

JSP (3)------JDBC编程1_Java Web_06


可见,地址表中的信息没有正确插入,而用户表中的信息插入成功,这种插入是非常危险的,其无法保持数据的完整性。因此使用事务来处理这类问题。




极客学院地址:http://www.jikexueyuan.com/course/625.html