第二十章 数据库操作

数据库操作

  1. 数据库系统是由数据库数据库管理系统应用系统数据库管理员构成的。
  2. 数据库管理系统简称为DBMS
  3. JDBC技术是在Java语言中被广泛使用的一种操作数据库的技术

数据库基础知识

什么是数据库

  1. 数据库主要有一下特点:
  • 实现数据共享
  • 减少数据的冗余度
  • 数据的独立性【包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构】
  • 数据实现集中控制
  • 数据的一致性和可维护性,以确保数据的安群星和可靠性。主要包括:
    • 完全性控制,以防止数据丢失、错误更新和越权使用
    • 完整性控制,保证数据的正确性、有效性和相容性
    • 并发控制
    • 故障的发现和回复
  1. 数据库基本结构层次:
  • 物理数据层
  • 概念数据层
  • 逻辑数据层

数据库的种类和功能

分类:

  • 层次型数据库
  • 网状型数据库
  • 面向对象型数据库
  • 关系型数据库

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)

数据操纵语言简单介绍:

  1. 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','女',“销售部”);
  1. update语句,更新数据表中的某些记录
UPDATE 数据表名 SET 字段名 = 新的字段值 WHERE 条件表达式

eg:修改 tb_emp表中编号是2的员工年龄

update tb_emp set age = 24 where id = 2;
  1. 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桥连接数据库的步骤如下:

  1. 首先加载JDBC-ODBC桥的驱动程序,代码如下:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver);
  1. 使用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","","");
  1. 向数据库发送SQL语句。使用Statement接口声明一个SQL语句对象,并通过刚才创建的连接数据库对象conn的creatStatement()方法创建这个SQL对象
Statement sql = conn.creatStatement();

JDBC技术

  1. JDBC技术访问数据库是面向关系的
  2. JDBC技术主要完成以下几个任务:
  • 与数据库建立一个连接
  • 向数据库发送SQL语句
  • 处理从数据库返回的结果
  1. JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序

JDBC驱动程序的类型

  1. 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();
		}
	}
}

实践与练习

  1. 创建SearchEmp类,实现查找数据表tb_emp中销售部的所有成员的功能
  2. 实现向数据表tb_stu中添加数据的功能,要求姓名为“李某”,性别是“女”,出生日期是“1999-10-20”
  3. 编写程序,实现删除出生日期在“2010-01-01”之前的学生的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值