目录
【JavaWeb】Mysql数据库
(黑马程序员b站课)
这边文章仅仅是记录自己的学习过程,适合有sql注入基础、java基础、html等基础的朋友观看
JavaWeb学习过程
1.数据库
Mysql
JDBC
Maven
MyBatis
2.前端
HTML+CSS+JavaScript
Ajax+Vue+Element
3.JavaWeb核心技术
Tomat+HTTP+Servlet
Request+Response
JSP
Cookie+Session
Filter+Listener
综合案例
Mysql基础
1.Mysql目录
bin文件夹:放置了一些可执行文件,来操作对应的Mysql。
docs文件夹:放置了一些文档。
include文件夹:放置了.h的头文件信息,因为Mysql是C语言写的。
lib文件夹:放置了一些C语言的库文件。
share文件夹:放置了一些语言和字符集。
data文件夹:放置数据库。
.frm文件:表文件
.MYD文件:数据文件
2.Mysql语句
show database; #关键字建议用大写
单行注释:-- 或 #
多行注释:/**/
DDL操作数据库:
show database;
create database;
create database if not exists;
drop database;
drop database if esists;
select databse(); #查看当前使用的数据库
use 数据库名称; #使用数据库
DDL操作数据表:
show tables; #查询当前数据库下所有表的名称
desc 表名称; #查询表的结构
creat table 表名(字段名1 数据类型1,
字段名2 数据类型2);
drop table 表名;
drop table if exists 表名;
alter table 表名 rename to 新表名;
alter table 表名 add 列名 数据类型; #添加列
alter table 表名 modify 列名 新数据类型; #修改数据类型
alter table 表名 change 列名 新列名 新数据类型;#修改列名和数据类型
alter table 表名 drop 列名;
DML操作数据表:
insert into 表名(列名1,列名2) values (值1,值2);
update 表名 set 列名=值1,列名2=值2 where 条件;
delete from 表名 where 条件;
sql查询语句
SELECT 字段列表
FROM 表名列表
WHERE 条件查询
GROUP BY 分组字段
HAVING 分组后条件
ORDER BY 排序字段
LIMIT 分页限定
具体查看
3.约束
概念:作用于表中列上的规则,用于限制加入表中的数据,也就是一个条件。
约束是数据更加正确,有效和完整。
分类:
其实就是给对应的列添加一个关键字,没什么东西
creat table 表名(字段名1 数据类型1 关键字,
字段名2 数据类型2 关键字);
creat table 表名(id int PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE);
Mysql不支持检查约束,检查约束可以在代码里实现
外键约束
外键用来让两个表数据之间建立链接。
--创建表时添加外键约束
create table 表名(
列名 数据类型;
constraint 外键名称 foreign key (外键列名) references 主表(主表列名)
)
--建完表之后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 foreign key (外键列名) references 主表(主表列名)
4.数据库设计
1.软件研发步骤
2.数据库设计概念
建立数据库的表结构和表与表之间的关联关系的过程
有什么表,里面有什么字段,有什么关系
3.数据库设计的步骤
1)需求分析
2)逻辑分析
3)物理设计
4)维护设计
4.数据库表之间的关系
多对多实现方式:建立第三张表,中间表至少包含两个外键,分别关联两方的主键。
5.多表查询
内连接查询
--隐式内连接
SELECT 字典列表 FROM 表1,表2 WHERE 条件;
--显式内连接
SELECT 字典列表 FROM 表1 [inner] join 表2 on 条件;
--左外连接查询
SELECT 字典列表 FROM 表1 left [outer] join 表2 on 条件;
--右外连接查询
SELECT 字典列表 FROM 表1 right [outer] join 表2 on 条件;
--子查询 查询中嵌套查询
SELECT * FROM emp where salary > (select salary from emp where name="a");
--in关键字进行条件判断子查询
SELECT * from emp where id in (select did from dept where dname ='a' or dname ='b');
--虚拟表查询
把查询到的表的语句放入另一个语句的from里面
5.事务
事务简介:事务是一种机制、一个操作序列,包含了一组数据库操作命令。
事务把所有的命令作为一个整体向系统提交或者撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元。(例子:转账操作的查询余额,扣钱,加钱的操作序列)
--开启事务
start transaction;
或者 begin;
--提交事务
commit;
--回滚事务
rollback;
事务的四大特征
Mysql里面事务是自动提交的,也就是说一个单独的sql语句是自动提交了事务。
JDBC操作数据库
JDBC(Java DataBase Connectivity)就是使用java来操作关系型数据库的一套API
JDBC定义了一套标准接口来实现对所有关系型数据库的操作,对应的实现类是Mysql实现类,Oracle实现类,DB2实现类等,真正执行的代码是驱动jar包中的实现类。
JDBC快速入门(jdk1.8版本)
下载jar包,先在IDEA创建一个new——>directory,把jar放在这个directory里面,然后右键这个jar,选择add as library,设置level为Module library就可以
- 0.创建工程,导入驱动jar包
mysql-connector-java-5.1.48.jar
- 1.注册驱动
Class.forName("com.mysql.Driver");//将一个mysql的驱动类(driver)加载进内存
- 2.获取连接
Connection conn = DriverManager.getConnection (url,username,password);//通过java代码发送对应的sql语句给到mysql服务器,就要获取数据库连接
- 3.定义sql语句
String sql ="select...";//写好sql语句
- 4.获取执行sql对象
Statement stmt = conn.creatStatement();
- 5.执行sql
stmt.executeUpdate(sql);//把sql语句发送给mysql服务器去执行
-
6.处理返回结果
-
7.释放资源
JDBC API详解
DriverManager
Connection
Statement
ResultSet
PreparedStatement//Statement 的加强版
DriverManager(驱动管理类)
作用:1.注册驱动 2.获取数据库连接
DriverManager是一个工具类,里面的方法都是静态的方法,直接加.就可以调用,两个方法常用:
getConnection()//获取一个连接
registerDriver()//forname真正执行的方法,mysql5.0之后可以不用注册驱动了
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
Driver的源码:
2.获取数据库连接
语法:jdbc:mysql://IP地址:端口号/数据库名称?参数键值对
jdbc:mysql://127.0.0.1:3306/db1
-
jdbc对应的mysql协议,如果连接的是本地且端口是默认端口3306,可以不写ip和端口。
-
可以配置useSSL=false参数,禁用安全连接方式,解决警告提示
Connection(数据库连接类)
作用: 1.获取执行sql的对象 2.管理事务
1.获取执行sql的对象
- 普通执行sql对象
Statement creatStatement()
- 预编译sql的执行sql对象:防止sql注入
PreparedStatement prepareStatement(sql)
- 执行存储过程的对象
CallableStatement prepareCall(sql)
2.管理事务
这个事务管理和Mysql本身的事务管理不一样,是用类来实现,Mysql默认自动提交事务
Connection接口中定义了3个对应的方法:
开启事务:setAutoCommit(boolean autoCommit) //true自动提交事务;false手动提交事务,也就是开启事务
提交事务:commit()
回滚事务:rollback()
Statement(执行sql类)
作用:执行sql语句
int executeUpdate(sql)
//只能执行DML,DDL语句,返回值:DML语句影响的行数,DDL语句执行后,执行成功也可能返回0
Resultset executeQuery(sql)
//执行DQL语句,返回值:Resultset结果集对象
Resultset(结果集对象)
作用:1.封装了DQL查询语句的结果
获取查询结果的方法:
boolean next() //将光标从当前位置向前移动一行,并判断当前行是否为有效行
//返回值:true 有效行,当前行有数据; false 无效行,当前行无数据
xxx getxxx(参数) //获取数据
//xxx是数据类型;如 int getInt(参数);String getString(参数)
//一个参数:int就是列的编号,从1开始,String就是列的名称
使用步骤:游标向下移动,并判断改行有没有数据,再获取数据
while(rs.next()){
//获取数据
int a = rs.getString(参数);
}
小技巧:Alt+Insert可以快速补全构造方法等方法
Java创建集合的语法:把Account对象放入集合list1里面
List<Account> list1 = new ArrayList<>();
PreparedStatement(预编译sql对象)
作用:预编译SQL语句并执行,可以预防sql注入问题
- 1.获取PreparedStatement对象
//sql语句中的参数值,使用?占位符替代
String sql = "select * from user where useename = ? and password = ? ";
//通过Connection对象获取对象,并传入对应的sql语句
PreparedStatement pstmt = conn.preparedStatement(sql);
- 2.设置参数值
PreparedStatement对象:setxxx(参数1,参数2) 给?赋值
//xxx:数据类型
//参数1:?的位置编号,从1开始 参数2:?的值
- 3.执行sql
executeUpdate();
//executeQuery();
//注意没有参数了,用无参的方法,不需要再传递sql
例子:
//定义sql语句
String sql="update account set money=? where id = ?";
//获取pstmt对象
PreparedStatement pstmt =conn.prepareStatement(sql);
//设置?的值
int money=5000;
int id =1;
pstmt.setInt(1,money);
pstmt.setInt(2,id);
//关键字和字符全部被转义了,然后以文本的形式传入sql语句,预防了sql注入
//执行sql,用无参的方法
int rs = pstmt.executeUpdate();
//判断修改是否成功
if (rs>0)
System.out.println("修改成坤!");
预编译的原理:
-
预编译功能开启:useServerPrepStmts = true
-
在获取PreparedStatement对象时,就将sql语句发送给mysql服务器进行检查,编译
-
执行时就不再检查和编译了,模板一样,就只需进行一次检查、编译
数据库连接池
数据库连接池是一个容器,负责分配、管理数据库连接
允许应用程序重复使用一个现有的数据库连接,而不是重新再新建一个
释放空闲时间超过最大空间的数据库连接来避免因为没有释放数据库连接而引起的数据库遗漏
优点:资源重用,提升系统响应速度,避免数据库连接遗漏
连接池实现
标准接口:DataSource
功能:获取连接
Maven
一套标准的项目结构
一套标准化的构建流程
一套依赖管理机制
Maven简介
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<blocked>true</blocked>
</mirror>
</mirrors>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
MyBatis
MyBatis免除了几乎所有的JDBC代码,以及设置参数和获取结果集的工作