一、数据库的概念
① 存储数据的仓库,数据是有组织的进行存储
② 数据库的英文:DataBase,简称DB
二、数据库管理系统的概念
① 管理数据库的大型软件
② 数据库管理系统的英文:DataBase Management System,简称DBMS
③ 数据库管理系统是用来操作数据库的一个软件
④ 通常说的 MySQL,oracle,SQL Server 等,其实都是数据库管理系统,只不过程序员比较懒,直接简称数据库
三、MySQL数据模型
1 关系型数据库
说明:
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库
优点:
① 都是使用表结构,格式一致,易于维护。
② 使用通用的SQL语言操作,使用方便,可用于复杂查询。
③ 数据存储在磁盘中,安全。
④ 创建的数据库在硬盘中其实是个文件夹
四、MySQL 数据类型
MySQL 的数据类型分为 3 类:
① 数值型
整型:int
浮点型:double(数值的总长度,小数点后保留的位数),比如:
需要 0~100,小数点后2位,那就是 double(5,2),这个5是最大数值的位数 + 小数点后2位
② 日期型
日期值:date,日期格式是年月日
③ 字符串型
定长字符串:char()
变长字符串:varchar()
注意:括号里面是规定存储字符的最大值,比如,name char(10),那么往 name 里存储的字符最大是10,varchar同理
这两个字符串类型的区别是:
① 假如是 name char(10),给 name 存储 “张三”,但 张三 只占了2个字符,剩下的8个字符会被空格补齐,
空格也算字符,那就意味着 char() 会造成空间浪费。
② 假如是 username varchar(10),给 username 存储 “张三”,varchar 会先计算原字符的长度,再根据原字符的长度
开辟合适的空间存储数据,那就意味着 varchar() 会节省空间。
③ char 比 varchar 执行效率高,因为 char 不会计算原字符串,也就意味着 char 是存储性能高,但浪费空间,即
以空间换取时间;varchar 是存储性能低,但节省空间,即以时间换取空间。
④ 如果存储的数据长度明确,就使用 char,如果存储的数据长度不明确,就使用 varchar
注意:
以上是常用的数据类型,其它数据类型查看地址:https://www.runoob.com/mysql/mysql-data-types.html
五、SQL
1 简介
① SQL的英文全称:Structured Query Language,简称SQL,是结构化查询语言
② 操作关系型数据库的编程语言
③ 定义操作所有关系型数据库的统一标准,即学会了SQL即使换了其它的数据库管理系统也不用怕
④ 数据库管理系统的语法有些是通用的,有些是自己独有的
2 SQL通用语法
① SQL 语句可以单行或多行书写,以分号结尾
② MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写
③ 注释:
单行注释:-- 注释内容(--后面要加空格) 或 #注释内容(MySQL 独有)
多行注释:/* 注释内容 */
3 SQL分类
① DDL
说明:DDL 英文全称为 Data Definition Language,即数据定义语言,用来定义数据库,表,列等数据库对象,
简单来说就是操作数据库,表等
(1) 查询语句
查询数据库:
show databases;
查询表:
注意:先使用(进入)数据库才可以查询表,因为表在数据库里
① 查询当前数据库下所有表的名称:show tables;
② 查询表结构:desc 表名称;
(2) 创建语句
创建数据库:
① 直接创建:create database 数据库名称;
② 判断数据库是否存在,如果不存在就创建:create database if not exists 数据库名称;
创建表:
① 直接创建:
create table 表名(
字段名1 数据类型1,
字段名2 数据类型2,
......
字段名n 数据类型n
);
② 判断表是否存在,如果不存在就创建:
create table if not exists 表名(
字段名1 数据类型1,
字段名2 数据类型2,
......
字段名n 数据类型n
);
注意:最后一行末尾,不能加逗号
(3) 删除语句
删除数据库:
① 直接删除:drop database 数据库名称;
② 判断数据库是否存在,如果存在就删除:drop database if exists 数据库名称;
删除表:
① 直接删除:drop table 表名称;
② 判断表是否存在,如果存在就删除:drop table if exists 表名称;
(4) 使用语句
查看当前使用的数据库:
select database();
使用数据库:
use 数据库名称;
(5) 修改语句
数据库:
① 修改数据库的名称:
先停止 MySQL 的服务,再找到创建数据库的文件夹,修改文件夹名称即可
表:
① 修改表名:
alter table 原表名 rename to 新表名;
② 添加一列:
alter table 表名 add 列名 数据类型;
注意:是在表的末尾添加
③ 修改数据类型:
alter table 表名 modify 列名 新数据类型;
④ 修改列名和数据类型:
alter table 表名 change 原列名 新列名 新数据类型;
注意:新列名 和 新数据类型 都要写才不会报错,如果 新数据类型 不想改,那就写和原数据类型一样,
反正必须得写。
⑤ 删除列:
alter table 表名 drop 列名;
② DML
说明:DML 英文全称为 Data Manipulation Language,即数据操作语言,用来对表中的数据进行增删改
(1) 添加数据
① 给指定的列添加数据:
insert into 表名(列名1, 列名2, ...)
values(值1, 值2, ...);
② 给全部的列添加数据:
insert into 表名
values(值1, 值2, ...);
注意:给全部的列添加数据时,列名可以省略,但在开发中不要省,因为把列名省了就看不出值是给哪个列
③ 批量添加数据:
方法一:
insert into 表名(列名1, 列名2, ...)
values(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...).......;
注意:其实就是在 给指定的列添加数据 的基础上添加多个value,每个value之间用逗号隔开
方法二:
insert into 表名
values(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...).......;
注意:其实就是在 给全部的列添加数据 的基础上添加多个value,每个value之间用逗号隔开
(2) 修改数据
① 修改表的数据
update 表名 set 列名1 = 值1, 列名2 = 值2, .....[where 条件];
注意:
● 每个修改的数据之间用逗号隔开
● 修改语句中如果不加 where 条件,会将所有数据都修改,所以一般要加 where 条件
(3) 删除语句
① 删除数据
delete from 表名 [where 条件];
注意:删除语句中如果不加 where 条件,会将所有数据都删除,所以一般要加 where 条件
③ DQL (SQL里最重要的部分,在业务中占据 90%)
说明:DQL 英文全称为 Data Query Language,即数据查询语言,用来查询数据库中表的数据(记录),
简单来说就是对表中的数据进行查询
(1) 基础查询
① 查询多个字段:
select 字段列表 from 表名;
注意:每个列名之间用逗号隔开
例如:
查询所有数据:select * from 表名,但是 * 在开发中人为规定不能使用,因为不能写注释
select age, name, id, ... from stu;
② 去除重复数据:
select distinct 字段列表 from 表名;
③ 起别名:
as,as 也可以用空格代替。列名和表名都可以起别名
例如:
select 年龄, namage e 姓名, id as 学生号, ... from stu;
(2) 条件查询
① 语法:
select 字段列表 from 表名 where 条件;
② 条件
符号 功能
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
<> 或 != 不等于
between...and... 在某个范围之内,相当于 age >= 18 and age <= 20
in(...) 相当于,age = 20 or age = 18 or age = 19
like 模糊查询,_单个任意字符,%多个任意字符
is null 是null
is not null 不是null
and 或 && 且,与
or 或 || 或
not 或 ! 非,不是
注意:
1 like 的使用方法查看:https://www.runoob.com/mysql/mysql-like-clause.html,往下滑,滑到笔记处
2 查询 null 只能使用 is null 或 is not null
(3) 排序查询
① 语法:
select 字段列表 from 表名 order by 排序字段名1 [排序方式1], 排序字段名2 [排序方式2], ....;
② 排序方式:
asc:升序 (默认值)
desc:降序
注意:如果有多个排序,当前面的条件值一样时,才会根据第二个条件进行排序
(4) 聚合函数
① 概念:
将一列数据作为一个整体,进行纵向计算。
② 函数分类:
函数名 功能
count() 统计数量(无法统计 null 值,推荐参数用 * )
max() 最大值
min() 最小值
sum() 求和
avg() 平均值
③ 聚合函数语法:
select 聚合函数名(列名) from 表名;
注意:null 值不参与所有聚合函数运算
(5) 分组查询
① 分组查询语法:
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其它字段无任何意义。
② where 和 having 的区别:
1 执行机制不一样:
where是在分组之前进行限制,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
2 判断的条件不一样:
where 不能对聚合函数进行判断,having可以。
3 执行顺序:
where > 聚合函数 > having
(6) 分页查询
① 分页查询语法:
select 字段列表 from 表名 limit 起始索引, 查询条数;
注意:
1 起始索引是从 0 开始
2 起始索引 = (当前页码数 - 1) * 每页显示的条数(查询条数)
3 分页查询 limit 是MySQL独有的
4 Oracle分页查询使用 rownumber
5 SQL Server分页查询使用 top
④ DCL
说明:DCL 英文全称为 Data Control Language,即数据控制语言,用来定义数据库的访问权限和安全级别,
简单来说就是对数据库进行权限控制
(1) 查询用户语法:
use mysql;
select * from user;
(2) 创建用户语法:
create user '用户名'@'主机名' identified by '密码';
例如:
create user 'wjjs'@'localhost' identified by '666'; #给本地主机创建了一个 wjjs 用户,wjjs 用户只能
通过本地主机访问数据库,不能远程访问数据库
create user 'zzh'@'%' identified by '666'; #创建一个 zzh 用户,任意主机都可以访问该数据库,包括
远程访问
(3) 修改用户密码语法:
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
(4) 删除用户语法:
drop user '用户名'@'主机名';
(5) 权限控制:
① 权限列表:
权限 说明
all,all privileges 所有权限
select 查询数据权限
insert 插入数据权限
update 修改数据权限
delete 删除数据权限
alter 修改表权限
drop 删除数据库,删除表,删除视图权限
create 创建数据库,创建表权限
注意:以上是常用的权限,其它权限百度。
① 查询用户的权限语法:
show grants for '用户名'@'主机名';
② 授予权限语法:
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
例如:
grant all on student.* to 'zzh'@'%'; #给用户 zzh 对 student 数据库的所有表 授予 所有权限
③ 撤销权限语法:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
注意:
● DCL 主要是DBA (Database Administrator) 数据库管理员进行操作,开发人员操作的比较少。
● 多个权限之间,使用逗号分隔。
● 授权时,数据库名和表名可以使用 * 进行通配,代表所有。
六、约束
1 约束的概念:
① 约束是作用于列上的规则,用于限制加入表的数据。
② 约束的存在保证了数据库中数据的正确性、有效性和完整性。
2 约束的分类:
约束名称 描述 关键字
非空约束 确保列中所有数据不能有null 值 not null
唯一约束 确保列中所有数据各不相同 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
检查约束 保证列中的值满足某—条件 check
默认约束 保存数据时,未指定值则采用默认值 default
外键约束 外键用来让两个表的数据之间建立联系,确保数据的一致性和完整性 foreign key
注意:
● MySQL 不支持检查约束。
● 多个约束之间用空格隔开即可。
● 一张表只能有一个主键。
● 自动增长:auto_increment,当列是数值型并且是唯一约束才可以使用,直接添加到约束后面。
3 非空约束语法:
(1) 添加约束
① 创建表时添加非空约束
在数据类型后面直接添加非空约束
② 建完表后添加非空约束
alter table 表名 modify 字段名 数据类型 not null;
(2) 删除约束
alter table 表名 modify 字段名 数据类型;
4 唯一约束语法:
(1) 添加约束
① 创建表时添加唯一约束
在数据类型后面直接添加唯一约束
② 建完表后添加唯一约束
alter table 表名 modify 字段名 数据类型 unique;
(2) 删除约束
alter table 表名 drop index 字段名;
5 主键约束语法:
(1) 添加约束
① 创建表时添加主键约束
在数据类型后面直接添加主键约束
② 建完表后添加主键约束
alter table 表名 add primary key(列名);
(2) 删除约束
alter table 表名 drop primary key;
6 默认约束语法:
(1) 添加约束
① 创建表时添加默认约束
在数据类型后面直接添加默认约束
② 建完表后添加默认约束
alter table 表名 alter 列名 set default 默认值;
(2) 删除约束
alter table 表名 alter 列名 drop default;
7 外键约束语法:
(1) 添加约束
① 创建表时添加外键约束
create table 表名(
列名 数据类型,
.......
[constraint] [外键名称] foreign key(外键列名) references 主表(主表列名)
);
② 建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key(外键列名) references 主表(主表列名);
注意:
● 外键名称命名随意,但一般要求是 fk_从表_主表 的格式命名。
● 是给从表添加外键约束。
● 如果有外键约束的代码,要先创建主表,再创建从表;先添加主表的数据,再添加从表的数据
● 如果建立了外键联系,想要删除主表的数据,必须先删除从表的外键列名所有的数据
(2) 删除约束
alter table 表名 drop foreign key 外键名称;
七、数据库设计
1 概念
● 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
● 建立数据库中的表结构以及表与表之间的联系的过程。
其实就是数据库里有哪些表?表里有哪些字段?表和表之间有什么关系?
2 数据库设计的步骤
① 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
② 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑所选用的数据库管理系统)
③ 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
④ 维护设计(1.对新的需求进行建表。 2.优化表)
3 表与表之间的关系
① 一对一:
如,用户和用户详情
一对一的关系多用于表拆分,将一个实体中经常使用的字段放在一张表,不经常使用的字段放在另一张表,目的在于
提升查询性能。
在数据库里实现方法:
在任意一方加入外键,关联另一方主键,并且设置外键为唯一约束(unique)。所以也可以直接拿主键作为外键,这样
就不用添加新的字段来作为外键。
② 一对多(或多对一):
如,部门和员工
一个部门对应多个员工,一个员工对应一个部门
在数据库里实现方法:
在多的一方建立外键,指向一的一方的主键
③ 多对多:
如,商品和订单
一个商品对应多个订单,一个订单包含多个商品
在数据库里实现方法:
建立第三张表当做中间表,中间表至少包含两个外键,分别关联两方主键。中间表不仅可以存外键,还可以添加
业务相关的字段。
八、多表查询
说明:
① 字面意思就是从多张表查询数据。
② 使用多表查询会出现笛卡尔积的情况,这样就会造成查询到的数据不准确,所以一般多表查询要添加条件再查询。
③ 笛卡尔积:取A,B集合的所有组合情况
1 连接查询:
(1) 内连接
相当于查询多张表之间交集的数据
语法:
① 隐式内连接
select 字段列表 from 表1, 表2, .... where 条件;
② 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 条件;
注意:
● inner 可以省略。
● 显示内连接可以 join 多张表,实践证明,显示内连接基本是万能的多表查询方法且省代码。
(2) 外连接
左外连接:
① 语法:
select 字段列表 from 表1 left [outer] join 表2 on 条件;
② 说明:
左外连接是以 left 关键字的左边为基准,目前代码的位置是 表1 在左边,表2 在右边,查询到的数据是
左边表的所有数据 和 左右两边表的交集数据,即 表1 的所有数据和 表1与表2交集的数据。
右外连接:
① 语法:
select 字段列表 from 表1 right [outer] join 表2 on 条件;
② 说明:
右外连接是以 right 关键字的右边为基准,目前代码的位置是 表1 在左边,表2 在右边,查询到的数据是
右边表的所有数据 和 左右两边表的交集数据,即 表2 的所有数据和 表1与表2交集的数据。
注意:
● outer 可以省略。
● 左外连接与右外连接可以相互转换,其实就是表的位置互换,一般用左外连接就够了
2 子查询:
(1) 概念:
查询中嵌套查询,称嵌套查询为子查询。
(2) 分类:
子查询根据查询结果不同,作用不同,而分为三类,即单行单列,多行单列,多行多列
① 单行单列:作为条件值,使用 =,!=,>,< 等进行条件判断
语法:select 字段列表 from 表 where 字段名 = (子查询);
② 多行单列:作为条件值,使用 in 等关键字进行条件判断
语法:select 字段列表 from 表 where 字段名 in (子查询);
③ 多行多列:作为虚拟表
语法:select 字段列表 from (子查询) 起别名 where 条件;
注意:
子查询要具体情况具体分析,先按照查询需求一步一步查,最后在利用子查询的语法整合为一句代码。
九、事务
1 事务简介
● 数据库的事务(Transaction) 是一种机制、一个操作序列,包含了一组数据库操作命令。
● 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。
● 事务是一个不可分割的工作逻辑单元。
2 开启事务语法:
start transaction;
或者
begin;
3 提交事务语法:
commit;
4 回滚事务语法:
说明:回滚到开启事务之前
rollback;
5 事务四大特征:
● 原子性(Atomicity),事务是不可分割的最小操作单位,要么同时成功,要么同时失败。
● 一致性(Consistency),事务完成时,必须使所有的数据都保持一致状态。
● 隔离性(lsolation),多个事务之间,操作的可见性。
● 持久性(Durability),事务一旦提交或回滚,它将永久改变数据库中的数据。
6 MySQL事务提交方式:
MySQL事务提交方式默认是自动提交。
(1) 查看事务的默认提交方式语法:
select @@autocommit;
注意:1 为自动提交,0 为手动提交
(2) 修改事务提交方式:
set @@autocommit = 0;
十、JDBC
1 JDBC概念:
JDBC全称(Java DataBase Connectivity),即Java数据库连接,就是使用Java语言操作关系型数据库的一套API。
2 JDBC本质:
● 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。
● 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
● 使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包里的实现类。
3 JDBC好处:
● 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发。
● 可随时替换底层数据库,访问数据库的Java代码基本不变。
4 JDBC快速入门:
① 创建工程,导入驱动 jar 包
② 注册驱动:
Class.forName("com.mysql.jdbc.Driver");
注意:
MySQL5 之后的驱动包,会自动加载 jar 包中 META-INF/services/java.sql.Driver 文件中的驱动类,
所以MySQL5 之后的驱动包可以省略注册驱动步骤
③ 获取数据库连接:
Connection conn = DriverManager.getConnection(url, username, password);
参数说明:
① url,连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2.....
示例:jdbc:mysql://127.0.0.1:3306/zzh?useSSL=false&useServerPrepStmts=true
注意:
● 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则 url 可以
简写为,jdbc:mysql:///数据库名称?参数键值对
● 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
● useServerPrepStmts=true 参数,开启PreparedStatement预编译功能
② username,用户名
③ password,密码
④ 定义SQL语句:
String sql = "update .......";
⑤ 获取执行SQL对象:
Statement stmt = conn.createStatement();
⑥ 执行SQL:
int count = stmt.executeUpdate(sql); //会返回受影响的行数
⑦ 处理返回结果:
说明:返回的结果如何处理,其实是按照需求去定夺
System.out.println(count); //打印结果
⑧ 释放资源:
conn.close();
stmt.close();
十一、JDBC API
1 DriverManager(区动管理类):
作用:
① 注册驱动
查看 Driver 类源码可以看到 DriverManager.registerDriver()
② 获取数据库连接
2 Connection(数据库连接对象):
作用:
① 获取执行SQL的对象
● 普通执行SQL对象
Statement createStatement()
● 预编译SQL语句并执行,防止SQL注入
PreparedStatement prepareStatement(sql)
● 执行存储过程的对象
CallableStatement prepareCall(sql)
② 管理事务
● JDBC事务管理,Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean)
boolean参数:
true 为自动提交事务。
false 为手动提交事务,即为开启事务。
提交事务:commit()
回滚事务:rollback()
注意:
一般事务是写在 try catch() 里,开启事务 与 提交事务写在 try 里,回滚事务写在 catch() 里。
3 Statement
作用:
① 执行SQL语句
int count = stmt.executeUpdate(sql),执行DDL、DML语句
返回值:
(1)DML语句影响的行数
(2)DDL语句执行后,执行成功也可能返回0
ResultSet rs = stmt.executeQuery(sql),执行DQL语句
返回值:ResultSet 结果集对象
获取查询结果:
(1) next() 方法,使得数据库游标移动
① 将光标从当前位置向前移动一行
② 判断当前行是否为有效行
该方法返回的是 boolean 值,即 true 为有效行,当前行有数据。
false 为无效行,当前行没有数据。
(2) getXxx(参数),获取数据库的数据
● Xxx 为数据类型,比如,int getInt(参数),String getString(参数)。
● 参数:
可以是数字,从1开始,1代表数据库的第一列,以此类推。
可以是数据库的列名,第一列就写第一列的列名,以此类推。
使用步骤:
while(rs.next()) {
int id = rs.getInt(1);
String name = rs.getstring(2);
double money = rs.getDouble(3);
说明:
getInt(1) 是获取第一列的数据,在这里 第一列 属于 int 类型,所以是 int id,
这个要根据数据库里表的列名属于哪种数据类型来写。参数也可以是列名,
比如,getInt("id"),参数为 2 就是获取第二列的数据,以此类推。建议参数写列名。
}
4 PreparedStatement
作用:
① 预编译SQL语句并执行,预防SQL注入问题
SQL注入:是通过操作输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
预防SQL注入问题原理:
利用 PreparedStatement 对字符进行转义,将语句字符转为文本字符,比如将单引号转为文本的单引号。
使用步骤:
① 获取PreparedStatement对象
// SQL 语句中的参数值使用 ?占位符代替
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的 sql 语句
PreparedStatement pstmt = conn.preparestatement(sql);
② 设置参数值
pstmt.setXxx(参数1, 参数2)
说明:
● Xxx 为数据类型。
● 参数1为 ?的位置,从左往右数,从1开始。
● 参数2为 ?的值。
③ 执行SQL
//不需要再传递sql
executeUpdate();
或者
executeQuery();
十二、数据库连接池
1 简介
① 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
② 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
③ 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
④ 好处:
● 资源重复利用
● 提升系统响应速度
● 避免数据库连接遗漏
⑤ 标准接口:DataSource
● 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
● 功能:获取连接
⑥ 常见的数据库连接池:
● DBCP
● C3P0
● Druid
⑦ Druid(德鲁伊)
● Druid连接池是阿里巴巴开源的数据库连接池项目
● 功能强大,性能优秀,是Java语言最好的数据库连接池之一
2 Druid 使用步骤
① 导入jar包 druid-1.1.12.jar
② 定义配置文件
③ 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputstream("配置文件路径"));
查看配置文件路径:System.out.println(System.getProperty("user. dir"));
④ 获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
⑤ 获取连接
Connection conn = dataSource.getConnection();
十三、Maven
1 概述
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
① 提供了一套标准化的项目结构:
如果在 eclipse 创建的项目,想要在 idea 直接运行是不行的,因为两个编译器创建出来的项目结构
不一样。那 Maven 就解决这个问题,它提供了一套标准化的项目结构,这样就可以使得编译器创建
出来的项目结构一致,即使换了编译器项目也可以直接运行。
② 提供了一套标准化的构建流程(编译,测试,打包,发布.....):
当项目是一个大型项目的时候,需要进行几百次的构建流程步骤,很繁琐。那 Maven 就解决这个问题,
Maven 提供了一套简单的命令来完成项目构建,程序员只需使用鼠标进行简单的点击选项即可。
③ 提供了一套依赖管理机制:
依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件...),以前要满世界的去 jar 包,找到了
之后还要下载,下载之后还要复制粘贴到项目最后发现用不了。那 Maven 就解决这个问题,只需要在
xml 文件里写几行代码就可以导入第三方资源。
2 基本使用
(1) Maven 常用命令
① compile,编译
② clean,清理
③ test,测试
④ package,打包
⑤ install,安装
(2) Maven 生命周期
① Maven 构建项目生命周期描述的是一次构建过程经历了多少个事件
② Maven 对项目构建的生命周期划分为 3套:
● clean,清理工作,步骤:
pre-clean → clean → post-clean
● default,核心工作,例如编译、测试、打包、安装等,步骤:
compile → test → package → install
● site,产生报告,发布站点等,步骤:
pre-site → site → post-site
注意:同一套生命周期内,执行后边的命令,前边的所有命令会自动执行
3 Maven 坐标
(1) 什么是坐标
① Maven 中的坐标是资源的唯一标识
② 使用坐标来定义项目或引入项目中需要的依赖
(2) Maven 坐标主要组成
① groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
② artifactId:定义当前Maven项目名称(通常是模块名称,例如:order-service、goods-service)
③ version:定义当前项目版本号
4 idea 导入 Maven 项目
① 选择右侧Maven面板,点击+号
② 选中对应项目的pom.xml文件,双击即可
③ 如果没有Maven面板,选择 View → Appearance > Tool Window Bars
十四、MyBatis
1 简介
① MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
② MyBatis 本是Apache的一个开源项目iBatis,2010年这个项目由 Apache Software Foundation
迁移到了google code,并且改名为MyBatis。2013年11月迁移到 Github。
③ 官网:https://mybatis.org/mybatis-3/zh/index.html
说明:
持久层:
● 负责将数据保存到数据库的那一层代码
● JavaEE三层架构:表现层、业务层、持久层
框架:
● 框架就是一个半成品项目,是一套可重用的、通用的、项目基础代码模型
● 在框架的基础之上构建项目更加高效、规范、通用、可扩展
2 MyBatis 快速入门
步骤:
① 创建表,添加数据
② 创建模块,导入坐标
③ 编写MyBatis核心配置文件 一> 替换连接信息解决硬编码问题
④ 编写SQL映射文件 一> 统一管理sql语句,解决硬编码问题
⑤ 编码:
① 定义 pojo 类
② 加载核心配置文件,获取SqlSessionFactory对象
③ 获取SqlSession对象,执行SQL语句
④ 释放资源
3 Mapper 代理开发快速入门
① 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
② 设置SQL映射文件的namespace属性为Mapper接口全限定名
③ 在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
④ 编码:
① 通过SqlSession的getMapper方法获取Mapper接口的代理对象
② 调用对应方法完成sql的执行
注意:
如果 Mapper 接口名称和 SQL 映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化
SQL映射文件的加载,可以改为这样:
<mappers>
<package name="com.itheima.mapper(SQL映射文件所在的包名)"/>
</mappers>
4 MyBatis 核心配置文件 mybatis-config.xml
注意:
配置各个标签时,需要遵守标签的前后顺序,不然会报错,
配置文件的结构网址:https://mybatis.org/mybatis-3/zh/configuration.html