java web2(黑马)
数据库设计
简介
1.软件的研发步骤
2.数据库设计概念
> 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优
的数据存储模型
> 建立数据库中的表结构以及表与表之间的关联关系的过程,
> 简单来说就是有哪些表?表里有哪些字段?表和表之间有什么关系?
3.数据库设计的步骤
① 需求分析 (数据是什么?数据具有哪些属性? 数据与属性的特点是什么)
② 逻辑分析 (通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
③ 物理设计 (根据数据库自身的特点把逻辑设计转换为物理设计)
④ 维护设计 (1.对新的需求进行建表; 2.表优化)
表关系
> 一对一
如: 用户和用户详情
( 一对一关系多用于表拆分,将一个实体中经常使用的字段放张表,不经常使用的字段放另一张
表,用于提升查询性能)
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一。
> 一对多(多对一)
如: 部门和员工
(一个部门对应多个员工,一个员工对应一个部门)
实现方式:在多的一方建立外键,指向一的一方的主键。
> 多对多
如:商品 和 订单
(一个商品对应多个订单,一个订单包含多个商品)
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
多表查询
概念
> 笛卡尔积:取 A,B集合所有组合情况
> 多表查询:从多张表查询数据。
1.连接查询:
> 内连接:相当于查询A 、B交集数据
> 外连接:
左外连接:相当于查询A表所有数据和交集部分数据
右外连接:相当于查询B表所有数据和交集部分数据
2.子查询
内连接
1.内连接查询语法
> 隐式内连接
SELECT 字段列表 FROM 表1,表2..WHERE 条件;
> 显示内连接
SELECT 字段列 表 FROM 表1 [INNER] JOIN 表2 ON 条件;
注:INNER可以省略不写
外连接
1.外连接查询语法
> 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] J0IN 表2 ON 条件;
> 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
注:OUTER可以省略不写
子查询
1.概念:查询中嵌套查询,称嵌套查询为子查询。
2.子查询根据查询结果不同,作用不同:
> 单行单列:作为条件值,使用= != > <等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
> 多行单列:作为条件值,使用in 等关键字进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);
> 多行多列:作为虚拟表
SELECT 字段列表 FROM (子查询) WHERE 条件;
事务
简介
> 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
> 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同
时成功,要么同时失败
> 事务是一个不可分割的工作逻辑单元
> 语法:
-- 开启事务
START TRANSACTION; 或者 BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
特征
事务四大特征
原子性: 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性: 事务完成时,必须使所有的数据都保持一致状态
隔离性: 多个事务之间,操作的可见性
持久性: 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
JDBC
简介
1.JDBC就是使用Java语言操作关系型数据库的一套API
2.全称(Java DataBase Connectivity) Java 数据库连接。
3.本质:
> 官方(sun公司)定义的一套操作所有关型数据库的规则,即接口
> 各个数据库厂商去实现这套接口,提供数据库驱动jar包
> 我门可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
快速入门
JDBC API详解
DriverManager
DriverManager(驱动管理类)作用: 1. 注册驱动 2. 获取数据库连接
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
提示:
MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2.获取连接
static Connection getconnection(strimg url,string uer, string password)
> 参数
1.url: 连接路径
语法:jdbc:mysql:/ip地址(域名):端口号/数报库名称?参数健值对1&参数健值对2...
示例:jdbc:mysq!://127.0.0.1:3306/db1
细节:
>如果连接的是本机mysql服务器,并且mysql服务默认口是3306,则url可以简写 为:jdbc:mysql:///数据库名称?参数键值对
>配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码
Connection
Connection(数据库连接对象)作用:1. 获取执行 SQL 的对象 2.管理事务
1. 获取执行 SQL 的对象
> 普通执行SQL对象
Statement createStatement()
> 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement (sql)
> 执行存储过程的对象
CallableStatement prepareCall (sql)
2. 事务管理
> MySQL 事务管理
开启事务:BEGIN; / STARTTRANSACTION:
提交事务:COMMIT;
回滚事务:ROLLBACK;
注:MySQL默认自动提交事务
> JDBC 事务管理: Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事
务,即为开启事务
提交事务:commit()
回滚事务:rollback()
Statement
Statement作用: 1. 执行SQL语句
1. 执行SQL语句
int executeUpdate(sql): 执行DML、DDL语句
返回值:(1)DML语句影响的行数
(2)DDL添句执行后,执行成功也可能返回0
ResultSet executeQuery(sql): 执行DQL语句
返回值: ResultSet结果集对象
ResultSet
>ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql): 执行DQL语句,返回 ResultSet 对象
>获取查询结果
boolean next():(1)将光标从当前位置向前移动一行
(2)判断当前行是否为有效行
返回值: true:有效行,当前行有数据
false:无效行,当前行没有数据
xxx getXxx(参数): 获取数据
> xxx:数 据类型; 如:int getnt(参数); Sting getSting(参数)
> 参数: Int: 列的编号,从1开始
Sting: 列的名称
>使用步聚:
1.游标向下移动一行,并判断该行否有数据:next0)
2.获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾
whlle(rs.next(){
//获取数据
rs.getXxx(参数);
}
PreparedStatement
PreparedStatement作用: 1.预编译SQL语句并执行: 预防SQL注入问题
注:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击
的方法
1.预编译SQL并执行SQL语句
> 获取 PreparedStatement 对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where usemame = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedSlatement pstmt = conn.prepareSlatement(sql);
> 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋
> Xxx:数据类型; 如 setlnt(参数1,参数2)
> 参数:
参数1: ? 的位置编号,从1开始
参数2: ? 的值
> 执行SQL
executeUpdate():/ executeQuery(); : 不需要再传递sql
2.PreparedStatement 原理
在获取PreparedStatement对像时,将sgl语句发送给mysql服务器,进行检查,编译(这些步票很耗时)
执行时就不用再进行这些步票了,速度更快
如果sgl模板一样,则只需要进行一次检查、编译