MySql详解

1 篇文章 0 订阅
1 篇文章 0 订阅

MySql

JavaEE:企业级开发,面向Web

  • 前端页面:展示数据
  • 后台:连接点,链接前端
  • 数据库:存数据.

数据库要学好操作系统,数据结构与算法,离散数据,数学电路,体系结构,编译原理和实战经验


为什么:学任何东西都是因为趋势,趋势优先

大数据时代,数据天下.阿里自己的MySql是由王坚提出的"去IOE"

  • DBA(数据库管理员):数据库是所有软件体系中 最核心 的存在
  • DBMS数据库管理系统
  • DataBase存管数据,500万条是MySql的一个界限,超过就要做优化了

  1. 关系型数据库:表与表之间进行数据存储,如mysql,oracle
  2. 非关系型数据库:对象存储由对象自身属性决定,如redis,mongdb,nosql,notonlysql等

历史

mysql用sql语言,开放源码

  1. 前世: 瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司
  2. 今生: 属于 Oracle 旗下产品
  3. 成就: MySQL 是最流行的关系型数据库管理系统之一
  4. 特点: 体积小、速度快、总体拥有成本低,尤其是开放源码 , 一般中小型网站的开发都选择 MySQL 作为网站数据库。

总结:招人成本低,所有人必须会


安装:本次釆用8.0版本,语法上并无很大出入

  1. 阿里云买数据库
  2. **MySql官网(5.7版本稳定,8.0最新): MySQL **

尽量不要用exe安装,会往注册表中写东西,删不干净,用压缩包

** MySQL 5.7 安装教程(全步骤、保姆级教程)_纸短情长ZF的博客-CSDN博客_mysql安装教程5.7 **


数据库操作语句

navicat下创建数据库

  1. ctrl + shift +r运行选中代码

  2. 查看数据库版本select version()

  3. 字符集urf8mb4,排序规则utf8mb4_bin

    字符集


  4. 历史记录(工具下的历史日志)中存储了数据库语句,不会的就在这里面找,ctrl + L

  5. 默认的引擎是innodb


sql语句创建

-- 创建shop数据库,规定字符集utf8,排序规则为utf8_general_ci;
create database shop character set utf8 collate utf8_general_ci;

-- 查看创建数据 库表的语句
show create database travel;

管理员身份在控制台运行

  1. 连接进入:mysql -uroot -p密码,最后不要有;号

  2. 退出quit;或者exit;


  3. 修改用户密码mysqladmin -uroot -p原密码 password 新密码

  4. 刷新权限flush privileges;


  5. show databases展示当前连接下所有数据库

  6. use user切换数据库

  7. DESCRIBE 或者descuser显示库或表结构


  8. CREATE if EXISTS DATABASE 长歌新建数据库时是否已经存在

  9. 注释:-- # //**


CRUD增删改查

程序员分为:cv和AIP,DDL定义,DML操作,DQL查询,DCL控制

善用历史记录

记住最关键的东西


数据类型 MySQL数据类型 - MySQL教程™ (yiibai.com)

  1. int标准整数,4字节

  2. float和double,4,8字节

  3. decimal字符串高精度浮点,完全无损


  4. char字符串,固定大小0~255

  5. varchar可变字符串0~65535,varchar(20),无论什么都最多存储20个

  6. 常用string


  7. 日期date,时间time(HH:mm:SS,h是12小时制),datetime

  8. timestamp时间戳,year年


  9. null未知,不要用


字段属性

  1. unsiyned无符号,不能有负数,且是整数
  2. zerofill不足位填充0,int(3)最大显示3位,会有0填充
  3. null和空字符串""是不一样的
    字段属性

操作符

  1. <>不等于,not
  2. and = && 建议用关键字
  3. is null 为空.is not null不为空

表操作

在线流程图: 免费在线创建流程图|思维导图 - 迅捷流程图 (liuchengtu.com)

增:create table 表名(字段 数据类型 属性 索引 注释,键属性设置)

create table if not exists tianGuan(
    id int(3) auto_increment comment '自增的id',
    -- 9位数,小数点后保留两位
    money decimal(9,2) not null unique default 1000,
    -- 生日默认值:'2000-01-01 00:00:00'
    birthday datetime default '2000-01-01 00:00:00',
    -- 给id加main索引
    key `main` (id),
    -- outer索引给id,和waiguan表上的pid构成外键
    constraint `outer` foreign key (id) references `outer`(pid)
)engine = innodb default charset=utf8;-- 规定引擎为innodb,默认字符集为utf8
  1. auto_incremet自增

  2. comment注释

  3. not null非空


  4. unique唯一索引(这个列中的所有字段不能出现重复)

  5. default 1000 默认值为1000


  6. engine = innodb;-- 规定引擎为innodb

  7. default charset=utf8;默认字符集为utf8


  8. 外部表的外键必须有索引,如主键等

  9. 不建议用物理外键.最佳实现:数据库就是一个表,最终由程序实现外键

  10. 阿里开发规约禁止使用外键


删:drop table if exists 表名

drop table if exists tianGuan;

改:alter table 表名 [操作]

//改名
alter table tianGuan rename as `tianGuans`;

//增加字段
alter table tianGuans add name varchar(60);

//修改字段属性
alter table tianGuans modify name varchar(80);
//字段改名并修改属性
alter table tianGuans change name names varchar(90);

//删除字段
alter table tianGuans change name names varchar(90);

//增加外键
alter table tianguan add constraint `outer` foreign key(`id`) references `waiguan`(`pid`);

//删除外键
alter table tianguan drop foreign key `outer`;
  1. change在modify的基础上还可以改名

-- 查看创建数据 库表的语句
show create table tianguan;

-- 查看表结构
desc tianguan;

引擎 数据库引擎学习总结_gentelyang的博客-CSDN博客_数据库引擎

  1. myisam早些年使用,支持全文索引.表空间较小.节约空间,速度快
  2. innodb支持事务,数据行锁定和外键,表空间是myisam的2倍.安全性高,有事务处理,可多表多用户操作
  3. my.ini文件在C:\ProgramData\MySQL\MySQL Server 8.0,在这里可以找到Data目录,数据库数据都在这里
  4. my.ini设置mysql支持中文

DDL数据操作语言

增:insert into 表名(字段) values(value),(…)

//自增插入null
insert into tianguan values(null,'安安'),(null,'hello')

update tianguan set `name` = '热巴',id=3 where name <> 'hello'

delete from tianguan where name = '安安';

重启数据库,innodb自增从1开始:内存断电即失.myisam存文件中

清空

truncate table tianguan;

重新设置自增列,不影响事务


DQL:Data Query Language数据查询语言,最核心

一、sql执行顺序 :(1)from (3) join (2) on (4) where (5)group by(开始使用select中的别名,后面的语句中都可以使用) (6) avg,sum… (7)having (8) select (9) distinct (10) order by (11)limit

select distinct concat('小',Name) as 别名,@@auto_increment_increment
from tianguan;
  1. 字段的返回值是个值就行,如select 1+1 -->2

  2. distinct去重

  3. concat(‘小’,Name):拼接

  4. @@auto_increment_increment自增步长


  5. 列也不区分大小写


模糊查询

-- _单个字符,%0~多个
where name like '_2%';

-- 在这中间的任意一个
where name in ('1','12');

-- 范围查询between 低 and 高
where rid between 100 and 120;

-- 查找条件最终返回的是一个布尔值
where true;
  1. 给字段填入null,自动变成(NULL)

联表查询:在主表的基础上做扩展,从表没有数据,主表也会返回所有数据

select name
from tianguan t(主表)
left join `outer` o(从表)
on t.id = o.id
-- 先查两张,再查第三张
inner join `inner` i
on i.id = o.id;
  1. 中间就是inner join
  2. 共有七种join理论,本质是三种,有对应的is not三种反例: MySQL 七种join 理论_huang__2的博客-CSDN博客_七种join理论
  3. join on是连接查询,where是等值查询
  4. 笛卡尔积的解释和作用_墨卿风竹的博客-CSDN博客_笛卡尔积

on和where的区别
  1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  2. where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

自连接:自己一张表拆成两张一样的表

select a.name,b.id
from tianguan a,tianguan b
where a.id = b.id;

分组group by并筛选having

select rgid 图片id, bigPic 大图
from tab_route_img
group by rid
having rid > 100;

排序和分页

select *
from tab_route
-- 按照rid来降序排列
order by rid desc
-- 从第10个数据开始分页,显示10条
limit 10 ,10;
  1. 百度瀑布流就是用了排序
  2. 分页是为了缓解数据库压力,提升体验

子查询:由里即外

select *
from tab_route
where rid in(
    select rid from tab_route_img where tab_route_img.rid between 100 and 120
)
order by rid desc
limit 10 ,10;

常用函数

日期时间类

-- 09:17:11
select current_time();

-- 2022-03-30
select current_date();

-- 2022-03-30 09:17:30
select now();
-- 2022-03-30 09:17:53
select localtime();

-- 2022-03-30 09:18:07
select sysdate();

-- 2022
select year(now());

-- 主机信息:root@localhost
select system_user();

字符串

-- 向上取整
select ceil(19.5);

-- 向下取整
select floor(19.5);

-- 随机0~1
select rand();

-- 返回符号,0=0,负数=-1,正数=1
select sign(-19.8);

-- 长度
select char_length('天才第一步');-- 5

-- 插入,从第1个字符开始,替换2个字符,替换为'李长歌'
select insert('关山万里路',1,2,'李长歌');-- 李长歌万里路

-- indexOf第一次出现的位置
select instr('hello','l');-- 3

-- 从第2个字符开始截取,最后只要剩下3个
select substring('hello',2,3);-- ell

-- 反转
select reverse('信言不美,美言不信');-- 回文:信言不美,美言不信

-- 替换
select replace(name,'张','李')
from tab_user;

聚合函数

-- 统计
select count(rid)
from tab_route;

-- 示合
select sum(rid)
from tab_route;
  1. count(字段)会忽略null值,速度最快,count(*)走完所有列,count(1只走一列).: 一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别 - TOOBUG博客

count


MD5加密:主要增强算法复杂度和不可逆性

-- md5('123456')加密
insert into tab_user values('LiChangGe',md5('123456'));
-- 加密后的效果
e10adc3949ba59abbe56e057f20f883e

事务:一级sql放在一个批次中执行

ACID原则 数据库事务ACID原则学习分享_技术通俗讲的博客-CSDN博客_acid原则

  1. 原子性(Atomicity):要么都成功,要么都失败
  2. 一致性(Consistency):执行前和执行后的有一个固定的数据必须保持一致,如两个人加在一起的总钱数,不能出现转账后,两个人的总钱数发生了改变.
  3. 隔离性(Isolation):必须我完成后,别人才能操作.如我给别人转账时,我的银行账户就不允许别人操作
  4. 持久性(Durability) :事务所做的操作应该被保存下来,可以被以后再读取.

MySql是默认开启事务自动提交的

-- 关闭默认的自动提交,也就是开始一个事务
set autocommit = 0;

-- 开始事务 = 开启一个批次的sql
start transaction;

-- 实现转账
update bank
set money = money - 300
where `name` = '热巴';

-- 1 / 0 失败后
set bank.money = 1 / 0;

update bank
set money = money + 300
where `name` = '杨幂';

-- 提交后立即跟上回滚:一旦失败就立马回滚
commit ;

-- 回滚到保存点
rollback to savepoint send;

-- 操作完成后做一个 保存点 ~ 存档
savepoint send;

-- 再将开启自动提交 = 事务结束
set autocommit = 1;

-- 结束后撤消保存点
release savepoint send;
  1. set autoconmit = 0关闭自动提交,事务开始.默认 = 1
  2. innodb引擎支持事务
    事务流程

索引:帮助MySql高效获取数据的数据结构

create table if not exists tianguan(
    id int(3),
    name varchar(60),
    money decimal(9,2),

    key `main` (id),
    index  `first` (money),
    primary key `primary`(id),
    unique key `unique` (money),
    fulltext key `full` (name),

    constraint `outer` foreign key (id) references `outer`(pid)
);
  1. 常规key/index
  2. 主键,一个表中只能有一个:primary key primary(id),
  3. 唯一索引unique key,避免重复列出现,可以重复,多个列都可以标识为唯一索引
  4. 全文索引fulltext key,快速定位数据

alter table tianguan drop index `nameUnique`;

show index from tianguan;

alter table tianguan add unique key `nameUnique`(name); 

MySql优化 MySQL数据库优化的八种方式(经典必看)_zhangbijun1230的博客-CSDN博客_数据库优化

explain分析Sql执行状况,测试全文索引

[MySQL高级 EXPLAIN用法和结果分析_王洪玉的博客-CSDN博客_explain的用法](https://blog.csdn.net/why15732625998/article/details/80388236)

-- 分析sql执行状况
explain select * from tianguan
where match(name) against('张3')
  1. match(name) against(‘张3’):在有全文索引的字段name中,模糊搜索’张3’
百万级数据测试全文索引 mysql 插入百万级数据 简单靠谱的方法_Mc94Lee的博客-CSDN博客
  1. 插入一百万条数据,大约需要30~60秒
-- 如果test表已经存在,就先删除test表
-- 这里要注意,不要和你自己的表偶然了
drop table if exists test;

-- 创建表,表中有c1,c2和c3三个字段
create table test (c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL);

-- 如果存在就删除掉存储过程test_insert,同理注意不要和你的偶然
drop PROCEDURE if exists test_insert;

-- 设置分隔符为 // ,以后只有遇到//才认为这一条语句结束了,让mysql可以执行语句
-- 默认是;分号
delimiter //

-- 创建存储过程
CREATE PROCEDURE test_insert(n int)
begin
    -- 声明一个变量v,默认值为0
    declare v int default 0;
    -- 关闭自动提交
    SET AUTOCOMMIT=0;

    -- 循环条件是v小于你要插入的总条数
    while v < n
        do
            -- 向test表中插入数据
            insert into test
            values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
            -- 插入一条,v就加1
            set v = v + 1;
        end while;
    -- 开启自动提交
    SET AUTOCOMMIT=1;
end;

-- 运行存储过程,传参1000000就是插入1000000条数据
call test_insert(1000000);

-- 查询表中总共多少条数据
select count(*) from test;
-- 紧接上文

-- 在没有创建全文索引时,分析sql结构
-- rows为996442:总共查询了996442行数据
explain select c2 from test where c1 = 45689;

-- 给c1添加主键
alter table test add primary key `primary` (c1);
-- rows=997335,总共只查询了997335行
explain select c2 from test where c2 = 'history';
-- rows=1,总共只查询了1行
explain select c2 from test where c1 = 45689;

-- 给c2添加全文索引,第三种创建索引的方法
create fulltext index `full` on test(c2);

-- rows=996726
explain select c2 from test where c2 = 'history';
-- rows = 1
explain select c2 from test where c1 = 45689;

rows


索引原则: [mysql索引底层原理 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/54665280#:~:text=mysql索引底层原理 1 B%2B树可以更好的结合磁盘IO原理提高查询效率 2 Innodb一,定要有主键,没有主键会以唯一索引为主键, 否则会建立一个隐藏主键 3 Innodb的数据是和主键索引存在一起的 (数据在叶子节点中,MyISAM中的叶子节点存储的数据地址))
  1. 就是加了一个新的树,相当于翻书(没有索引)与翻目录(有索引)的区别

  2. 数据大于500万条后再加效果明显


  3. 不是越多越好,在经常用到的字段上加索引

  4. 经常改动的数据不要加索引

  5. 索引数据结构有:hash,btree(innodb默认)


用户管理

-- mysql.user表存储了所有的用户信息
select * from mysql.user;

-- 新建用户
create user 李长歌 identified by 'root';

-- 改密码:报错
set password for 李长歌s = password('123456');
-- 可以运行
alter user 李长歌s identified by '123456';

-- 重命名
rename user 李长歌 to 李长歌s;

-- 给李长歌s用户增加权限,可以控制的库和表是*.*
-- root最高权限是拥有grant(给别人授权)
grant all privileges on *.* to 李长歌s;

-- 查看权限
show grants for 李长歌s;
show grants for root@localhost;

-- 撤消权限
revoke all privileges on *.* from 李长歌s;

drop user 李长歌s;
  1. mysql.user表中存储了数据库用户信息

备份:保证重要数据不丢失

mysqldump -h主机名(一般是localhost,这个参数可以不写) -u用户 -p密码 库名 其下的表名 > 保存到哪里

不要进入后mysql后执行,mysql里没有这些关键字.
C:\WINDOWS\system32>mysqldump -hlocalhost -uroot -proot user user > C:/Users/林木/Desktop/a.sql

出现这句话才算是成功
mysqldump: [Warning] Using a password on the command line interface can be insecure.
  1. 文件路径最后不要加;号,会认为;号也是文件名一部分

文件恢复:mysql -h -u -p 库名 < 文件路径

C:\WINDOWS\system32>mysql -hlocalhost -uroot -proot user < C:/Users/林木/Desktop/a.sql

出现这句话代表成功
mysql: [Warning] Using a password on the command line interface can be insecure.

第二种方法:在登录,且进入数据库的情况下

mysql> source C:/Users/林木/Desktop/a.sql

代表成功:查询成功,0行受到影响
Query OK, 0 rows affected (0.00 sec)

数据库设计规约

数据库较复杂时,好的数据库设计要做到:节省空间,保证完整性,屏蔽物理外键,方便开发.

  1. 分析需求,收集信息
  2. 标识实体:实际实现,需求落地

  • 数据库命名用_分隔,因为不区分大小 写,驼峰没用.

  • 外键用父id来实现


  • 要做到实体之间能够联系起来,实现基本功能.

  • BBS: Bulletin Board System 网络论坛,电子公告板

  • CRM :Ustomer Relationship Management客户关系管理系统


三大范式 数据库三大范式_凉_ting的博客-CSDN博客_数据库三范式

  1. 第一范式(原子性):每一列都是不可分割的原子数据项:一列内的信息,只用来表达这一列.

  2. 如学科年级拆分成学科,年级两个列


  3. 第二范式(满足第一范式):每张表只做一件表,如客户信息表,就只存储客户信息,不要有厂商信息.


  4. 第三范式(满足第一和第二):确保表中每列数据都和主键直接相关.不间接相关.

  5. 如订单表中不要出现和订单无关的,像购买者的账户信息这样的.


规范与性能间的取舍

阿里规定:关联查询表不超过三张.

  1. 考虑商业化需求与目标(成本,用户体验),性能更重要,因为与用户体验直接挂钩.
  2. 取舍:数据库读数据的时间的重要性 > 写的时间,可以故意增加字段,计算列,索引等.

JDBC:在架构中,没有什么是加一层不能解决的

  • 以下所有的jar包,都是放在一个:和src包同级的lib包里.

  • 所有的如.properties,.xml的配置文件,都是放在:一个和src包,同级的,resources包下

  • idea默认去这些包下读取对应的资源

idea左下角可以收合侧边栏

数据库连接页面的"架构"选项,可以看到历史记录

架构

引入jar包: MySQL_JDBC_jar包的下载与使用(Windows) - 苍凉温暖 - 博客园 (cnblogs.com)**

  1. jar包要放在lib包下,和src包同级别

  2. 在idea项目的项目模块设置>库,也可以设置导入jar包


public static void main(String[] args) throws Exception{
    //加载驱动
    Class.forName("com.mysql.cj.jdbc.Driver");

    //设置用户信息和url
    String name = "root";
    String password = "root";

    /**
     * localhost(默认主机):3306(mysql默认端口)travel(数据库名)
     * useUnicode=true使用unicode码
     * characterEncoding=utf8设置字符集
     * useSSL=true";使用SSL协议确保到达正确服务器,且数据加密,验证是否丢失
     */
    String url = "jdbc:mysql://localhost:3306/travel?useUnicode=true&characterEncoding=utf8&useSSL=true";

    //获取数据库连接对象
    Connection connection = DriverManager.getConnection(url, name, password);

    //创建数据库执行对象
    Statement statement = connection.createStatement();

    //得到返回结果集
    ResultSet resultSet = statement.executeQuery("select * from tab_user");

    //将指针移到最后:-1最后,1是第一行,2是第二行.会报错
    //boolean absolute = resultSet.absolute(-1);

    //还有下一个数据的话
    while (resultSet.next()){
        //通过字段名获取值
        System.out.print(resultSet.getString("username")+"-");
        System.out.println(resultSet.getString("password")+";");
    }


    //释放(关闭)资源,必须做
    resultSet.close();

    statement.close();

    connection.close();

}

executeBatch批量处理

public static void main(String[] args) throws Exception{
    //加载驱动
    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

    //设置url
    String url = "jdbc:mysql://localhost:3306/travel?useUnicode=true&characterEncoding=utf8&useSSL=true";

    //获取数据库的连接
    Connection connection = DriverManager.getConnection(url, "root", "root");

    //创建操作数据库的对象
    Statement statement = connection.createStatement();

    //关闭自动提交后,增加一个批次的sql语句
    connection.setAutoCommit(false);

    //只能增删改
    statement.addBatch("insert executebatchtest value(1234.8) ");
    statement.addBatch("insert executebatchtest value(888.8)");

    //返回成功得行数
    int[] ints = statement.executeBatch();

    //再开启自动提交
    connection.setAutoCommit(true);


    statement.close();
    connection.close();

}
  • DriverManager.registerDriver底层是个静态代码块,和Class.forName(…)效果一样

    Driver底层

自定义工具类

package com.li.changGe.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtilsDemo01 {

    private static Connection connection = null;
    private static String name;
    private static String pwd;
    private static String url;

    static {
        try {
            //getClassLoader()运行类加载器,也就是运行这个静态代码块
            InputStream resourceAsStream = JdbcUtilsDemo01.class.getClassLoader().getResourceAsStream("jdbc.properties");

            Properties properties = new Properties();
            //加载流中数据
            properties.load(resourceAsStream);

            //读取文件中的键获得对应的值
            String driver = properties.getProperty("Driver");

            name = properties.getProperty("name");

            pwd = properties.getProperty("password");
            url = properties.getProperty("url");


            Class.forName(driver);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static Connection getConnection() throws Exception{
        return DriverManager.getConnection(url,name,pwd);
    }

    //释放资源
    public void close(ResultSet resultSet,Statement statement,Connection connection) throws Exception{

        resultSet.close();

        statement.close();

        connection.close();

    }


//-------------------------------------------------------------------------------

    public static void main(String[] args) throws Exception{

        Connection connection = JdbcUtilsDemo01.getConnection();

        PreparedStatement preparedStatement = connection.prepareStatement("select * from tab_user where name = ? and birthday = ? ");

        //给第1个? 赋值为"张三"
        preparedStatement.setString(1,"张三");
        
        //数据库用的Date是sql包下的
        preparedStatement.setDate(2,new java.sql.Date(new java.util.Date().getTime()));

        ResultSet resultSet = preparedStatement.executeQuery();


        //默认失败后自动回滚,需要先关闭自动提交
        connection.setAutoCommit(false);
        connection.commit();

        while (resultSet.next()){
            //通过字段名获取值
            System.out.print(resultSet.getString("username")+"-");
            System.out.println(resultSet.getString("password")+";");
        }
  }

}
  1. Sql注入:用一定技巧的输入攻入数据库

  2. PreparedStatemet:防止sql注入,效率更高.

  3. 底层是将传参当做字符,存在转义字符(如or,and等)时,会被转义掉. 关于PreparedStatement原理的理解 - 桦沐 - 博客园 (cnblogs.com)

  4. sql语句中的参数用?号代替,用setString()给参数赋值


  5. java.sql.Date(new java.util.Date().getTime()),数据库用的是sql下的Date,但是传入的原生的Date时间


连接池:预告准备资源,有需求时直接调用

实现DataSource接口就可以自己编写连接池

  • 连接池运行流程:数据库连接 --> 执行完毕 --> 释放

  • 听不懂就举例子


  • 常用连接数=最小连接数,最大连接数=最高承载上限

  • 设置等待超时

DBCP:工具类就是拿来主义

导入jar包,window系统是.zip的包.

  1. DBCP连接池所用到的两个jar包下载地址_沙滩上的闲鱼的博客-CSDN博客
  2. MySql5.7后的高版本,额外还需要一个jar包Apache Commons Logging - Download Apache Commons Logging
public static void main(String[] args) throws Exception{
    InputStream resourceAsStream = DBCPDemo01.class.getClassLoader().getResourceAsStream("dbcp.properties");

    Properties properties = new Properties();
    properties.load(resourceAsStream);

    //自动调用dbcp.properties文件,并读取值
    //看一下createDataSource()的源码,可以看到底层进行了driverClassName的读取
    BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);

    //通过工厂模式获得对象
    Connection connection = dataSource.getConnection();

    PreparedStatement preparedStatement = connection.prepareStatement("select * from tab_user");

    ResultSet resultSet = preparedStatement.executeQuery();

    while (resultSet.next()){
        //通过字段名获取值
        System.out.print(resultSet.getString("username")+"-");
        System.out.println(resultSet.getString("password")+";");
    }

}

createDateSource


C3P0

  1. jar包 最新c3p0所有jar包(完整版)_hyhcloud的博客-CSDN博客_c3p0 jar
package com.li.changGe.connectionPool;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class C3P0Demo01 {

    public static void main(String[] args) throws Exception{

        //C3P0连接池对象
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //手动设置连接参数
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/travel");

        //获取数据库连接对象
        Connection connection = dataSource.getConnection();

        PreparedStatement preparedStatement = connection.prepareStatement("select * from tab_user");

        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()){
            //通过字段名获取值
            System.out.print(resultSet.getString("username")+"-");
            System.out.println(resultSet.getString("password")+";");
        }

    }

}
  1. 也可以使用配置文件设置连接参数: c3p0配置文件详细说明及其使用_Gabriel_wei的博客-CSDN博客

c3p0-config.xml,在resources包下

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <!-- 默认配置 -->
  <default-config>
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/travel</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>
  </default-config>

  <!-- 这个配置使用时,需要在new ComboPoolDataSource("MySql") -->
  <named-config name="Mysql">
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/travel</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>
  </named-config>

</c3p0-config>
package com.li.changGe.connectionPool;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class C3P0Demo01 {

  public static void main(String[] args) throws Exception{

      //通过读取c3p0-config.xml中名为"MySql"的配置,来获取C3P0连接池对象
      ComboPooledDataSource dataSource = new ComboPooledDataSource("MySql");

      //获取数据库连接对象
      Connection connection = dataSource.getConnection();

      PreparedStatement preparedStatement = connection.prepareStatement("select * from tab_user");

      ResultSet resultSet = preparedStatement.executeQuery();

      while (resultSet.next()){
        //通过字段名获取值
        System.out.print(resultSet.getString("username")+"-");
        System.out.println(resultSet.getString("password")+";");
      }

  }

}

额外扩展

Apache官网:https://apache.org/

类加载器: 【JVM】Java类加载机制这块算是玩明白了_哔哩哔哩_bilibili

工厂模式: 混合使用太香了:策略设计模式+工厂模式+模板方法模式_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloses

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值