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中创建表:
代码语言:javascript复制/*创建用户表*/
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;
在数据库中显示如下:
代码语言:javascript复制/*向表中插入数据*/
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表中的数据输出
代码语言:javascript复制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数据库的插入,更新,删除
代码语言:javascript复制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();
}
}
依次调用定义的方法,得到如图结果:
JDBC 编程 ----事务处理:
事务:维护数据一致性的工作单位,要么全部执行,要么全部不执行。
事务的基本特征:
- 原子性
- 一致性
- 隔离性
- 持久性
与事务相关的sql语句
开始事务: begin transaction
提交事务: commit transaction
回滚事务:rollback transaction
举例:在用户表和地址表中分别插入数据:
用户表 插入:
代码语言:javascript复制"insert into tbl_user(id, name, password, email)"
"values(10, 'Tom', '2525252', 'tom@123.com')"
地址表插入:
代码语言:javascript复制"insert into tbl_address(id, city, country, user_id)"
"values(1, 'shanghai', 'china', '10')";
可以看出,原有的数据库中地址表中已经有主键id=1的数据,程序会报出主键冲突的错误,具体代码如下:
代码语言:javascript复制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();
}
}
程序报出异常如图:
这是,数据表中的插入结果如下:
可见,地址表中的信息没有正确插入,而用户表中的信息插入成功,这种插入是非常危险的,其无法保持数据的完整性。因此使用事务来处理这类问题。
极客学院地址:http://www.jikexueyuan.com/course/625.html