MySql
JavaEE:企业级开发,面向Web
- 前端页面:展示数据
- 后台:连接点,链接前端
- 数据库:存数据.
数据库要学好操作系统,数据结构与算法,离散数据,数学电路,体系结构,编译原理和实战经验
为什么:学任何东西都是因为趋势,趋势优先
大数据时代,数据天下.阿里自己的MySql是由王坚提出的"去IOE"
- DBA(数据库管理员):数据库是所有软件体系中 最核心 的存在
- DBMS数据库管理系统
- DataBase存管数据,500万条是MySql的一个界限,超过就要做优化了
- 关系型数据库:表与表之间进行数据存储,如mysql,oracle
- 非关系型数据库:对象存储由对象自身属性决定,如redis,mongdb,nosql,notonlysql等
历史
mysql用sql语言,开放源码
- 前世: 瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司
- 今生: 属于 Oracle 旗下产品
- 成就: MySQL 是最流行的关系型数据库管理系统之一
- 特点: 体积小、速度快、总体拥有成本低,尤其是开放源码 , 一般中小型网站的开发都选择 MySQL 作为网站数据库。
总结:招人成本低,所有人必须会
安装:本次釆用8.0版本,语法上并无很大出入
- 阿里云买数据库
- **MySql官网(5.7版本稳定,8.0最新): MySQL **
尽量不要用exe安装,会往注册表中写东西,删不干净,用压缩包
** MySQL 5.7 安装教程(全步骤、保姆级教程)_纸短情长ZF的博客-CSDN博客_mysql安装教程5.7 **
数据库操作语句
navicat下创建数据库
-
ctrl + shift +r运行选中代码
-
查看数据库版本select version()
-
字符集urf8mb4,排序规则utf8mb4_bin
-
历史记录(工具下的历史日志)中存储了数据库语句,不会的就在这里面找,ctrl + L
-
默认的引擎是innodb
sql语句创建
-- 创建shop数据库,规定字符集utf8,排序规则为utf8_general_ci;
create database shop character set utf8 collate utf8_general_ci;
-- 查看创建数据 库表的语句
show create database travel;
管理员身份在控制台运行
-
连接进入:mysql -uroot -p密码,最后不要有;号
-
退出quit;或者exit;
-
修改用户密码mysqladmin -uroot -p原密码 password 新密码
-
刷新权限flush privileges;
-
show databases展示当前连接下所有数据库
-
use
user
切换数据库 -
DESCRIBE 或者desc
user
显示库或表结构
-
CREATE if EXISTS DATABASE
长歌
新建数据库时是否已经存在 -
注释:-- # //**
CRUD增删改查
程序员分为:cv和AIP,DDL定义,DML操作,DQL查询,DCL控制
善用历史记录
记住最关键的东西
数据类型 MySQL数据类型 - MySQL教程™ (yiibai.com)
-
int标准整数,4字节
-
float和double,4,8字节
-
decimal字符串高精度浮点,完全无损
-
char字符串,固定大小0~255
-
varchar可变字符串0~65535,varchar(20),无论什么都最多存储20个
-
常用string
-
日期date,时间time(HH:mm:SS,h是12小时制),datetime
-
timestamp时间戳,year年
-
null未知,不要用
字段属性
- unsiyned无符号,不能有负数,且是整数
- zerofill不足位填充0,int(3)最大显示3位,会有0填充
- null和空字符串""是不一样的
操作符
- <>不等于,not
- and = && 建议用关键字
- 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
-
auto_incremet自增
-
comment注释
-
not null非空
-
unique唯一索引(这个列中的所有字段不能出现重复)
-
default 1000 默认值为1000
-
engine = innodb;-- 规定引擎为innodb
-
default charset=utf8;默认字符集为utf8
-
外部表的外键必须有索引,如主键等
-
不建议用物理外键.最佳实现:数据库就是一个表,最终由程序实现外键
-
阿里开发规约禁止使用外键
删: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`;
- change在modify的基础上还可以改名
查
-- 查看创建数据 库表的语句
show create table tianguan;
-- 查看表结构
desc tianguan;
引擎 数据库引擎学习总结_gentelyang的博客-CSDN博客_数据库引擎
- myisam早些年使用,支持全文索引.表空间较小.节约空间,速度快
- innodb支持事务,数据行锁定和外键,表空间是myisam的2倍.安全性高,有事务处理,可多表多用户操作
- my.ini文件在C:\ProgramData\MySQL\MySQL Server 8.0,在这里可以找到Data目录,数据库数据都在这里
- 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
-
mysql的官方API 第25章:API和库_MySQL 中文文档 (mysqlzh.com)
-
C语言中文网API MySQL LIKE:模糊查询 (biancheng.net)
select distinct concat('小',Name) as 别名,@@auto_increment_increment
from tianguan;
-
字段的返回值是个值就行,如select 1+1 -->2
-
distinct去重
-
concat(‘小’,Name):拼接
-
@@auto_increment_increment自增步长
-
列也不区分大小写
模糊查询
-- _单个字符,%0~多个
where name like '_2%';
-- 在这中间的任意一个
where name in ('1','12');
-- 范围查询between 低 and 高
where rid between 100 and 120;
-- 查找条件最终返回的是一个布尔值
where true;
- 给字段填入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;
- 中间就是inner join
- 共有七种join理论,本质是三种,有对应的is not三种反例: MySQL 七种join 理论_huang__2的博客-CSDN博客_七种join理论
- join on是连接查询,where是等值查询
- 笛卡尔积的解释和作用_墨卿风竹的博客-CSDN博客_笛卡尔积
on和where的区别
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
- 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;
- 百度瀑布流就是用了排序
- 分页是为了缓解数据库压力,提升体验
子查询:由里即外
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;
- count(字段)会忽略null值,速度最快,count(*)走完所有列,count(1只走一列).: 一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别 - TOOBUG博客
MD5加密:主要增强算法复杂度和不可逆性
-- md5('123456')加密
insert into tab_user values('LiChangGe',md5('123456'));
-- 加密后的效果
e10adc3949ba59abbe56e057f20f883e
事务:一级sql放在一个批次中执行
ACID原则 数据库事务ACID原则学习分享_技术通俗讲的博客-CSDN博客_acid原则
- 原子性(Atomicity):要么都成功,要么都失败
- 一致性(Consistency):执行前和执行后的有一个固定的数据必须保持一致,如两个人加在一起的总钱数,不能出现转账后,两个人的总钱数发生了改变.
- 隔离性(Isolation):必须我完成后,别人才能操作.如我给别人转账时,我的银行账户就不允许别人操作
- 持久性(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;
- set autoconmit = 0关闭自动提交,事务开始.默认 = 1
- 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)
);
- 常规key/index
- 主键,一个表中只能有一个:primary key
primary
(id), - 唯一索引unique key,避免重复列出现,可以重复,多个列都可以标识为唯一索引
- 全文索引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')
- match(name) against(‘张3’):在有全文索引的字段name中,模糊搜索’张3’
百万级数据测试全文索引 mysql 插入百万级数据 简单靠谱的方法_Mc94Lee的博客-CSDN博客
- 插入一百万条数据,大约需要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;
索引原则: [mysql索引底层原理 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/54665280#:~:text=mysql索引底层原理 1 B%2B树可以更好的结合磁盘IO原理提高查询效率 2 Innodb一,定要有主键,没有主键会以唯一索引为主键, 否则会建立一个隐藏主键 3 Innodb的数据是和主键索引存在一起的 (数据在叶子节点中,MyISAM中的叶子节点存储的数据地址))
-
就是加了一个新的树,相当于翻书(没有索引)与翻目录(有索引)的区别
-
数据大于500万条后再加效果明显
-
不是越多越好,在经常用到的字段上加索引
-
经常改动的数据不要加索引
-
索引数据结构有: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;
- 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.
- 文件路径最后不要加;号,会认为;号也是文件名一部分
文件恢复: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)
数据库设计规约
数据库较复杂时,好的数据库设计要做到:节省空间,保证完整性,屏蔽物理外键,方便开发.
- 分析需求,收集信息
- 标识实体:实际实现,需求落地
-
数据库命名用_分隔,因为不区分大小 写,驼峰没用.
-
外键用父id来实现
-
要做到实体之间能够联系起来,实现基本功能.
-
BBS: Bulletin Board System 网络论坛,电子公告板
-
CRM :Ustomer Relationship Management客户关系管理系统
三大范式 数据库三大范式_凉_ting的博客-CSDN博客_数据库三范式
-
第一范式(原子性):每一列都是不可分割的原子数据项:一列内的信息,只用来表达这一列.
-
如学科年级拆分成学科,年级两个列
-
第二范式(满足第一范式):每张表只做一件表,如客户信息表,就只存储客户信息,不要有厂商信息.
-
第三范式(满足第一和第二):确保表中每列数据都和主键直接相关.不间接相关.
-
如订单表中不要出现和订单无关的,像购买者的账户信息这样的.
规范与性能间的取舍
阿里规定:关联查询表不超过三张.
- 考虑商业化需求与目标(成本,用户体验),性能更重要,因为与用户体验直接挂钩.
- 取舍:数据库读数据的时间的重要性 > 写的时间,可以故意增加字段,计算列,索引等.
JDBC:在架构中,没有什么是加一层不能解决的
-
以下所有的jar包,都是放在一个:和src包同级的lib包里.
-
所有的如.properties,.xml的配置文件,都是放在:一个和src包,同级的,resources包下
-
idea默认去这些包下读取对应的资源
idea左下角可以收合侧边栏
数据库连接页面的"架构"选项,可以看到历史记录
引入jar包: MySQL_JDBC_jar包的下载与使用(Windows) - 苍凉温暖 - 博客园 (cnblogs.com)**
-
jar包要放在lib包下,和src包同级别
-
在idea项目的项目模块设置>库,也可以设置导入jar包
-
jdbcl连接时的参数说明: Mysql JDBC Url参数说明useUnicode=true&characterEncoding=UTF-8 - zhuzhipeng - 博客园 (cnblogs.com)
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(…)效果一样
自定义工具类
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")+";");
}
}
}
-
Sql注入:用一定技巧的输入攻入数据库
-
PreparedStatemet:防止sql注入,效率更高.
-
底层是将传参当做字符,存在转义字符(如or,and等)时,会被转义掉. 关于PreparedStatement原理的理解 - 桦沐 - 博客园 (cnblogs.com)
-
sql语句中的参数用?号代替,用setString()给参数赋值
-
java.sql.Date(new java.util.Date().getTime()),数据库用的是sql下的Date,但是传入的原生的Date时间
连接池:预告准备资源,有需求时直接调用
实现DataSource接口就可以自己编写连接池
-
连接池运行流程:数据库连接 --> 执行完毕 --> 释放
-
听不懂就举例子
-
常用连接数=最小连接数,最大连接数=最高承载上限
-
设置等待超时
DBCP:工具类就是拿来主义
导入jar包,window系统是.zip的包.
- DBCP连接池所用到的两个jar包下载地址_沙滩上的闲鱼的博客-CSDN博客
- 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")+";");
}
}
C3P0
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")+";");
}
}
}
- 也可以使用配置文件设置连接参数: 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/