一、概述
1.1 什么是数据库
用于存储和管理数据库的仓库
1.2 数据库的特点
- 持久化存储数据,其实数据库就是一个文件系统
- 方便存储和管理数据
- 使用统一的方式操作数据库
1.3 分类
- 关系型数据库
通过表和表之间,行和列之间的关系进行数据的存储 - 非关系型数据库
用键值对的方式存储
二、数据库操作
2.1 注意事项
- 操作数据库>操作数据库中的表>操作数据库中表的数据,mysql数据库的关键字不区分大小写
- char 类型是固定长度的,根据定义的字符串长度分配足够的空间,适用于密码,性别之类的,耗费空间查询效率高
- varchar类型是可变长度的,只使用传递的字符串所需的空间大小,适用于有长度变化的字符串,节省空间查询效率低
- 删除结构类用drop,删除具体信息用delete
2.2 操作语言
Structured Query Language:结构化查询语言。其实就是定义了操作所有关系型数据库的规则。每一种数据库的操作方式不完全相同。称为“方言”。
- DDL(Data Definition Language)数据定义语言
- DML(Data Manipulation Language)数据操作语言
- DQL(Data Query Language)数据查询语言
- DCL(Data Control Language)数据控制语言
2.3 范式
2.3.1 为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常
- 删除异常
2.3.2 三大范式
第一范式:要求数据库表的每一列都是不可分割的原子数据项。即原子性,保证每一列不可再分,不会出现歧义。
第二范式:必须满足第一范式。每张表只描述一件事
第三范式:必须满足第一、二范式。需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
【注意事项】在实际的商业应用中,规范化与性能互相矛盾。比如在阿里规定,关联查询中的表不得超过三张。
- 考虑商业化需求和目标,(成本、用户体验)数据库的性能更加中重要
- 故意给某些表增加一些冗余字段,使多表查询变为单表查询
- 故意增加一些计算列
二、JDBC
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!
学习JDBC需要掌握俩个包,一个是java.sql和javax.sql,另外一个是数据库驱动包
2.1 JDBC连接步骤
- 加载数据库驱动
- 准备url等连接信息
【注:由于sql8的新特性,url中要加时区信息才可以】 - 通过驱动对象连接数据库
- 创建执行数据库语句的对象
- sql语句
- 执行sql语句
- 关闭资源
package com.ds.lesson01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class jdbcDemo {
public static void main(String[] args) throws Exception {
// 1.加载数据库驱动类
Class.forName("com.mysql.jdbc.Driver");
// 2.定义数据库连接信息
String url="jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
String username = "root";
String password = "123456";
// 3.有了驱动类和数据库的基本信息,通过驱动管理的连接对象来连接对应的数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 4.通过连接对象来创建执行sql语句的对象
Statement statement = connection.createStatement();
// 5.创建数据库执行语句
String sql = "SELECT * FROM books";
// 6.执行sql
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id:"+resultSet.getObject("bookID"));
}
// 7.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
2.3sql注入
在输入的用户名或者密码中拼接某种字符串,来获取数据库信息。这是Statement statement对象的缺点。解决方法就是使用PreparedStatement的对象来防止sql注入且效率更高。