A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李子萌 初级黑马   /  2018-10-19 08:51  /  2168 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数据库概述
1.用于存储和管理数据的仓库
2.拥有持久化存储数据的特点
3.方便存储和管理数据,使用统一的方式SQL操作数据库
数据库
Oracle;收费的大型数据库
MySQL;开源免费小型数据库,被Oracle收购
SQL Server;
DB2;常用在银行系统中
SQLite;嵌入式的小型数据库,应用在手机端嵌入在安卓系统
MySQL的安装与卸载
解决2003报错
一、以管理员运行命令提示符窗口
二、msiexec/package  mysql的所在路径
MySQL服务启动和关闭
1.cmd->services.msc 打开服务窗口
2.以管理员身份运行cmd net stop mysql 停止
   cmd net start mysql 启动
MySQL服务登入和退出
登入
1.mysql - uroot - p密码
2.mysql - hip - uroot -p目标密码
3.mysql - - host = ip - - user=root - - password=连接目标密码
退出
exit
quit
MySQL注意事项
        mysql数据库服务器软件和数据库和表和数据(表记录)包含关系
1.先有mysql数据库软件
2.在数据库软件上面创建多个数据库(对应文件夹)
3.在数据库里面创建多张表(对应的文件)
4.在表(二维表格)里管理表记录(数据)
表区分表结构和表记录
表结构;表的字段和字段对应的数据类型
表记录;表的字段对应的值
Sql概念
Structured Query Language 结构化查询语言(不仅能查询还可以进行添加,删除和修改)sql就是一套操作规则语法
定义了操作所有关系型数据库的规则。
每一种数据库操作方式存在不一样的地方 (方言)。
SQL通用语句
1.SQL语句可以单行或者多行,以分号结尾
2.可以使用空格和缩写增强语句的可读性
3.MySQL数据库的SQL语句不区分大小写,关键字使用大写。
4.三种注释
单行注释 - - (空格)注释内容
#注释内容
多行注释 /* 注释内容*/
sql的常见分类
常见四类
DDL;数据库定义语言,作用创建操作数据库和数据表以及修改数据库和数据表(表结构)。
DCL;数据库控制语言,作用给数据库和数据表进行授权操作
DML;数据库操作语言,作用对表中的记录(数据)进行添加、修改、删除。
DQL;数据库查询语言,作用对表中的记录,进行查询操作
sql操作数据库
操作数据库
Create(创建)
创建数据库
create database 名称;create database if not exists 名称;(创建的数据库名称不能重复,创建前 先判断再创建)
create database 名称 character set 指定字符集;
Retrieve(查询)
查询数据库的名称
show databases ;
查询某个数据库的字符集,查看数据库的创建语句
show create database 数据库的名称;
Update(修改)
修改数据库的字符集
alter detabase 数据库名称 character set 字符集名称 ;
Delete(删除)
删除数据库
drop database 数据库名称 ;
判断数据库是否存在 存在再删除数据库
create database if exists 名称 ;
使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
sql操作表
Create(创建)
语法
create table 表名(
列名1 数据类型1,
列名n 数据类型n(最后一列不加,)
);
如果将来不给这个字段赋值,或赋值为null
则默认使用当前系统时间来自动赋值。
Retrieve(查询)
查询某个数据库中的所有表的名称
shouw tables;
查询表结构
desc 表名;
Update(修改)
修改表名
alter table 表名 rename to 新的表名
修改表的字符集
alter table 表名 character set 字符集名称;
添加一列
alter table 表名 add 新列名 数据类型;
修改列的名称 类型
alter table 表名 change 列名 修改的新列名 新数据类型;
alter table 表名 modify 列名 新数据类型
删除列
alter table 表名 drop 列名;
Delete(删除)
删除表名
drop table 表名;
drop table if exists表名;

DML增删改
添加数据
insert into 表名(列名1,列名n)values(值1,值n);
注意事项;
列名和值要一一对应
如果表名后,不定义类名,则默认给所有列添加值
insert into 表名 values (值1,值n);
除了数字类型,其他类型需要使用引号
删除数据
delete from 表名[ where 条件]
注意事项
如果不加条件,则删除表中所有记录。
如果要删除所有记录
delete from 表名; 有多少条记录就会执行多少次删除操作
truncate table 表名; 先删除表,然后再创建一张一模一样的表(属于DDL的sql语句)
修改数据
update 表名 set 列名 1 = 值2,列n=列n[where 条件];
注意事项
如果不加任何条件则会将表中所有记录全部修改
DQL查询表记录
基础查询
select*from 表名
多个字段的查询
select 字段名1,字段名n from 表名;
注意事项
如果查询所有字段,则可以使用*来替代字段列表
去除重复
select distinct 字段名 from 表名; ;两个重复的名才可以去除
计算列
一般可以使用size运算计算一些列的值(一般只会进行数值的计算)
ifnll(表达式1,表达式n);null参加的运算,计算结果都为null
表达式1;哪个字段需要判断是否为null
如果该字段为null后的替换值
起别名
AS Alias(别名名称)
条件查询
模糊条件查询
分组条件查询
排序条件查询
子查询
聚合函数查询
注意事项
1.字段,列名称,表头,都表示一个意思,都是表的Field
2.字符集,编码格式,编码表,都表示一个意思,都是编码
常见编码;utf-8 万能码表
gbk 中文码表
iso-8859-1 西欧码表
一、单表查询
1.模糊查询
基本语法;where 字段 like ' % 或者使用 _';
字符:%表示任意字符(0-N个字符),_表示一个任意字符。
2.条件查询
字段 between 值 1 and 值2
等同于 字段>=值1 and 字段<=值2
字段 in(值1,值n)等同于 字段=值1 or 字段=值2,
is null 如果值为null 不能使用 = ,要使用is null
is not null 值不为 null
3.排序查询
语法;order by 子句
order by 排序字段 1 排序方法1,排序n 排序方法n
排序方式
ASC;生序,默认的
DESC;降序
4.分组查询
基本语法;group by 分组的0字段
按字段进行分组(分组按字段的共同特点进行分组)
注意事项;
分组字段 数据要有共同点
分组查询时 select 分组字段,聚合字段 form-
语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
opder by
排序
limit
分页限定

where和having的区别
where在分组之前进行限定,如果不满足条件,则不参与分组,havubg
按照 性别分组,分别查询男女平均人数
5.分页查询
分页;数据太多,一次性查询出来完,展示效果不好
分页操作,不同的数据库分页基本原理不一样
mysql;limit 进行分页,其它数据不能使用limit进行分页
语法
limit 开始的索引,每页查询的数据
SELECT*FROM 名 LIMIT 0,5 第一页显示5个
公式;开始的索引=(当前的页码减1)*每页显示的条数
6.聚合函数查询
将一列数据作为一个整体,进行纵向的计算。
count;计算个数
一般选择非空的列;主键
count (*)
SELECT COUNT (NAME) FROM student;(计算出人数)
max;计算最大值
SELECT MAX(计算的列)FROM student;
min;计算最小值
SELECT MIN(计算的列)FROM student;
sum;计算和
SELECT SUM(计算的列)FROM student;
avh;计算平均值
SELECT AVG(计算的列)FROM student;
注意事项;
聚合函数里面的参数;是指 表的字段
聚合函数进行运算时,null值不参加运算
解决方法
选择不包含非空的列进行计算
IFNULL函数
聚合函数一般是对 int类型的进行计算,其他类型没有意义
特别在使用count(字段)字段一般是主键字段(非空,唯一)
一、约束的概念
一种规范(限制),数据约束就是对表中的数据进行规范,让数据具有某种特点。
对表中的数据进行限定,保证数据的正确性,完整性,有效性。
二、数据库的约束分类;
主键约束;primary key (PRIMARY KEY 拥有非空和唯一的特性)
非空约束;not null (NOT NULL 某一列的值不能为NULL )
唯一约束;unique (UNIQUE 某一列的值不能重复)
外键约束;foreign key (FOREIGN KEY 让表建立关联关系,从而保证数据的正确性)
1、非空约束使用方式;
创建表时添加非空约束;
CREATE TABLE 表名(id INT,name VARCHAR(20) NOT NULL);--name 为非空
删除表中的非空约束;
ALTER TABLE 表名 MODIFY name VARCHAR(20);
创建表后添加非空约束;
ALTER TABLE 表名 MODIFY name VARCHAR(20) NOT NULL;
2、唯一约束使用方法;
创建表时添加唯一约束;
CREATE TABLE 表名(id INT,name VARCHAR(20) UNIQUE );--name 为唯一
删除表中的唯一约束;
ALTER TABLE 表名 DROP INDEX name;
创建表后添加唯一约束;
ALTER TABLE 表名 MODIFY name VARCHAR(20)UNIQUE;
注意事项;
唯一约束可以有NULL值,但是只能有一列一条数据有NULL。
3、主键约束使用方法
创建表时添加主键约束;
CREATE TABLE 表名(ID INT PRIMARY KEY ,NAME VARCHAR(20));--给ID添加主键约束。
删除表中的主键约束;
ALTER TABLE 表名 DROP PRIMARY KEY;
创建表后添加主键约束;
ALTER TABLE 表名 MODIFY ID INT PRIMARY KEY;
注意事项;
非空并且唯一。
* 一张表只能有一个字段为主键。
* 同时拥有主键的唯一约束和非空约束也不算是主键
主键就是表中记录的唯一标识。
4、自动增长的概念;(AUTO_INCREMENT)
如果某一列是数值类型的,使用AUTO_INCREMENT 可以来完成值的自动增长
在创建表时,添加主键约束,并且完成主键自增长;
CREATE TABLE 表名(ID INT PRIMARY KEY AUTO_INCREMENT NAME VARCHAR(20));--给ID添加主键约束
INSERT INTO 表名 VALUES()
删除自动增长;
ALTER TABLE 表名 MODIFY id INT ;
添加自动增长;
ALTER TABLE 表名 MODIFY id INT AUTO_INCREMENT;
注意事项;
自动增长对数字类型的字段有效。
只要字段是int类型就可以自增长。
5、外键约束使用方法;
创建表时,可以添加外键
CREATE TABLE 表名(CONSTRAINT (外键约束) 外键名称FOREIGN KEY (外键列名称) references 主表名称(主表列名称))
删除外键
ALTER TABLE 外键名 DROP FOREIGN KEY 主表名
添加外键
ALTER TABLE 表名CONSTRAINT (外键约束) 外键名称 FOREIGN KEY (外键列名称)REFERENCES 主表名称(主表列名称)
注意事项;
让表建立关联关系,从而保证数据的正确性
外键的特点;
外键的值不能随意写。
外键的值引用于另一张表的主键值。
外键的值可以为NULL但是没有任何意义
外键的设计原则;
主表 子表
6、级联操作使用方法;(ON UPDATE CASCADE)
设置级联更新
添加外键时 ON UPDATE CASCADE
级联删除
添加外键时 ON DELETE CASCADE
注意事项;
只有表于表之间有关联关系,才能进行级联操作。
作用;当主表的数据发生变化时,那么字表的数据会级联发生变化。
级联操作;一般情况下,级联操作对修改和删除。
第一种情况,当主表的数据变化时,子表的数据和主表的数据保持一致。
语法;ON UPDATE CASCADE ON DELETE CASCADE
第二种情况,当主表的数据变化时,子表(外键)的数据设置为null。
语法;ON UPDATE SET NULL ON DELETE SET NULL

Duplicate[ 重复的值]
一、多表之间的关系
1、一对一;
比如;用户表和信息表。
主表(字表)可以为任意一方。
2、一对多(多对一);
比如;部门表和员工表。
主表;一方表,这里指的就是部门表。
子表;多方表,这里指的是员工表。
外键设计在字表里面
3、多对多(强化版的一对一);
比如;学生表和课程表。
外键设计原则;提供一张中间表来完成外键的关联
注意事项;
让表建立关联关系,从而保证数据的正确性
外键的特点;
外键的值不能随意写。
外键的值引用于另一张表的主键值。
外键的值可以为NULL但是没有任何意义
外键的设计原则;主表 子表
二、数据库设计的范式
概念;设计数据库时,需要遵循的一些规范
分为六类;
第一范式(1NF);每一列都是不可分割的原子数据。
第二范式(2NF);在1NF的基础上,非码属性必须完全依赖于候选码
第三范式(3NF);在2NF基础上,任何非主属性不依赖于其他主流
分类:
1. 第一范式(1NF):每一列都是不可分割的原子数据项
2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
概念:
1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号-->姓名。 (学号,课程名称) --> 分数
2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) -- > 姓名
4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号-->系名,系名-->系主任
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

三、数据库备份与还原
两种方式;
1.命令行
备份;mysqldump -u用户名 -p 密码 数据库的名称> 保存的路径
还原;
登入数据库
创建数据库
使用数据库
执行文件source文件路径
2.图形化工具
一、多表查询:
1.概述;多个表放在一起查询
问题:会出现笛卡尔积(会出现无用数据)
笛卡尔积:有两个集合A,B取这两个集合的所有组成情况
解决问题:完成多表查询必须消除无用数据 主键=外键 (笛卡尔积)
2.内连接查询;
2.1隐式内连接;使用WHERE条件消除无用数据
例子:
查询所有员工信息和对应的部门信息
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
2.2显示内连接;
语法:
select 字段列表 from 表名1 [inner] join 表名2 on 条件
例如:
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
2.3注意事项;
1.从哪些表中查询数据
2.条件是什么
3.查询哪些字段
3.外连接查询
左外链接
语法;select 字段列表 from 表1 LEFT JOIN 表2 on 条件
查询的是左表所有数据,以及其交集部分
右外链接
语法;select 字段列表 from 表1 RIGHT JOIN 表2 on 条件
查询的是右表所有数据,以及其交集部分

4.子查询
概念;查询中嵌套查询,称嵌套查询为子查询。
案例
查询工资最高的员工信息
1 查询最高的工资是多少
SELECT MAX(salary) FROM emp;
2 查询员工信息,并且工资等于9000的
SELECT * FROM emp WHERE emp.`salary` = 9000;
一条sql就完成这个操作。子查询
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
5.子查询的不同情况
5.1.子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
5.2.子查询的结果是多行单列的
子查询可以作为条件,使用运算符in来判断
5.3.子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询
注意;
笛卡尔积;一个外键值对应多个主键值
有两个集合A,B取这两个集合所有组成情况
要完成多表查询,需要消除无用的数据
一、事务的基本介绍
1.概念;
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作;
开启事务;start transaction
回滚;rollback 把数据恢复到初始状态
提交事务;commit 把数据持久保存到表
3.MySQL数据库种事务默认自动提交
事务提交的两种方式;
自动提交;
mysql就是自动提交的
一条DML(增删改)语句会自动提交一次事务
手动提交;
Oracle默认是手动提交事务的
需要开启事务,再提交
修改事务的默认提交方式
查看事务的默认提交方式:SELECT @@autocommit;--1代表自动提交 0代表手动提交
修改默认提交方式;SET@@autocommit=0;
二、事务的四大特征
1.原子性;是不可分割的最小操作单位,要么同时成功,要么同时失败。
2.持久性;当事务提交或者回滚后,数据会持久化的保存数据
3.隔离性;当多个人事务之间,相互独立
4.一致性;事务操作前后,数据总量不变
三、事务的隔离级别
概念;多个事务之间隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题
存在的问题;
1.脏读;一个事务,读取到另一个事务中没有提交数据
2.不可重复读(虚读);在同一个事务中,两次读到的数据不一样
3.幻读;一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
隔离级别;
1.读未提交;read uncommitted;
产生问题;脏读、不可重复读、幻读
2.读已提交(Oracle);read committed;
产生的问题;不可重复读、幻读。解决;脏读
3.可重复读(MySQLM默认);repeatable;
产生的问题;幻读。解决;脏读,不可重复读。
4.串行(x)化;serializable;
解决;脏读、不可重复读、幻读,效率低。
一、SQL的分类;
1.DDL;操作数据和表
2.DML;增删改
3.DQL;查询表中的数据
4.DCL;管理用户,授权
二、DCL的使用
管理用户
1. 添加用户:
语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
2. 删除用户:
语法:DROP USER '用户名'@'主机名';
3. 查询用户:
1. 切换到mysql数据库
USE myql;
2. 查询user表
SELECT * FROM USER;
通配符: % 表示可以在任意主机使用用户登录数据库
三、 权限管理:
1. 查询权限:
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
grant all pribileges on *.*to root@% identified by‘123456’
3. 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

一、JDBC概念
Java DataBase Connectivity Java 数据库连接,Java语言操作数据库
JDBC的本质
是sun定义了操作所有关系型数据库的规则(接口),各个数据数据库厂商取实现接口,提供数据库驱动JAR包,使用这套接口编程 真正执行的代码是驱动JAR包中的实现类。从而让一段代码实现不同数据库。
* 接口不可以直接调用方法,所以真正起作用的是数据库厂商提供的实现类
* 接口是多实现,单继承的
* 数据库必须实现sun提供的规范,才能通过jdbc来操作不同数据库
* JDBC一套接口使用方法 JDBC 对象 = new 不同数据库的实现类()
JDBC使用步骤
1.导入驱动JAR包
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
3.获取数据库连接对象 connection
con = DriverManager.getConnection("jdbc:mysql:///day4","root","ROOT");
4.定义SQL
String sql = "insert into dept values(6,'董事长')";
5.获取执行SQL语句的对象 statement
6.执行SQL,接收返回结果
7.处理结果
8.释放资源
JDBC常见异常
java.sql.Exception:Access denied for user ' root
JDBC详解各个对象
1.DriverManager; 驱动管理对象
4.ResultSet;结果集对象
结果集:封装的查询结果,查询结果就是二维表格
二维表的列编号是从1开始(从表的id开始)
5.PreparedStatement;执行SQL的对象
SQL注入问题;在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题
随便输入用户名,密码输入 a' or ‘a' = ’a
sql:select*from user where username=随便输入的用户名andpassword = a' or ‘a' = ’a
解决SQL注入问题;使用PreparedStatement对象来解决
预编译的SQL:参数使用?作为占位符
步骤;
1.导入驱动JAR包
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
2.注册驱动
3.获取数据库连接对象 connection
4.定义SQL
sql的参数使用?作为占位符
5.获取执行SQL语句的对象 statement
6.给?赋值:
方法:setXxx
7.执行SQL,接收返回结果
8.处理结果
9.释放资源
传递的参数 会作为sql语句的一部分,进行拼接,而不仅仅是作为参数来使用
为什么使用prepardStatment不会出现sql注入问题
传递的参数仅仅就是作为参数来使用,而不会作为sql语句的一部分,所有防止sql注入

一、数据库连接池
概念;就是一个容器(集合)DataSource,存放数据库连接的容器。
当系统初始化后,容器被创建,容器中申请一些连接对象,用户访问数据库时,从容器中获取连接对象,访问后将连接对象归还给数据库容器。
理解;用户使用Connection访问数据库,访问完后close释放Connection。
;用户使用Connection访问数据库,访问完后将Connection归还到连接池。
好处;节约资源,用户访问高效
实现;标准接口DataSource属于java.sql包下
DataSource;一个连接到这个DataSource对象所代表的物理数据源的工厂。
方法:获取连接 getConnection()
:归还连接 Connection.close()
如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法。则不会关闭连接,而是归还连接
;一般我们不去实现它,由数据库厂商来实现
C3P0:数据库连接池技术
Druid:数据库连接实现技术,由阿里巴巴提供
C3P0;数据库连接池使用
;导入jar包
导入两个c3p0jar包-将jar包放到AddasLibrary中
导入MySQL驱动jar包,放到AddasLibrary中
;定义配置文件
名称:格式必须为c3p0.properties或者c3p0-config.xml
路径:必须将文件放在src目录下
导入c3p0配置文件放在src下,更改参数
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day4</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<!-- 初始化申请的连接数量 -->
<property name="initialPoolSize">5</property>
<!-- 最大的连接数量 -->
<property name="maxPoolSize">10</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">3000</property>
;创建数据库连接池对象
数据库连接池对象 ComboPooledDataSource
//1.创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
;获取连接 getConnection
//获取连接对象
Connection conn = dataSource.getConnection();//默认使用c3p0默认配置
//获取使用指定名称配置
DataSource dataSource1 = new ComboPooledDataSource("配置中的名称")
Druid;数据库连接池使用,由阿里巴巴提供
;导入jar包
导入druid包-将jar包放到AddasLibrary中
导入MySQL驱动jar包,放到AddasLibrary中
;定义配置文件
是properties形式的
导入druid配置文件可以任意名称,可以放在任意目录下
driverClassName =com.mysql.jdbc.Driver
url =jdbc:mysql://127.0.0.1:3306/day4
;加载配置文件
//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
;获取数据库连接池对象:通过工厂来获取
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
;获取连接:getConnection
//获取连接
Connection conn = ds.getConnection();
System.out.println(conn);

二、定义工具类
1.定义一个类JDBCUtils
//1.定义成员变量 DataSource
private static DataSource dataSource;
2.提供静态代码块加载配置文件,初始化连接池对象
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
获取DataSource
//2.获取DataSource
dataSource = DruidDataSourceFactory.createDataSource(pro);
3.提供方法
1.获取连接方法:通过数据库连接池获取连接
//3.获取连接
public static Connection getConnction() throws SQLException {
return dataSource.getConnection();}
2.释放资源
public static void close(Statement stmt, Connection conn) {
cloose(rs:null,stmt,conn) }
重载
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try { rs.close(); } catch (SQLException e) {
e.printStackTrace(); } }
if (stmt != null) {
try { stmt.close(); } catch (SQLException e) {
e.printStackTrace(); } }
if (conn != null) {
try { conn.close();//归还连接} catch (SQLException e) {
e.printStackTrace(); }}}
3.获取连接池方法
//获取连接池方法
public static DataSource getDataSource(){
return dataSource;}

三、spring提供的模板类:JDBCTemplate
模板类概述;
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC开发
基本步骤;
1.导入jar包
2.创建JDBCTemplate对象,依赖于数据源DataSource
//2.创建JdbcTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
3.调用JDBCTemplate的方法来完成CRUD的操作
update():执行DML增删改语句
///修改一条记录
String sql = "update emp set dept_id=500 where id = ? ";
修改 dept_id 为 500
int count = template.update(sql, 1);
(sql, 1);中的1表示第一个?(参数),如果有多个问号,每一个参数的位置与问号一 一对应
常见出错问题 表中的ID 为2 这里参数为1 会报错
System.out.println(count);
//添加一条记录
@Test
public void test2(){
//定义Sql
String sql = "insert into emp(id,NAME,dept_id)values(?,?,?)";
int update = template.update(sql,6,"猪无能",5);
System.out.println(update);
//删除一条记录
@Test
public void test3(){
String sql = "delete from emp where id = ?";
int update = template.update(sql, 6);
System.out.println(update);
queryForMap():查询一条数据封装为map集合
@Test
public void test4(){
String sql = "select * from emp where id = ?";
Map<String, Object> map = template.queryForMap(sql, 1);
System.out.println(map);
//{id=1, NAME=孙悟空, gender=男, salary=1000.0, join_date=2013-02-24, dept_id=1}
queryForList():查询多条数据封装为List<Map>集合
@Test
public void test5(){
String sql = "select * from emp ";
List<Map<String, Object>> list = template.queryForList(sql);
System.out.println(list);
for (Map<String,Object>stringObjectMap:list){
System.out.println(stringObjectMap);
}
query():查询所有数据封装为List<Object>
//查询所有记录,将其封装为Emp对象的List集合 优化
@Test
public void test7() {
String sql = "select*from emp ";
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp: list ){
System.out.println(emp);
}
}
query():查询一条记录封装一个JavaBean
@Test
public void test7(){
JdbcTemplate jt7 = new JdbcTemplate(SQLConnectUtil.getDataSource());
String sql = "select * from emp where id = ?";
List<Emp> list = jt7.query(sql, new RowMapper<Emp>() {
@Override
public Emp mapRow(ResultSet resultSet, int i) throws SQLException {
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
int money = resultSet.getInt(3);
return new Emp(id, name, money);
}
}, 1);
System.out.println(list);
}
query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型,class)

queryForObject():查询得到一个数值进行聚合函数查询
//查询总记录数
@Test
public void test8() {
String sql = "select count(id) from emp";
Long total = template.queryForObject(sql,Long.class);
System.out.println(total);
}

Junit单元测试,可以让方法独立执行
@Test // 添加junit4
public void test1(){
System.out.println("执行");}}

一、JavaWeb概念
使用Java语言开发基于互联网的项目
软件架构
1.C/S:Client/Server 客户端/服务器端
在用户本地有一个客户端程序,在远程有一个服务器程序
如QQ,迅雷等
优点:用户体验好
缺点:开发、安装、部署、维护 麻烦
2.B/S:Browser/Server 浏览器/服务器端
只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器程序
如网站
优点:开发、安装、部署、维护 简单
缺点:1.如果应用过大,用户的体验可能会受到影响
2.对硬件要求太高
B/S架构的详解
资源分类
1.静态资源:
使用静态网页开发技术发布的资源
特点:所有用户访问,得到的结构是一样的。
例如:文本,图片,音频,视频,HTML,CSS,JavaScript
如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器中内置了静态资源的解析引擎,可以展示静态资源,
2.动态资源:
使用动态网页及时发布的资源
特点:所有用户访问,得到的结果可能不一样。
例如:jsp/servlet,php,asp等
如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,在发送给浏览器
注意事项
学习动态资源必须先学习静态资源
静态资源:HTML :用于搭建基础网页,展示页面的内容
CSS:同于美化页面,布局页面
JavaScropt:控制页面的元素,让页面有一些动态效果

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马