数据库操作
- 数据库系统是由数据库、数据库管理系统和应用系统、数据库管理员构成的。
- 数据库管理系统简称为DBMS
- JDBC技术是在Java语言中被广泛使用的一种操作数据库的技术
数据库基础知识
什么是数据库
- 数据库主要有一下特点:
- 实现数据共享
- 减少数据的冗余度
- 数据的独立性【包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构】
- 数据实现集中控制
- 数据的一致性和可维护性,以确保数据的安群星和可靠性。主要包括:
- 完全性控制,以防止数据丢失、错误更新和越权使用
- 完整性控制,保证数据的正确性、有效性和相容性
- 并发控制
- 故障的发现和回复
- 数据库基本结构层次:
- 物理数据层
- 概念数据层
- 逻辑数据层
数据库的种类和功能
分类:
- 层次型数据库
- 网状型数据库
- 面向对象型数据库
- 关系型数据库
Java DB 是一个纯Java实现的、开源的数据库管理系统(DBMS),源于Apache软件基金会(AFS)名下的项目Derby。
SQL语言
SQL(Structure Query Language,结构化查询语言)主要由以下几部分组成:
- 数据定义语言(Data Definition Language,DDL)
- 数据操纵语言(Data Manipulation Language,DML)
- 数据控制语言(Data Control Language,DCL)
- 事务控制语言(Transaction Control Language)
数据操纵语言简单介绍:
- select语句:用于从数据表中检索数据v
SELECT 所选字段列表 FROM 数据表名
WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(制定分组的条件)
ORDER BY 字段名[ASC|DESC]
例:
select name,age form tb_emp where sex = '女' order by age;
2.insert语句:向表中插入新数据
insert into 表名[(字段名1,字段名2...)]
values(属性值1,属性值2,...)
eg:
insert into tb_emp values(2,'lili','女',“销售部”);
- update语句,更新数据表中的某些记录
UPDATE 数据表名 SET 字段名 = 新的字段值 WHERE 条件表达式
eg:修改 tb_emp表中编号是2的员工年龄
update tb_emp set age = 24 where id = 2;
- delete语句:删除数据
delete from 数据表名 where 条件表达式
eg:
delete from tb_emp where id =1024;
JDBC概述
JDBC(Java DataBase Connectivity,java数据库连接) 是一种可用于执行SQL语句的 Java API(Application Programming Interface,应用程序设计接口),是连接数据库和Java应用程序的纽带
JDBC-ODBC桥
JDBC-ODBC桥是一个JDBC驱动程序,完成了从JDBC操作到ODBC(Open Database Connectivity,开放数据库连接)操作之间的转换工作,允许JDBC驱动程序被用作ODBC的驱动程序。使用JDBC-ODBC桥连接数据库的步骤如下:
- 首先加载JDBC-ODBC桥的驱动程序,代码如下:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver);
- 使用java.sql包中的Connection接口,并通过DriverManager类的静态方法getConnection()创建连接对象:
Connection conn = DriverManager.getConnection("jdbc:odbc:数据源名字","user name","password");
数据源必须给出一个简短的描述名。假设没有设置user name 和 password ,则要与数据源tom交换数据。建立Connection 对象的代码如下:
Connection conn = DriverManager.getConnection("jdbc.odbc:tom","","");
- 向数据库发送SQL语句。使用Statement接口声明一个SQL语句对象,并通过刚才创建的连接数据库对象conn的creatStatement()方法创建这个SQL对象
Statement sql = conn.creatStatement();
JDBC技术
- JDBC技术访问数据库是面向关系的
- JDBC技术主要完成以下几个任务:
- 与数据库建立一个连接
- 向数据库发送SQL语句
- 处理从数据库返回的结果
- JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序
JDBC驱动程序的类型
- JDBC的总体结构由4个组件———应用程序、驱动程序管理器、驱动程序和数据源组成。
JDBC驱动基本分为以下四种:
- JDBC-ODBC桥
- 本地API一部分用Java编写的驱动程序
- JDBC网络驱动
- 本地协议驱动
JDBC中常用的类和接口
JDBC常用的类或接口都在java.sql包中
Connection 接口
Connection接口代表与特定的数据库的连接,在连接上下问中执行SQL语句并返回结果。
Statement接口
Statement接口用于在已经建立连接的基础上向数据库发送SQL语句。
PreparedStatement接口
PrepareStatement接口用来动态地执行SQL语句
DriverManager类
DriverManager类用来管理数据库中的所有驱动程序
ResultSet接口
ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。
数据库操作
首先建立与数据库的连接,然后通过JDBC的API中提供的各种类可实现对数据表中的增删查改
已MySQL为例
连接数据库
- 要访问数据库,首先要加载数据库的驱动程序(主需要在第一次访问数据库时加载一次),然后每次访问数据时创建一个Connection对象,接着执行操作数据库的SQL语句,最后在完成数据库操作后销毁前面创建的Connection对象,释放与数据库的连接。
获取数据库连接例子:
import java.sql.*; //导入java.sql包
public class Conn { // 创建类Conn
Connection con; // 声明Connection对象
public Connection getConnection() { // 建立返回值为Connection的方法
try { // 加载数据库驱动类
Class.forName("com.mysql.jdbc.Driver");
System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try { // 通过访问数据库的URL获取数据库连接对象
con = DriverManager.getConnection("jdbc:mysql:"
+ "//127.0.0.1:3306/test", "root", "123456");
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return con; // 按方法要求返回一个Connection对象
}
public static void main(String[] args) { // 主方法
Conn c = new Conn(); // 创建本类对象
c.getConnection(); // 调用连接数据库的方法
}
}
才开始接触数据库,这里运行失败了,不知道原因,先学完这章再慢慢探索吧
行吧,数据库都没装,连接个锤子,首先得装数据库
面向数据库发送SQL语句
要执行SQL语句首先要获得Statement类对象。
try{
Statement sql = con.createStatement();
}catch(SQLException e){
e.printStackTrace();
}
处理查询结果集
有了Statement对象以后,可以调用相应的方法实现对数据库的查询和修改,并将查询的结果集存放在ResultSet类的对象中。
ResultSet res = sql.excuteQuery("select * from tb_emp");
运行结果为返回一个ResultSet对象,ResultSet对象一次只可以看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置移向下一行
顺序查询
利用ResultSet的next()方法循环:
import java.sql.*;
public class Gradation { // 创建类
static Connection con; // 声明Connection对象
static Statement sql; // 声明Statement对象
static ResultSet res; // 声明ResultSet对象
public Connection getConnection() { // 连接数据库方法
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql:"
+ "//127.0.0.1:3306/test", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return con; // 返回Connection对象
}
public static void main(String[] args) { // 主方法
Gradation c = new Gradation(); // 创建本类对象
con = c.getConnection(); // 与数据库建立连接
try {
sql = con.createStatement(); // 实例化Statement对象
// 执行SQL语句,返回结果集
res = sql.executeQuery("select * from tb_stu");
while (res.next()) { // 如果当前语句不是最后一条则进入循环
String id = res.getString("id"); // 获取列名是"id"的字段值
// 获取列名是"name"的字段值
String name = res.getString("name");
// 获取列名是"sex"的字段值
String sex = res.getString("sex");
// 获取列名是"birthday"的字段值
String birthday = res.getString("birthday");
System.out.print("编号:" + id); // 将列值输出
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + birthday);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
模糊查询
SQL语句中提供了LIKE操作符用于模糊查询,可使用"%"来代替0个或多个字符【代替一个也可以】,使用下划线“_”来代替一个字符。
import java.sql.*;
public class Train { // 创建类Train
static Connection con; // 声明Connection对象
static Statement sql; // 声明Statement对象
static ResultSet res; // 声明ResultSet对象
public Connection getConnection() { // 与数据库连接方法
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql:"
+ "//127.0.0.1:3306/test", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return con; // 返回Connection对象
}
public static void main(String[] args) { // 主方法
Train c = new Train(); // 创建本类对象
con = c.getConnection(); // 获取与数据库的连接
try { // try语句捕捉异常
sql = con.createStatement(); // 实例化Statement对象
res = sql
.executeQuery("select * from tb_stu where name like '张%'");// 执行SQL语句
while (res.next()) { // 如果当前记录不是结果集中的最后一条,进入循环体
String id = res.getString(1); // 获取id字段值
String name = res.getString("name"); // 获取name字段值
String sex = res.getString("sex"); // 获取sex字段值
String birthday = res.getString("birthday"); // 获取birthday字段值
System.out.print("编号:" + id); // 输出信息
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + birthday);
}
} catch (Exception e) { // 处理异常
e.printStackTrace(); // 输出异常信息
}
}
}
预处理语句
对于JDBC,可以通过Connection对象的==preparedStatement(String sql)==方法对SQL语句进行预处理,生成数据库底层的内部命令,并将命令封装在PrepareStatement对象中,通过调用该对象的相应方法执行底层数据库命令。
-对SQl进行预处理时可以使用通配符“?”来代替任何的字段值:
sql = con.prepareStatement("select * from tb_stu where id = ?");
在执行预处理语句之前,必须用相应方法来设置通配符所表示的值:
sql.setInt(1,2);
上述语句中的“1”表示从左向右的第几个通配符,“2”表示设置的通配符的值。
预处理语句可使应用程序更容易动态地改变SQL语句中关于字段值条件的设定。
添加、修改、删除记录
可通过PreparedStatement类的指定参数动态地对数据表中原有数据进行修改操作,并通过executeUpdate() 方法执行更新语句操作
import java.sql.*;
public class Renewal { // 创建类
static Connection con; // 声明Connection对象
static PreparedStatement sql; // 声明PreparedStatement对象
static ResultSet res; // 声明ResultSet对象
public Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql:"
+ "//127.0.0.1:3306/test", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args) {
Renewal c = new Renewal(); // 创建本类对象
con = c.getConnection(); // 调用连接数据库方法
try {
sql = con.prepareStatement("select * from tb_stu"); // 查询数据库
res = sql.executeQuery(); // 执行SQL语句
System.out.println("执行增加、修改、删除前数据:");
while (res.next()) {
String id = res.getString(1);
String name = res.getString("name");
String sex = res.getString("sex");
String birthday = res.getString("birthday"); // 遍历查询结果集
System.out.print("编号:" + id);
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + birthday);
}
sql = con.prepareStatement("insert into tb_stu(name,sex,birthday) values(?,?,?)");
sql.setString(1, "张一"); // 预处理添加数据
sql.setString(2, "女");
sql.setString(3, "2012-12-1");
sql.executeUpdate();
sql = con.prepareStatement("update tb_stu set birthday "
+ "= ? where id = ? ");
sql.setString(1, "2012-12-02"); // 更新数据
sql.setInt(2, 1); // 更新数据
sql.executeUpdate();
Statement stmt = con.createStatement();
stmt.executeUpdate("delete from tb_stu where id = 1");
// 查询修改数据后的tb_stu表中数据
sql = con.prepareStatement("select * from tb_stu");
res = sql.executeQuery(); // 执行SQL语句
System.out.println("执行增加、修改、删除后的数据:");
while (res.next()) {
String id = res.getString(1);
String name = res.getString("name");
String sex = res.getString("sex");
String birthday = res.getString("birthday");
System.out.print("编号:" + id);
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + birthday);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
实践与练习
- 创建SearchEmp类,实现查找数据表tb_emp中销售部的所有成员的功能
- 实现向数据表tb_stu中添加数据的功能,要求姓名为“李某”,性别是“女”,出生日期是“1999-10-20”
- 编写程序,实现删除出生日期在“2010-01-01”之前的学生的功能。