目录
1.数据库
mysql -u root -p 进入数据库
/*其他电脑连接本地数据库:需提供本地jar包和ip地址,且需要改允许外部服务器访问
use mysql; //使用数据库
select host,user from user; //查看地址和user
update user set host='%' where user ='root'; //如果只能本地访问,则加这个可以外部访问
flush privileges; //刷新权限
select host,user from user; /再次查看
1.create schema XXX(新数据库); //创建数据库
2.show databases; //展示数据库
3.show databases like 'XX%'(数据库); //展示以XX开头的数据库
4.use XXX; //选择数据库
5.alter database XXX(数据库) //选择数据库名称
default character set utf8 //修改字符集为GBK(或uft8)
default collate utf8_general_ci; //修改字符集的校对规则为简体中文,可写可不写
6.drop database demo; //删除数据库
create database XXX character set utf8 collate utf8_general_ci; //一次性创建
2.引擎
1.show engines; 或 show engines\g //查询MySQL存储引擎(更多功能)
2.show variables like 'XX%';(数据库) //查询XX数据库默认引擎
3.数据表
primary key : 设置主键
auto_increment:自增,自动编号,如果要写字段,会自动生成下一个空的字段
not null: 不为空值
default:新字段默认数据初始值
unique:唯一索引
binary(32):32位字符串(二进制)
unsigned:自定义类型
1.use XX;
create table if exists demo( //创建新表
id int auto_increment primary key comment ‘序号’, // 表示是否有自动编号 是否有 主键(一个数据表只能有一编号和一个主键) comment:备注
name varchar(30) not null, //创建数据表字段
like varchar(30) not null,
time datetime); //time 时间类型
2.show columns from XX(数据表) from XX (数据库); //查看表结构
3.use XX;
desc XX; //查看表结构
4.数据表字段
1.use XX;
alter table XX (数据表)add XX (新字段)varchar(30) not null; //添加新字段
2.use XX;
alter table XX(原字段) modify XX(新字段) varchar(40); //修改字段类型
3.alter table XX(数据库).XX(数据表) //修改字段名
change column XX (原字段)XX(新字段)varchar(30) null default null;
4.use XX;
alter table XX(表名) drop XX(字段名); //删除字段
5.use XX;
alter table XX(原表名) rename as XX(新表名); //修改表名
6.use XX ; //复制数据表
create table XX(新数据表名)
like XX;(源数据表名)
7.use XX;
drop table if exists XX; //删除数据表
5.运算符
1.select XX(字段名)+XX(字段名) from XX(数据表) //+ - * /运算符
select id+id from tables1;
2.select XX(字段名),XX(字段名),XX(字段名)=XX(值) from XX(数据表)//比较运算符(=)
select id,name,id=2 from tables1; 值: 0 1 02
6.数据
1.insert into XX(数据表) values(‘XX’,’XX’,’XX’);(根据字段类型填数据) //插入数据
2.insert into XX(id,name) values(1,'菜七'); //插入一部分数据
3.select * from XX(数据表); se //查数据
4.insert into tables set id='4',name='刘六',slike='rap',time='2000-04-05'; //插入数据
5.update demo.tables2 set slike='足球' where id='4'; //修改数据(修改id为4的slike内容)
6.select * from demo.tables2 where id='4'; //查找某一个数据
7.delete from XX(数据表) where id='4'; //删除数据
8.truncate table demo.tables2; //删除数据表所有数据
7.DML查询数据
7.1单表查询(从指定表中查询数据)
1.select * from XX(数据表); //查数据表
2.select XX(字段名),XX(字段名) from XX(数据表) //查找个别数据
3.select * from XX(数据表) where XX='XX'(数据内容) //查找指定数据
7.1.1模糊查询
1.select * from XX(数据表) where XX(字段名) in('XX','XX')(数据内容) //用关键字in,如果查询不到的内容输出null
2.select * from XX(数据表) where id between X(1) and X(3); //用关键字 between and 范围查询之内的数据
3.select * from XX(数据表) where name like '%三%' //查找有“三”这个字的数据
'三%' //查找以“三”开头的数据
'李%三' //查找以“李”开头“三”结尾的数据
4.select id,name from tables2 where name is null; //查找id和name为空值的数据
7.1.2比较运算符
1.select * from tables2 where id=’1’ and name=’张三’; //关键字and多条件 查询(符合条件即可查询)
2.select * from tables2 where id=’1’or name=’李四’; //符合随便一个条件可查询
3.select distinct name from tables2; //除重(把相同名字除掉)
7.1.3排序
1.select* from tables2 order by id desc(asc); de:降 a:升 //对字段进行排序(升序或降)
2.select* from tables2 order by id asc limit 3; //按id升序排序,显示前3条数据(限制查询)
7.1.4.分页(缓解数据库压力,提高客户体验)
在显示的数据表后 写 limit 0,5; //显示1~5条数据
总页数=(数据总数/页面大小)+1
7.1.5分组
//SubjectNo:是编号,这两个表都有同一个编号
7.2聚合函数查询(根据一组数据求一个值)
1.select count(*) from tables2; //查询数据表有几条数据
2.select sum(id) from tables2; //查询id的总值
3.select avg(id) from tables2; //查询id的平均值
4.select max(id) from tables2; //查询id的最大值
5.select min(id) from tables2; //查询id的最小值
7.3连接查询(把不同表的记录连到一起)
1.select bname,book from tables1,tables2 where students.name=b ooks.name;
2.select bname,book,students.id from tables1,tables2 where students.name=books.name;
//两个表存在连接有name,则把两个表的bname和book连接起来
7.4子查询(从内到外运算符查询)
7.5合并查询(并列到一起查询)
7.6联表查询(join)
7.7自连接(一张表拆为两张一样的表,树状图)
pid=1:顶级(父类)
7.8别名(定义表和字段的别名)
1.select * from students t where t.name=’张三’; //把students的别名为t,查询张三
2.select name as students_name,id as students_id from students; //把字段name的别名为students_name
8.MySql函数(一些基础函数)
8.1数学函数
1.select abs(5),abs(-5); //求5和 -5的绝对值
2.select floor(1.5),floor(-2); //返回小于或等于x的最大整数(相当于c语言int 型)
3.select round(rand()*100),rand(),floor(rand()*100); //随机数
4.select pi(); //π函数
5.select truncate(2.1234567,3) //f返回2.1234567小数点后3位
6.select round(1.6),round(1.2),round(1.123456,3); //四舍五入
7.select sqrt(16),sqrt(25); //平方根
8.1字符串函数
1.select insert(‘mrkej’,3,2,’book’); //将字符串mrkej的第3位后面两位改成book
61select upper(‘mrasd’),ucase(‘asdasd’) ; //小写变大写
62.select left(‘asdasd’,2); //返回前两个字符
63.select concat('+',rtrim(' asd '),'+'); //去掉asd后面空格
64.select field(‘as’,’asd’,’asdf’,’as’); //返回第一个与as相同字符的字符位置
65.select locate(‘me’,’I love you,you love me.’); //查找me的位置
select position(‘me’in’I love you,you love me.’);
select instr(’I love you,you love me.’, ‘me’);
8.3日期时间函数
1.select curdate(),current_date(); //获取当前日期
2.select curtime(),current_time(); //获取当前时间
3.select now(),current_timestamp(),localtime(),sysdate(); //获取当前时间日期
4.select datediff(‘2019-09-05’,’2011-07-01’); //获取时间间隔天数
5.select adddate(‘2020-09-05’,3); //返回+3天的日期
6.select adddate(‘2017-11-30 23:59:59’,interual ‘1:2’ year_month);//返回+1年2个月的日期
7.select adddate(‘2017-11-30 23:59:59’,interual ‘1’ year); //返回+1年的日期
8.select subdate(‘2017-07-09’,6); //返回-6天的日期
8.4判断条件函数
1. select id,slike, case when id>3 then 'Very Good' when id<3 and id>1 then 'perfect' else 'not good' end llll from tables2; //判断id如果大于3,则Very Good;id小于3大于1,则perfect,否则notgood
8.5系统信息函数
1.select version(),connection_id(); //查询版本号和连接数;
2.select database(),schema(); //查询当前使用的数据库
3.select user(),system_user(),session_user();
4.select charset(‘aa’),collation(‘aa’); //获取字符串的字符集
8.6加密函数
1.select password(‘absc’); //对absc进行加密(用于用户密码)
2.select md5(‘absc’); //对absc进行加密(用于普通数据)
8.7其他函数
1.select format(235.3456,3); //保留小数点后3位(四舍五入)
2(77).select charset(‘abc’),charset(convert(‘abc’ using gbk));
3.select time,cast(time as date),convert(time(数据表里面的),time) from tables2; //改变字段数据类型,time改成date
9.索引(查询时更快查询到需索引的文件,提高了查询效率)
没加索引前,是遍历。加了索引后是定位
9.1创建索引
9.1.1在建立数据表时创建索引
create table tables3(
id int(11) auto_increment primary key not null;
name varchar(50) not null;
math int(5) not null;
index(id)); //普通索引:无限制条件的索引,根据该索引查询即可
//unique index address(id asc)); //唯一索引:索引的值必须唯一,主键是一个特殊唯一索引
//fulltext key tables3_name(name))engine=myisam;//全文索引:只能用在字符型的字段上,查询较大字符串类型的字段
//index math_num(math(20))); //单列索引:只对应一个字段的索引
//index info(name,id)); //多列索引:对多个字段的索引
//spatlal index zijian(good))engine=myisam; //空间索引:只建立在空间数据类型上
good geometry(空间数据类型) not null
show create table score; //查看表结构
9.1.2.在已建立数据表时创建索引
use demo
create index t_info on tables2(id); //普通索引
create unique index t_info on tables2(id); //唯一索引
create fulltext index t_info on tables2(id); //全文索引
create index t_info on tables2(name(4)); //单列索引
create index t_info on tables2(name,id); //多列索引
create spatial index t_info on tables2(good); //空间索引
drop index id ont_info; //删除索引
9.2索引原则
- 不是索引越多越好
- 不要对进程变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的的字段上
9.3索引背后的数据结构(之后研究)
- 索引(Index)是帮助MySQL高效获取数据的数据结构,本质:索引是数据结构
- 不用索引为遍历,时间复杂度为O(n)(在大数据会很慢)
10.视图(虚拟表,方便操作且有安全权限)
1.select select_priv,create_view_priv from mysql.user where user=’root’;//查询是否有创建视图的权限
2.ues demo //在tables1表中创建视图view1
create view //如果有出错,就把没权限建的字段给删掉,看错误代码
View1(v_id,v_name,v_like)
As select id,name,like
From tables1;
3.describe view1; //查看视图
4.show table status like ‘view1’ //查看视图信息
5.show create view view1; //查看视图详细定义
Select * from view1; //查看视图数据
6.create or replace //修改视图字段
view view1(v_id,v_name)
as select id,name from tables2;
7.alter view view1(v_name) //删除视图字段
As select name
From tables1
With check option;
8.update view1 set v_name=’张张三’where id=1; //修改字符数据(数据表也会发生变化)
//有些数据类型不能修改
9.drop view if exists view1; //删除视图
11.数据完整性约束
11.1实体完整性
1.id int auto_increment, //自增
2.primary key (id,classid); //主键由表中某一列构成,可以设置两个主键(但是id还是唯一主键,如96一样,classid还是正常打)
3.user vachar(4) not null unique; //如果user不会重复,则可以成为候选主键
11.2参照完整性(不推荐使用外键)
1.两个表:
学生(学号,姓名,性别,生日,班级编号) //下划线为主键,班级编号为外键,正在创建的表
班级(班级编号,班级名称) //已经形成的表,且设置外键拒绝删除或更新
create table student(
id int auto_increment,
name varchar(40) not null,
sex varchar(2),
classid int not null.
Birthday date,
Primary key(id))engine=innodb default charse=utf8
Alter table student add constraint fk_classid foreign key(classid) references class(classid); //添加外键
11.3用户定义完整性
1.not null //建表定义非空约束
2.age int check(age>6 and age<18) //定义限制条件约束
3.check(classid in(select id from class)); //对表实施check约束,限制class表中classid字段的值只能是class表中id字段的某一个id值
11.4命名完整性约束
对完整性约束进行添加修改删除等操作,需要添加constraint语句
11.5更新完整性约束
1.alter table tables1 drop foreign key classid; //删除外键约束
primary key id; //删除主键约束
index name //删除候选键约束
2.alter table student drop foreign key classid; //修改完整性约束 先删除(联级删除)
alter table student add constraint classid foreign key (classid) //再修改(联级修改)
aeferences class(id)
on delete cascade
on update cascade;
12. DML语言(数据库操作语言)
12.1 Insert(插入语句,添加)
1.Insert into `demo` values(‘1’,’张三’,’跳舞’,’2000-2-5’);
12.2 Update(修改语句)
1.Update `tables1` set ‘name=上山’where id=1;
2.Update `tables1` set ‘name=上山’; //如果不指定主键,将会改变所有表name值
12.3 Delete(删除)
1.delete from `tables1` where id=1;
2.truncate `tables1`; //清空表,重新设置自增列(如果用delete删除表,则会有空白列),不会影响事务,比delete叼
12.3.1 delete删除问题
InnoDB引擎:自增列会从1开始(存在内存当中,断电即失)
MyISAM引擎:继续从上一个自增量开始(自增列还在)(存文件中,不会丢失)
13.事务(sql执行事件,要么都成功,要么都失败)
将一组SQL放在批次中去执行
ACID原则:是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).
13.1 原子性
原子性意味着数据库中的事务执行是作为原子(针对一个事务)。即不可再分,整个语句要么执行,要么不执行。
13.2 一致性
即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,针对一个事务操作前与操作后的状态一致
13.3 隔离性
事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。针对多个用户同时操作,主要是排除其他事务对本次事务的影响。
13.3.1隔离性的级别:
13.4 持久性
意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。表示事务结束后的数据不随着外界原因导致数据丢失。
13.5 步骤
set autocommit=0//关闭 /*默认开启事务自动提交
set autocommit=1//开启 */
手动处理事务:
set autocommit=0 //关闭自动提交
事务开启:
start transaction
insert XX
提交:一旦提交持久化(成功)
commit
回滚:回到原来的样子(失败)
rollback
事务结束:
Set autocommit=1 //开始自动提交
13.5.1需了解:
savepoint 保存点名 //设置一个事务的保存点
rollback to savepoint 保存点名 //回滚到保存点
release savepoint 保存点名 //撤销指定的保存点
13.6 具体步骤
create database shop character set utf8 collate utf8_general_ci;
use shop;
create table `account`(
`id` int(3) not null auto_increment,
`name` varchar(30) not null,
`money` decimal(9,2) not null, //decimal 代表一个九位数,其中小数位是两位
Primary key (`id`)
)engine=innodb default charset=utf8; //INNODB引擎 能支持事务
Insert into account(`name`,`money`) values (‘A’,2000.00),(‘B’,10000.00);
模拟转账:事务
Set autocommit = 0;
start transaction
update acount set money=money-500 where `name`=’A’; //A减500
update acount set money=money+500 where `name=’B’;
//在使用mysql执行update的时候,如果不是用主键当where语句,会报错误,使用主键用于where语句中正常,则需执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式。
如果想要提高数据库安全等级,可以在恢复回原有的设置,执行命令:SET SQL_SAFE_UPDATES = 1;
commit;
rollback;
set autocommit=1;
14.权限管理和备份
14.1用户管理
1.Create user zhangyijian(用户名) identified by ‘123456’(密码); //创建用户
2.Set password=password(‘123456’); //修改当前用户新密码
3.Set password for root =password(‘123456’); //修改指定用户密码
4.Rename user zhangyijian(原名) to root1(新名); //重命名
5.Grant all privileges *.*(数据库.表) to zhangyijian(用户); //给指定用户的所有库和表受全部权限
6.Show grants for root@localhost(root需要加@localhost,其他用户不需要); //查看指定用户的权限
7.Revoke all privileges on *.* from zhangyijian(用户); //撤销用户的权限
8.Drop user zhangyijian; //删除用户
14.2备份
1.直接拷贝物理文件
2.Mysql workbench可视化工具导出
3.使用命令行导出mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 >物理磁盘位置
15.规范数据库设计
15.1当数据库比较复杂的时候,就需要设计
糟糕的数据库设计:
- 数据冗余,浪费时间
- 数据库插入和删除都会出现麻烦和异常(屏蔽使用物理外键)
- 程序的性能差
良好的数据库设计: - 节省内存空间
- 保证数据库的完整性
- 方便开发系统
设计:
分析需求:分析业务和需要处理的数据库的需求
概要设计:设计关系图E-R图(流程图)
个人博客:
- 收集信息,分析需求
用户表:(用户登陆注销,个人信息。写博客,创建分类)user
分类表:(文章分类)category
文章表:(文章信息)blog
评论表:(评论信息)comment
友链表:(友链信息)links
关注表:(关注人数,粉丝人数)follow
自定义表:(系统信息,某个关键的字) - 标识实体(把需求落地到每个字段,真正设计表)
标识实体之间的关系
写博客(需要的表):user->blog
创建分类:user->categoy
评论:user->blog->comment
友链:links
关注:user->follow
15.2 三大范式(规范数据库的设计)
如果没有规范,则可能出现:信息重复,更新异常,插入异常,删除异常
15.2.1规范性与性能的问题
关联查询的表不得超过3张表:大表分小表,每个表都关联,范式越高,性能越渣
- 考虑商业化的需求和目标(成本、用户体验)数据库的性能更重要
- 在规范性能的问题的时候,需要适当的考虑一下规范问题
- 故意给某些表增加一些冗余的字段。(从多表查询变为单标查询)->提高用户体验
- 故意增加有些计算列(从大数据量降低为小数据量的查询:索引)->提高用户体验
第一范式(1NF)
原子性:列不能够再分成其他几列;
//上表不满足
//上表满足
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事情
//上表不满足产品与订单号有关,与订单金额和时间无关,需拆两张表
//上表满足
第三范式(3NF)
前提:满足第二范式
数据需要和主键直接相关,不能间接相关(消除传递依赖)
//上表不满足,所有属性都依赖于学号,满足第二范式,但是‘班主任性别’和‘班主任年龄’直接依赖的是‘班主任姓名’
//上表满足
16.JDBC
16.1数据库驱动
JDBC(java database connect)
- SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个java操作数据库的规范(JDBC)。
对于开发人员,掌握JDBC接口的操作即可
16.2 IDEA连接数据库
1.创建普通项目
2.导入数据库驱动(在directory创建lib文件,把jar包粘贴进去,再lib包右键add as library)
3.加载驱动(DriverManager)
Class.forName("com.mysql.cj.jdbc.Driver");
4.连接数据库
Connection con= DriverManager.getConnection("jdbc:mysql://172.29.40.73:3306/demo?serverTimezone=UTC","root","123456");
5.执行sql对象(查询)
Statement statement=con.createStatement(); //执行sql的对象statement
String sql="SELECT * FROM tables1";
Statement:代表数据库。用于向数据库发送SQL语句,相当于数据库命令行(增删改查等等)
//statement.executeQuery(); //查询操作,返回结果集,封装了所有的查询结果
//statement.execute(); //执行任何sql
//statement.executeUpdate(); //更新、插入、删除。都是用这个。返回一个受影响的行数
Statement statement=con.createStatement();
String sql=”insert into tables1 values(‘1’,’张三’,‘跳舞’,‘2000-2-5’)”;
Int num= statement.executeUpdate(sql);
If(num>0){
sout(“插入成功!”);
}
Statement statement=con.createStatement();
String sql=”delete from tables1 where id=1”;
Int num= statement.executeUpdate(sql);
If(num>0){
sout(“删除成功!”);
}
Statement statement=con.createStatement();
String sql=”update tables1 set name=’张张’ where name=’张三’”;
Int num= statement.executeUpdate(sql);
If(num>0){
sout(“修改成功!”);
}
6.返回结果集
ResultSet resultSet=statement.executeQuery(sql); //返回结果集
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("id="+resultSet.getObject("name"));
System.out.println("id="+resultSet.getObject("like"));
System.out.println("id="+resultSet.getObject("time"));
}
//resultSet.getObject();//在不知道列的数据类型用这个
//resultSet.getInt();
//resultSet.next(); //移动到下一行
//resultSet.absolute(row);//移动到指定行
7.关闭(最后用的先关闭)
resultSet.close();
statement.close();
con.close();
16.3 代码实现(增删改查)
1.创建一个配置文件,放到src里面;
2.创建一个类(JdbcUtils),实现调用配置文件(properties)
(1)
static{
try{
//实现代码
}
}
(2)用输入流(读文件)读取配置文件:
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties配置");
(3)创建properties类
Properties properties=new Properties();
(4)把输入流in(配置文件)传入到properties类中
properties.load(in);
(5)定义配置文件里面的内容
private static String driver=null;
private static String url=null;
private static String username=null;
private static String passwowrd=null;
(6)在try catch语句中给配置文件赋值
driver=properties.getProperty("driver");
url=properties.getProperty("url");
username=properties.getProperty("username");
passwowrd=properties.getProperty("passwowrd");
(7)加载驱动
Class.forName(driver);
(8)连接数据库
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,passwowrd);
}
(9)释放连接
public static void release(Connection connection, Statement statement, ResultSet resultSet){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
3.创建testInset类(main函数,添加)
(1)赋空值
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
(2)连接并使用sql语句(自动生成try catch)
connection=JdbcUtils.getConnection();
statement=connection.createStatement();
String sql="INSERT INTO tables1 VALUES(10,'涨涨','跳跳','2000-05-05')";
int i=statement.executeUpdate(sql);
if(i>0){
System.out.println("插入成功");
}
(3)添加finally,关闭链接(因为暂时没用到resultset(集合),所以为null)
finally {
JdbcUtils.release(connection,statement,null);
}
4 .创建testdelete类(main函数,删除)
与testinsert基本一样,改变sql语句即可
5 . 创建testupdate类(main函数,修改)
与testinsert基本一样,改变sql语句即可
6 . 创建testselect类(main函数,查询)
需要resultset
16.4 sql注入问题(漏洞,会被攻击导致数据泄露—SQL会被or拼接)
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
username,like 判断 等于空或等于1=1(真) 则输出
正常是只输出张三和篮球 这却全部输出
由于Statement不安全,则由PreparedStatment对象,可以防止SQL注入,效率也更高(防止注入sql的本质,把传递进来的参数当成字符,假设其中存在转义字符,就直接忽略,“ ’” 会被直接转义)
16.5 PreparedStatement(防止SQL注入)
Mbatis涉及
16.6 IDEA连接数据库
16.7 JDBC操作事务
16.8 连接池操作(DataSource接口)
数据库连接 — 执行功能 —释放
每次都连接到释放 十分浪费系统资源
池化技术:装备一些预先的资源,过来就连接预先准备好的。
例子:一个人管理银行: 开门----接待—关门 耗时耗神
连接池:有接待员: 开门----接待员:等待—关门
常用连接数(接待员)10个,则最小连接数为10个
可设置最大连接数 100个
等待超时:100ms,自动断
开源数据源实现:
DBCP,C3P0,Druid(阿里巴巴)
使用了这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码
DBCP
- 下载两个jar包:pool,dbcp
http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
http://commons.apache.org/proper/commons-pool/download_pool.cgi - 导入到IDEA项目中
- 配置文件