JDBC编程

JDBC: Java Database Connectivity
一、数据库基础知识
二、MySQL入门
三、JDBC编程

一、数据库基础知识

1、关系数据模型:

术语

  • 关系:一张二维表
  • 元祖:表中的一行
  • 属性:表中的一列
  • 属性域:属性的取值范围
  • 主键:唯一的表示表中的元祖
  • 外键:一个关系中包含另一个关系的主键

范式:

范式:数据库设计需要满足的规范.

  • 1NF:对属性的原子性约束,不可再分解。不能有嵌套表。
  • 2NF: 对记录的唯一性约束,要求记录有唯一标示,实体必须是唯一的。所有的主键字段都要依赖与非主键字段。
  • 3NF:对字段冗余性的约束,要求任何字段都不能派生于其他字段。也就是说非主键字段直接不能相互依赖。

二、MySQL入门

1、MySQL数据类型简介

整数

  • TINYINT:1个字节,8位
  • SMAILLINT:2个字节,16位
  • MEDIUMINT:3个字节,24位
  • INT:4个字节,32位
  • BIGINT:8个字节,64位

实数(带有小数部分的数字)

  • FLOAT:4个字节,32位
  • DOUBLE:8个字节,64位
  • DECIMAL:存储精确的小数,指定小数点前后的位数。eg.DECIMAL(20,2),表示小数点后存储两个数字,小数点前存储18个数字。

字符串

  • VARCHAR:用于保存可变长度的字符串。
  • CHAR:固定长度的字符串。0~255任意值。
  • TEXT、BLOB:存储较长的字符串。

日期

  • DATETIME:保存大范围的值,从1001~9999年,精度为秒。8个字节。
  • TIMESTAMP:时间戳类型,1970.1.1~2038年,即格林威治时间到现在所经历的秒数。4个字节。

数据类型选择准则

  • 最小原则
  • 简单原则
  • 避免索引列上的NULL

三、JDBC编程

1、JDBC简介

JDBC概述

  • ODBC(Open Database Connectivity)
  • JDBC(Java Database Connectivity)

JDBC的组成

  • JDBC API:面向开发人员
  • JDBC Driver API:面向底层驱动开发商

JDBC Driver API

主要编程接口:

  • DriverManager:装载驱动程序,并为创建数据库连接提供支持
  • Connection:连接某一指定的数据库
  • Statement:执行SQL语句,获取查询结果的方法。

JDBC驱动程序主要有四种类型:

  • JDBC-ODBC bridge
  • 部分Java技术的本地API驱动程序
  • 全部基于Java技术的本地API驱动程序
  • 全部基于Java技术的本地协议驱动程序

2、JDBC编程之数据准备

建两张表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
creat table tbl_user(
id int(11) unsigned not null auto_increment,
name varchar(50) not null default '',
email varchar(50) nit null default '',
primary key(id))
engine = InnoDB
default charset = utf8;
creat table tbl_address(
id int(11) unsigned not null auto_increment,
city varchar(20) default null,
country varchar(20) default null,
primary key (id))
engine = InnoDB
default charset = utf8;

注:

1
2
3
4
id:没有业务含义的逻辑主键
auto_increment:自增长
default '' :默认值为空字符串
engine = InnoDB:设置MySQL的存储引擎,InnoDB是存储引擎的一种,支持事物。

插入数据:

1
2
3
4
5
6
7
8
9
10
insert into tbl_user(id, name, password, email)
values
(1, 'xiaosa', '123456', 'xiaosa.nicolo@qq.com'),
(2, 'nicolo', '123456', '1241251168@qq.com');
insert into tbl_address(city, country, user_id)
values('xian', 'china', 1);
insert into tbl_address(city, country, user_id)
values('beijing', 'china', 2);

3、JDBC编程之数据查询

安装驱动,下载mysql-connector-java。
将mysql-connector-java-5.1.42-bin.jar包拷到WEB-INF目录下。

JDBC编程流程

  1. 加载驱动
  2. 打开连接
  3. 执行查询
  4. 处理结果
  5. 清理环境
实现程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest{
pubilc static void main(String[] args){
String sql = "SELECT * FROM tbl_user";
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
//注册MySQL的JDBC驱动程序,class类是继承Object类
//forName方法用来初始化参数指定的类并创立一个对应的实例对象
Class.forName("com.mysql,jdbc.Driver");
//获取MySQL的数据库连接
//getConnection方法需要传入三个参数:MySQL数据库的URL、MySQL数据库的用户名、密码
////locahost:主机,3306:MySQL的端口,jsp_db:将要使用的数据库
conn = DriverManager.getConnection("jdbc:mysql://locahost:3306/jsp_db","root","");
//创建st对象
st = conn.createStatement();
//使用executeQuery方法发生sql语句返回rs结果集
rs = st.executeQuery(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){
e.printStackTrace();
}finally{
try{
//关闭rs结果集
rs.closee();
}catch(Exception e2){
}
try{
//关闭st对象
st close();
}catch(Exception e3){
}
try{
//关闭数据库连接
conn close();
}catch(Exception e4){
}
}
}
}
}

4、JDBC编程之数据更新

数据库连接方法

1
2
3
4
5
6
7
8
9
10
public static Connection getConnection(){
Connection conn = null;
try{
Class.forName("con.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://locahost:3306/jsp_db","root"," ");
}catch(Exception e){
e.printStackTrace();
}
return conn;
}

插入数据方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void insert(){
//获取数据库连接
Connection conn = getConnection();
try{
String sql = "INSERT INTO tbl_user(name, password, email)" + "VALUES('Tom', '123456', 'tom@qq.com')";
Statement st = conn.createStatement();
int count = St.executeUpdate(sql);
System.out.println("向用户表中插入了" + count + " 条记录");
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}

更新方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void update(){
//获取数据库连接
Connection conn = getConnection();
try{
String sql = "UPDATE tbl_user SET email = 'tom@126.com' WHERE name = 'Tom'";
Statement st = conn.createStatement();
int count = St.executeUpdate(sql);
System.out.println("向用户表中更新了" + count + " 条记录");
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}

删除记录的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void dele(){
//获取数据库连接
Connection conn = getConnection();
try{
String sql = "DELETE FROM tbl_user WHERE name = 'Tom'";
Statement st = conn.createStatement();
int count = St.executeUpdate(sql);
System.out.println("从用户表中删除了" + count + " 条记录");
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}

5、JDBC编程之事务处理

事务概述

  • 事务:数据库维护数据一致性的单位,在每个事务结束时都能保持事务的一致性。

事务的四个基本特征

  • 原子性:事务中的操作都被视为一个逻辑单元。
    这个事务中的逻辑单元要么全部成功,要么全部失败。事务中的元素是一个整体,是不可分割的。

  • 一致性:事务开始之前和事务结束以后,数据库都处于一致性状态。数据库的完整性约束没有被破坏。

  • 隔离性:对数据库的修改的多个事务是互相隔离的。说明事务必须是独立的。

  • 持久性:事务完成之后,它对数据的影响是永久的,

事物的语句

  • 开始事物:BEGIN TRANSACTION
  • 提交事物:COMMIT TRANSACTION
  • 回滚事物: ROLLBACK TRANSACTION

编程实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TransactionTest{
public static Connection getConnection(){
//数据库连接
Connection conn = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db, root, " ");
}catch(Exception e){
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', '123456', 'tom@gmail.com')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向用户表插入了 " + count + " 条记录");
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void insertAddressData(){
Connection conn = getConnection();
try{
Sting sql = "INSERT INTO tbl_address(id, city, country, user_id)" + "VALUES(1, 'xian','Chian', '10')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向地址表中插入了 " + count +" 条记录");
}catch(Exception e){
e.printStackTrace();
}
public static void main(String[] agrs){
insertUserData();
insertAddressData();
}
}
谢谢你请我吃糖果!