web前端,数据库,jdbc

            刘国斌 77331283   [email protected]
                ----------------web-day01.html
###网站的架构
- CS:Client Server 客户端和服务端
    移动客户端:Android和iOS
    电脑客户端:windows和linux、Mac OS
    客户端是由客户端工程师开发
    服务端功能:给客户端提供数据 
    应用场景: 京东、淘宝、唯品会
- BS:Browser Server 浏览器和服务端
    浏览器
    服务端功能: 给浏览器提供数据 和 页面
    应用场景: 页游  
![](01.png)
- 将来工作 BS和CS架构都会涉及,但是只需要掌握BS架构 CS就会了

###课程介绍

![](02.png)
###前端课程介绍
1. HTML : 用来勾勒出页面的结构和内容(骨架)
2. CSS : 用来美化页面 
3. JavaScript: 让页面呈现动态效果和动态数据的
4. JQuery:用来简化JavaScript代码的

###HTML
    Hyper Text Markup Language:超文本标记语言 
- 什么是超文本:不仅仅是文本,还包括文本的字体颜色,样式 还包括多媒体(图片,音频,视频)
- html学习内容: 学习有哪些固定的标签,还有标签内部有哪些属性和标签和标签之间的嵌套关系

###通过Eclipse创建html文件 
- 新建文件-> other->搜索html 

###html结构

           //文档声明 告诉浏览器使用html的哪个版本来解析页面内容 ,此写法是告诉浏览器用最新的html5的版本解析 
        //所有内容都在html标签内部 除了 文档声明
            //头 :里面的内容是给浏览器看的 比如使用什么编码 
            
            //体 :里面的内容是给用户看的 
            
        

 

  ***********************
 *------day--01-------*
  ************************
##数据库
###io流文件存储数据的弊端
1. 存储效率低
2. 不管存还取操作比较麻烦
3. 一般只能保存小量字符串数据
###DB
- data base 数据库
- 什么是数据库: 数据库实际上就是一个文件集合
- 数据库就是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作
###DBMS
- DataBaseManagementSystem:数据库管理系统(软件)
- 什么是DBMS: 用来管理数据库文件的软件,用户需要访问DBMS对数据进行增删改查操作。
常见DBMS: MySQL  oracle DB2 sqlite sqlserver..
###数据库的分类
分为两类:
1. 关系型数据库: 经过数学理论验证 可以保存现实生活中的各种关系数据, 数据库中存储数据以表为单位。
2. 非关系型数据库:通常用来解决某些特定的需求如:数据缓存,高并发访问。 存储数据的形式有多种,举例:Redis数据库:通过键值对的形式存储数据。
###主流关系型数据库介绍
1. MySQL: 08年被sun公司收购 09年sun被oracle收购,开源免费,到oracle发布了5.0版本(使用了oracle核心技术 性能提高30%),因为Oracle数据库地位受到威胁,计划把mysql闭源,原mysql作者们不干了,原程序员出去单干 发布了MariaDB数据库 名字是因为作者女儿叫Maria ,市场排名第一
2. Oracle: 闭源, 最贵 性能最高 拉里埃里森32 市场排名第二
3. SQLServer:微软公司的产品 市场排名第三,主要应用在.net(C#)开发的网站中
4. DB2: IBM公司 有做网站的完整解决方案(操作系统,we服务器(如tomcat),数据库等)主要应用在银行等国有大型企业中
5. sqlite:轻量级数据库 只有几十k,一般应用在嵌入式和移动设备中
###开源和闭源的区别
1. 开源: 开发源代码,盈利方式靠卖服务(赚钱慢,少),用户群大,大牛程序员会无偿帮着升级维护 
2. 闭源:不开放源代码,盈利方式卖产品+服务(赚钱快,多),大牛们各种攻击找漏洞 
###数据库的安装
- 两点注意: 端口号默认3306,字符集选择utf-8

###SQL
    Structured Query Language:结构化 查询 语言
- sql是写在客户端 执行在DBMS中,DBMS解析后执行
###打开数据库客户端 并登陆
- 在终端中执行以下命令
mysql -uroot -p  敲回车  因为没有密码 所以再次敲回车 如果有密码则先敲密码再回车
- 退出命令: exit;

------------------------------------------------------------------------------------------------------------------------------------------------------------------
###数据库相关的SQL
            
            +++++++++++++
            show(查看相关)
            +++++++++++++    
1. 查看所有数据库
    
        show databases;
            
3. 查看数据库详情
    -格式: show create database 数据库名;

        show create database db1;
            
            +++++++++++++
            create(创建相关)
            +++++++++++++    
2. 创建数据库
    -格式:create database 数据库名称;

        create database db1;

4. 创建数据库指定字符集 utf8或gbk
    
        create database db2 character set utf8;

        create database db2 character set gbk;
5. 删除数据库 

        drop database db2;
###练习:把刚才自己创建的都删除 
    然后再创建db1,db2 字符集为gbk,db3, 然后查看db2是否成功,然后把db2 和db3删除 

6. 使用数据库

    use db1;
------------------------------------------------------------------------------------------------------------------------------------------------

###和表相关的SQL
- 什么是表: 关系型数据库中保存数据的单元,类似于Excel中的表,创建表时需要指定字段信息
1. 创建表
    -格式: create table 表名 (字段1名 字段1类型,字段2名 字段2类型);

    create table person(name varchar(10),age int);
#### 查询所有表

        show tables;

#### 查看单个表属性

    show create table person;

###表的引擎
1. Myisam: 只支持数据基础的增删改查,不支持高级操作,如:事务、外键等
2. InnoDB:支持高级操作,默认为InnoDB。

####创建表并且指定引擎和字符集

    create table t1(id int,name varchar(10)) engine=myisam charset=gbk;
    -查询:
    show create table t1;
####查看表字段信息

    desc student;
###对创建好的表进行修改

####修改表名

        rename table 原名 to 新名;

        rename table student to t_stu;

        create table hero(name varchar(10));

            +++++++++++++
            alter(修改相关)
            +++++++++++++    
####修改表属性 引擎和字符集
    
        alter table hero engine=myisam charset=gbk;

####添加表字段@@@@alter table 表名 add 字段
- 最后位置添加
    格式:alter table 表名 add 字段  字段类型
        alter table hero add age int;
- 最前面添加
        alter table hero add money int first;
- 在某个字段的后面添加
        alter table hero add gender varchar(5) after name;
####删除表字段@@@alter table 表名 drop 字段
        格式:alter table 表名 drop 字段
        alter table hero drop money;

####修改表字段名和类型@@@alter table 表名 change 

    格式:alter table 表名 change 原字段名 新字段名 类型;
        alter table hero change name heroname varchar(10);
####修改表字段类型和位置@@@modify

        alter table hero modify age int first;
        alter table hero modify age int after xxx;
####删除表@@@drop

        drop table hero;


    
####练习:
1. 创建员工表(emp) 字段有 id和name
    create table emp(id int,name varchar(10));
2. 修改emp表的引擎为myisam 字符集为gbk
    alter table emp engine=myisam charset=gbk;
3. 修改表名为 t_emp
    rename table emp to t_emp;
4. 给t_emp添加age字段在id的后面
    alter table t_emp add age int after id;
5. 给t_emp添加工资sal字段在最后
    alter table t_emp add sal int;
6. 修改sal字段名称为salary
    alter table t_emp change sal salary int;
7. 修改age字段到salary字段的后面
    alter table t_emp modify age int after salary;
8. 删除salary字段
    alter table t_emp drop salary;
9. 删除 t_emp表
    drop table t_emp;
            

                +++++++++++++
                 insert(插入相关)
                +++++++++++++                        
###数据相关的SQL

 


####插入数据@@@insert into 表名 value(字段值 按字段顺序)
          insert into 表名(字段)value(值);    
- 创建学生表
    
        create table student(id int,name varchar(10),chinese int,math int,english int);
- 插入数据 全表插入:每个字段都赋值 顺序要和表字段一致

        insert into student values(1,'zhangsan',88,38,98);
-指定字段插入

        insert into student (id,name) values (2,'张飞');

-练习: 插入刘备 id为3 语数外成绩 78 22 18
    insert into student values(3,'刘备',78,22,18);
插入关羽 id为4  语文90
    insert into student (id,name,chinese) values (4,'关羽',90);
插入孙悟空 id为5 英语18
    insert into student (id,name,english) values (5,'孙悟空',18);

####批量插入
    
        insert into student values(6,'唐僧',56,57,58),(7,'八戒',88,89,99);

        insert into student (id,name) values
        (8,'吕布'),(9,'貂蝉'),(10,'孙尚香');


            +++++++++++++++
            ++select(查询相关)++
            +++++++++++++++
####查询
-查询全部数据的全部字段信息
        ----查什么 从哪查  怎么查(条件)
        select * from student;

-查询指定字段
        
        select id,name from student;

-条件查询
        
        select * from student where id<5;

            +++++++++++++++
            ++update(修改相关)++
            +++++++++++++++
####修改数据
        ---        在那改           改什么
        update student set math=100; 直接修改
         
        update student set english=30 where id=7;选择修改

            +++++++++++++++
            ++delete(删除相关)++
            +++++++++++++++
####删除数据@@delete from 表名 where 删除条件;
        
        delete from student where id=7;//删除指定条件的数据
        
        delete from student;//删除表中所有数据(删内容不删除表)

####练习
1. 创建t_emp表 有 id 名字name 工资sal 如果之前存在t_emp先删除
    create table t_emp(id int,name varchar(10),sal int);
2. 插入以下五条数据
    insert into t_emp values(1,'诸葛亮',3000),(2,'司马懿',4000),(3,'李白',8000),(4,'元芳',6000),(5,'狄仁杰',8000);
3. 修改工资8000的为7888
    update t_emp set sal=7888 where sal=8000;
4. 修改元芳的名字为李元芳
    update t_emp set name='李元芳' where id=4;
5. 删除工资低于5000的
    delete from t_emp where sal<5000;
6. 删除所有数据
    delete from t_emp;

###编码问题
- sql语句在客户端中写完后需要通过网络发送给数据库服务器,这时需要字符的编解码,数据库保存数据时也需要字符的编解码
- 学校学生电脑保存中文数据只需要确认 数据库和表是否统一为utf8
- 个人电脑如果是windows系统需要保证数据库和表为utf8 之外 还需要在命令行中 执行 set names gbk; 通知数据库客户端传过去的内容需要使用gbk解码。

_------------------------------------------------------------------------------------------------------------------------------------------

###数据相关sql
1. 插入数据
    insert into t1 values(值1,值2,值3);
    insert into t1 (字段1名,字段2名)values(值1,值2);
- 批量插入
    insert into t1 values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
    insert into t1 (字段1名,字段2名)values(值1,值2),(值1,值2),(值1,值2);
2. 查询数据
    为了使用 SELECT 检索表数据,必须至少给出两条信息——想选择什
    么,以及从什么地方选择。
    select * from t1;
    select name,age from t1;
    select * from t1 where age<20;
3. 修改数据
    update t1 set age=18,sal=3000 where id=3;
    
4. 删除
    delete from t1 where id=3;
--------------------------------------------------------------------------------------------------------------------------------------------

 

 ************************
 *~~~~~~day~~~~02~~~~~*
 ************************

###主键约束
- 什么是主键: 用来表示数据唯一性的字段称为主键 
- 约束:约束就是对表字段的限制条件
- 主键约束:限制主键字段的数据唯一并且非空

    create table t1(id int primary key,name varchar(10));

    insert into t1 values(1,'Tom');//成功
    insert into t1 values(1,'Jerry');//失败 id不能重复
    insert into t1 values(null,'Jack');//失败 id不能为null
- 自增: auto_increment

    create table t2(id int primary key auto_increment,name varchar(10));
    
    insert into t2 values(null,'Lucy');
    insert into t2 values(null,'Hanmeimei');
    insert into t2 values(10,'LiLei');
    insert into t2 values(null,'Lily');
1. 自增会在曾经出现的最大值的基础上+1
2. 自增数值不会因为删除数据减少
3. 使用delete删除整个表的数据时 自增数值不会清零

####注释 comment
- 创建表声明字段的时候可以通过添加comment给字段添加注释

    create table t3(id int primary key auto_increment comment '这是主键字段',age int comment '这是年龄字段');
    show create table t3;
####`和' 的区别
- ` : 用来修饰表名和字段名的 可以省略

    create table `t4`(`id` int,`name` varchar(10));
- ' : 用来修饰字符串
###数据冗余
- 如果表设计不够合理随着数据量增多出现了大量的重复数据称为数据冗余,通过拆分表的形式解决冗余问题

- 练习:
创建商品表item    字段:id,商品标题title,单价 price,库存 num, 分类cid
创建分类表category 字段:id,名称name

    create table item(id int primary key auto_increment,title varchar(10),price int,num int,cid int);
    create table category(id int primary key auto_increment,name varchar(10));

- 插入以下数据: 电视机分类下的 康佳电视价格3520库存25 夏普电视价格18888 库存100 手机分类下的苹果9价格800库存100,华为p20 价格6888 库存4
    insert into category values(null,'电视机'),(null,'手机');
    insert into item values(null,'康佳电视',3520,25,1),(null,'夏普电视',18888,100,1),(null,'苹果9',800,100,2),(null,'华为p20',6888,4,2);

###事务

    create table person(id int primary key auto_increment,name varchar(10),money int);

    insert into person values(null,'超人',50);
    insert into person values(null,'钢铁侠',30000);

    update person set money=5050 where id=1;
    update person set money=25000 where id=2;
    
- 什么是事务:数据库中执行sql语句的工作单元,此工作单元不可拆分,能够保证全部成功或全部失败

- 查看数据库自动提交的状态
    
    show variables like '%autocommit%';

- 设置自动提交的开关 0:关闭off  1:开启on
    
    set autocommit=0/1;

- 验证过程:
    create table person(id int primary key auto_increment,name varchar(10),money int);
    insert into person values(null,'超人',50);
    insert into person values(null,'钢铁侠',30000);
1. update person set money=5050 where id=1;
2. 先在当前窗口执行select * from person 查看是否改变,结果是修改了因为查看的是内存中的数据
3. 此时打开另外一个终端,先使用db2 然后select * from person 查询是否改变,结果是没有改变因为此时查看的是数据库文件中的数据,没提交就不会改变
4. 回到原窗口再执行转账的另一部分
    update person set money=25000 where id=2;
5. 此时原窗口查询数据因为查询的是内存中的数据所以改变,但是另外一个窗口数据并没变化
6. 在原窗口中执行commit,此时 两个窗口的数据都发生改变
- 事务回滚: rollback, 此指令会将数据库中的数据回滚到上次提交的点
步骤:1. 在关闭了自动提交的窗口 修改超人的钱  修改后查询 由于查询到的是内存中的数据所以数据是修改过的,此时执行rollback,则数据会回滚到修改前的值
      
- 保存回滚点: savepoint s1;
- 回滚到某个回滚点: rollback to s1;


- 事务总结: 执行sql语句的工作单元,保证全部成功或全部失败
1. 查看自动提交状态  show variables like '%autocommit%';
2. 设置自动提交状态 set autocommit=0/1;
3. 手动提交 commit;
4. 回滚 rollback;
5. 保存回滚点 savepoint s1;
6. 回滚到某个点  rollback to s1;

###SQL分类
#### DDL:Data Definition Language(数据定义语言) 
- 包括:create,drop,alter,truncate 
- 不支持事务
####DML:Data Manipulation Language(数据操作语言)
- 包括:insert update delete select(DQL)
- 支持事务 
####DQL:Data Query Language(数据查询语言)
- 只包括select
####TCL:Transaction Control Language(事务控制语言)
- 包括:commit rollback  savepoint rollback to
####DCL:Data Control Language(数据控制语言)
- 分配用户权限相关的sql

####truncate
- 删除表并且创建一个相同的空表,此时表中的自增数值清零
- 格式: truncate table 表名;
- truncate:删除表创建新表 drop:删除表 delete:只删除数据        
- 效率:drop>truncate>delete

###数据库的数据类型
####整型
- 常用类型:int(m) bigint(m),m代表显示长度   
    create table t_int(num int(10) zerofill);
    insert into t_int values(123);
    select * from t_int;
####浮点型
- 常用类型: double(m,d) m代表总长度 d代表小数长度   76.232 m=5 d=3, decimal(m,d):超高精度小数,当需要涉及超高精度运算的时候使用此类型
####字符串
- char:固定长度 char(10)  'abc' 占10 ,执行效率高,最大255
- varchar:长度可变  varchar(10) 'abc' 占3 ,节省空间,最大65535 超高255建议使用text
- text:长度可变 最大值65535 用于保存大文本
####日期
- date:只保存年月日
- time:只保存时分秒
- datetime:保存年月日时分秒,默认值为null,最大值 9999-12-31
- timestamp:保存年月日时分秒 保存距离1970年1月1日八点的毫秒数,默认值为当前时间,最大值2038年1月19号

    create table t_date(d1 date,d2 time,d3 datetime,d4 timestamp);
    insert into t_date values('2018-04-23',null,null,null);
    insert into t_date values
    (null,'12:38:45','2018-05-12 12:38:33',null);


###导入数据
在db6数据库下 执行source命令
- 学生机(linux)
    source /home/soft01/桌面/tables.sql;
- 个人电脑(windows)
    source d:/tables.sql;

show tables;

### is null 和 is not null

1. 查询没有奖金的员工信息

    select * from emp where comm is null;
2. 查询有奖金的员工信息

    select * from emp where comm is not null;
###别名
    select ename from emp;
    select ename as '名字' from emp;
    select ename '名字' from emp;
    select ename 名字 from emp;
###去重 distinct
- 去掉重复的数据
    select distinct job from emp;
###比较运算符 > < >= <= = !=和<>
1. 查询工资小于等于1600的员工姓名和工资
    select ename,sal from emp where sal<=1600;
2. 查询部门编号是20的员工姓名,职位job和部门编号 
    select ename,job,deptno from emp where deptno=20;
3. 查询职位是manager的员工姓名和职位
    select ename,job from emp where job='manager';
4. 查询部门不是10号部门的所有员工姓名和部门编号,两种方式实现
    select ename,deptno from emp where deptno!=10;
    select ename,deptno from emp where deptno<>10;
5. 查询商品表t_item 单价等于23的商品信息
    select * from t_item where price=23;
6. 查询商品表中价格不等于8443的商品信息
    select * from t_item where price!=8443;


************************
 *~~~~~~day~~~~03~~~~~*
 ************************

### and 和 or 
- and相当于 java中的 &&
- or相当于java中的||
1. 查询工资小于2000并且是10号部门的员工信息
    
    select * from emp where sal<2000 and deptno=10;
2. 查询有奖金comm 或者 工资大于3000的员工姓名,工资,奖金
    
    select ename,sal,comm from emp where comm is not null or sal>3000;
3. 查询t_item表中单价price大于500并且库存num大于100的商品信息

    select * from t_item where price>500 and num>100;

### in
- 当查询某个字段的值等于多个值的时候使用in关键字
1. 查询工资为800,3000,5000,1600的所有员工信息

    select * from emp where sal=800 or sal=3000 or sal=5000 or sal=1600;

    select * from emp where sal in (800,3000,5000,1600);
###between x and y  包含x和y
- 查询某个字段的值在两个数值之间的时候使用
1. 查询员工工资在2000至4000之间的员工信息

    select * from emp where sal between 2000 and 4000;

###练习题:
1. 查询员工表中上级领导为7698的员工姓名,工资,领导编号
    select ename,sal,mgr from emp where mgr=7698;
2. 查询没有奖金(包括null和0)并且工资低于3000的员工信息
    select * from emp where (comm is null or comm=0) and sal<3000;
3. 查询领导是7698,7902,7566 的员工信息
    select * from emp where mgr in(7698,7902,7566);
4. 查询单价小于100 或者 分类id为163的商品信息
    select * from t_item where price<100 or category_id=163;
5. 查询20号部门中工资小于3000的员工信息
    select * from emp where deptno=20 and sal<3000;
6. 查询有图片image的的商品信息
    select * from t_item where image is not null;
7. 查询部门表中 地点是new york的部门名称
    select dname from dept where loc='new york';

### like 
- 用来进行模糊查找
- _: 代表单个未知字符
- %: 代表0或多个未知字符
- 举例:
1. 以a开头的内容    a%  
2. 以a结尾的内容    %a
3. 两个字符第一个是a   a_
4. 第二个字符是a     _a% 
5. 倒数第三个字符是a   %a__
6. 包含a              %a%
- like相关案例:
1. 查询所有记事本的价格(title中包含记事本)
    select title,price from t_item where title like '%记事本%';
2. 查询单价低于100的记事本信息
    select * from t_item where price<100 and title like '%记事本%';
3. 查询单价在50到200之间的得力商品(title包含得力)
    select * from t_item where price between 50 and 200 and title like '%得力%';
4. 查询有图片的得力商品
    select * from t_item where image is not null and title like '%得力%';
5. 查询有赠品的商品信息(sell_point字段包含 赠)
    select * from t_item where sell_point like '%赠%';
6. 查询不包含得力的商品标题
    select title from t_item where title not like '%得力%';
7. 查询价格介于50到200之外的记事本信息
    select * from t_item where price not between 50 and 200 and title like '%记事本%';

###排序 order by
- order by写在where的后面如果没有where 写在表名的后面
- by后面写排序的字段名称
- 默认是升序, 也可指定升序降序: asc 升序  desc降序
- 多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。
- 案例:
1. 查询员工姓名和工资 按照工资降序排序
    select ename,sal from emp order by sal desc;
2. 查询所有的dell商品按照价格的降序排序
    select * from t_item where title like '%dell%' order by price desc;
3. 查询所有员工的姓名,工资,部门编号 按照部门编号升序排序
    select ename,sal,deptno from emp order by deptno;

4. 查询所有员工的姓名,工资,部门编号 按照部门编号升序排序如果部门一致则按照工资降序排序
    select ename,sal,deptno from emp order by deptno,sal desc;

###分页查询 limit
- limit 跳过条数,每页条数   
- limit 通常写在sql语句的最后面
- LIMIT 4 OFFSET 3 意为从行3开始取4行(这样的写法可读性更强)就像 LIMIT 3, 4 一样。
1. 查询所有商品 按照单价升序排序 查询第二页 每页7条数据

    select * from t_item order by price limit 7,7;

2. 查询工资排名前三名的三位员工的信息 
    select * from emp order by sal desc limit 0,3;
3. 查询拿最低工资的员工姓名和编号

    select ename,empno from emp order by sal limit 0,1;

4. 查询商品表中的记事本,第三页 每页两条数据;
    
    select * from t_item where title like '%记事本%' limit 4,2;

###数值计算  + - * / %     mod(7,2)等效 7%2

1. 查询员工姓名,工资,年终奖 (年终奖=月薪*5)

    select ename,sal,sal*5 年终奖 from emp;
2. 查询商品单价,库存和总金额(单价*库存)

    select price,num,price*num 总金额 from t_item;
3. 修改所有员工的工资 每人涨薪20块钱

    update emp set sal=sal+20;

####日期相关函数
- SQL的helloworld     select 'helloworld';
- 获得当前时间 年月日 时分秒  now()       
    select now();
- 获得当前年月日 current

    select curdate();
- 获得当前时分秒

    select curtime();
- 从年月日时分秒中提取年月日

    select date(now());
- 从年月日时分秒中提取时分秒

    select time(now());
- 从年月日时分秒中提取时间分量 年,月,日,时,分,秒

    select extract(year from now());
    select extract(month from now());
    select extract(day from now());
    select extract(hour from now());
    select extract(minute from now());
    select extract(second from now());

- 日期格式化  date_format(日期,格式);
    四位年 %Y   两位年  %y
    两位月 %m   一位月  %c
    日 %d
    24小时 %H   12小时 %h
    分钟 %i
    秒  %s

1. 把now() 格式改成 年月日 时分秒

    select date_format(now(),'%Y年%m月%d日 %H时%i分%s秒');
- 把非标准格式转回标准格式 str_to_date(非标准格式的字符串,格式);

1. 把 14.08.2018 09:10:20  转回标准格式
    
    select str_to_date('14.08.2018 09:10:20','%d.%m.%Y %H:%i:%s');    

###ifnull函数
- age=ifnull(x,y) 如果x的值为null则age=y,如果不为null则age=x;
1. 修改员工表的奖金,如果奖金值为null修改成0不为null则不变

    update emp set comm=ifnull(comm,0);

###聚合函数
- 对多行数据进行统计: 求和 求平均值 最大值 最小值 统计数量

- 求和  sum(字段名)
1. 查询10号部门工资总和
    
    select sum(sal) from emp where deptno=10;
    
2. 查询单价在100以内的商品库存总量

    select sum(num) from t_item where price<100;

- 平均值 avg(字段名)
1. 查询20号部门的平均工资
    select avg(sal) from emp where deptno=20;
2. 查询记事本的平均价格
    select avg(price) from t_item where title like '%记事本%';
- 最大值  max(字段名) 最小值 min(最小值)
1. 查询所有员工的最大工资和最小工资

    select max(sal),min(sal) from emp;

- 统计数量 count(字段名)  一般使用count(*)

1. 统计 工资在2000以下的员工有多少人

    select count(*) from emp where sal<2000;

###字符串相关函数
1. 字符串拼接 concat(s1,s2)   s1s2
    select concat('abc','mm');
- 查询员工姓名 和工资 在工资后面添加 元 字

    select ename,concat(sal,'元') from emp;
2. 获取字符串的长度 char_length('abc')  3
    select char_length('abc');
- 查询员工姓名和姓名的长度

    select ename,char_length(ename) from emp;
3. 获取一个字符串在另一个字符串中出现的位置

- 格式: instr('abcdefg','d')  从1开始

    select instr('abcdefg','d'); 

- 格式: locate('d','abcdefg')

    select locate('d','abcdefg');

4. 插入字符串
- 格式: insert(str,start,length,newstr);

    select insert('abcdefg',3,2,'m');
5. 转大小写 
- 格式: upper(str)   lower(str)

    select upper('Nba'),lower('CBA');

6. 从左边截取和从右边截取
- 格式: left(str,count)   right(str,count)

    select left('abcdefg',2);
    select right('abcdefg',2);
7. 截取字符串
- 格式: substring(str,start)   substring(str,start,count)

    select substring('abcdefg',2);
    select substring('abcdefg',2,3);

8. 去字符串两端的空白

- 格式: trim(str);

    select trim('    a b    ');
9. 重复
- 格式: repeat(str,count)

    select repeat('ab',2);
10. 替换
- 格式: replace(str,old,new)

    select replace('abcdefg','c','m');
11. 反转
- 格式: reverse(str)

    select reverse('abc');

###数学相关函数
- 向下取整   floor()
    select floor(3.14);
- 四舍五入 round()
    select round(3.8);
- 四舍五入指定小数位数
    select round(3.2358,2);
- 非舍五入 truncate()
    select truncate(3.2358,2);
- 随机数 rand() 0-1 不包含1
    select rand();
    0-8的随机数
    select floor(rand()*9);
    
    3-5的随机数
    0-2   +3
    select floor(rand()*3)+3;

 

 

 ************************
 *~~~~~~day~~~~04~~~~~*
 ************************


####第一节课

##分组查询

查询每个部门的最高工资

select deptno, max(sal) from emp group by deptno;

查询每个职位的平均工资

select job,avg(sal) from emp group by job;


查询每个领导手下的人数

select mgr,count(*) from emp where mgr is not null group by mgr ;


-group by sql 中的位置

select * from where ...group bu...order by...limit...;

查询每个部门的每个领导下的人数

select deptno,mgr,count(*)from emp where mgr is not null,group by deptno;

 

select job ,count(*) c,sum(sal),avg(sal) a,min(sal) from emp
where mgr is not null group by job order by c desc,a;
----where后面不能跟聚合函数
select deptno, avg(sal) s from emp group by deptno having s>2000 ;

------having 关键字要和group by结合使用 用于在SQL语句中添加聚合函数的条件

 

where后面写普通字段条件,having后面写聚合函数的条件;

查询emp表中每个部门的平均工资高于2000的部门编号,部门人数,部门工资,最后根据平均工资排序降序

 select deptno,count(*), avg(sal) from emp group by deptno having 
 avg(sal)>2000 order  by avg(sal)  desc;

select category_id,avg(price) a from t_item
group by category_id
having a<100;


select category_id,sum(num) s from t_item 
group by category_id
having s>199999;

 

查询emp表中 工资在1000-3000之间的员工,每个部门的编号,工资总和,平均工资,
过滤调平均工资低于2000的部门信息。按照平均工资升序排序

select  deptno,sum(sal) a ,avg(sal) from emp where sal
between 1000 and 3000 
group by deptno
having a>=2000
order by a;

查询emp表中名字不是以s开头,,每个职位的人数,工资总和,最高工资,过滤调
平均工资高于3000的职位,根据人数生序排序,如果一致则根据工资总和降序排序

select job,count(*) c,sum(sal) s,max(sal) from emp
where ename not like 's%'
group by job
having avg(sal)<=3000
order by c,s desc;

查询每年入职的人数
select extract(year from hiredate) year,count(*)
from emp group by year;

子查询 嵌套循环

查询emp表中最高工资的员工信息
select max(sal) from emp;
select * from emp where sal=(select max(sal) from emp);

查询工资高于20号部门平均工资的所有员工信息
select avg(sal) from emp where deptno=20;

select * from emp where sal>(select avg(sal) from emp where deptno=20);
查询和jones左相同工作的员工信息
select job from emp where ename='jones';

select * from emp where job=(select job from emp where ename='jones')and ename!='jones';

select deptno 

查询最悲惨员工(工资最低) 的同事们的信息
select min(sal) from emp ;
select deptno from emp where sal=(select min(sal) from emp);
select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp));
- 把最低工资的人去掉
select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp))and sal!=(select min(sal)from emp);

查询最后入职的员工信息
select max(hiredate)from emp;

select * from emp where hiredate=(select max(hiredate)from emp);

查询king这个哥们的部门名称是什么(dept表)

select deptno from emp where ename='king';

select dname from dept where deptno=(select deptno from emp where
ename='king');
查询名字中不含a 并且工资高于10号部门平均工资的员工信息
select avg(sal) from emp where deptno=10;

select * from emp where ename not like '%a%'
and sal>(select avg(sal) from emp where deptno=10);


查询有员工的 部门详情(需要用到部门表);


select distinct  deptno from emp ;

select * from dept where deptno in(select distinct  deptno from emp);

9.扩展:查询平均工资最高的部门信息

select * from dept where deptno 


子查询可以写在的位置:
1:写在where 或having后面 当查询条件的值
2:写在创建表的时候
子查询  创建表
create table t_emp as(select * from emp where sal<200);
3:可以写在from后面 把查询结果当成一个虚拟表***必须起别名****
select ename ,sal from(select * from emp where sal<2000) e;
mysql> select ename ,sal from(select * from emp where sal<2000) e;
+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| ALLEN  | 1600.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| TURNER | 1500.00 |
| JAMES  |  950.00 |
| MILLER | 1300.00 |
+--------+---------+
7 rows in set (0.00 sec)

####关联查询

 同时查询多张表的数据称为ie关联查询
select e.ename, d.dname
from emp e,dept d
where e.deptno=d.deptno;

2.查询每个员工的姓名 工资 部门名称 部门地点


3.查询在纽约工作的所有员工信息

select e.*

from emp e,dept d

where e.deptno=d.deptno and d.loc='new york';
4.笛卡尔积
- 如果关联查询不写关联关系 则会得到两张表数据的乘积,这个乘积称为ie笛卡尔积
  它是一个错误的执行结果。在工作中切忌不要 出现 数据量太大可能导致内存溢出
#####等值连接和内连接
- 等值连接:
    select * from A,B where A.x=B.x and A.y=xxx;

- 内连接:主要使用的对象
    select * from A join B on A.x=B.x where A.y=xxx

1.查询在纽约工作的所有员工信息

    select * 
    from emp e join dept d 
    on e.deptno=d.deptno;
    where d.loc='new york';

####外连接
- 左外连接:以join左边的表为主表 查询所有数据 右边的表只显示有关系的数据
- 右外连接:以join右边的表为主表 查询所有数据 左边的表只显示有关系的数据
    insert into emp(empno,ename,sal)values(10010,'赛亚人',500);
    
    select *
    from emp eleft join dept d
    on e.deptno=d.deptno;


 ************************
 *~~~~~~day~~~~05~~~~~*
 ************************


##表设计之关联关系
####一对一
- 什么是一对一:AB两张表,A表中的一条数据对应B表中的一条数据,同时B表的一条数据对应A表中的一条数据,此时两张表的关系称为一对一关系。
- 应用场景:商品表和商品详情表, 用户表和用户信息扩展表
- 主键是表示数据唯一性的 外键是用来建立关系的
- 如何让两张表建立关系? 在从表中添加一个外键指向主表的主键。
- 练习: 创建user表和userinfo表
    user: id int, username varchar(10)  password varchar(10)
    userinfo:nick varchar(10),qq varchar(10),phone varchar(15),uid int
    保存以下数据:
    1 libai admin  李白  66668888  13838383388
    2 liubei 123456 刘备 3334444      1333333333
- 创建表:
    create table user(id int primary key auto_increment,username varchar(10),password varchar(10));
    create table userinfo(nick varchar(10),qq varchar(10),phone varchar(15),uid int);
    insert into user values (null,'libai','admin'),(null,'liubei','123456');
    insert into userinfo values('李白','66668888','13838383388',1),('刘备','3334444','1333333333',2);
1. 查询李白的用户名和密码
    select u.username,u.password
    from user u join userinfo ui
    on u.id=ui.uid
    where ui.nick='李白';
2. 查询每个用户的用户名和昵称
    select  u.username,ui.nick
    from user u join userinfo ui
    on u.id=ui.uid;
3. 查询 liubei的所有数据
    select *
    from user u join userinfo ui
    on u.id=ui.uid
    where u.username='liubei';
####一对多
- 什么是一对多:AB两张表 A表中的一条数据对应B表中的多条,同时B表中的一条数据对应A表中的一条,此时两张表的关系为一对多。
- 应用场景: 部门表和员工表, 分类表和商品表, 用户表和收货地址表
- 如何建立关系:在两张表中多的表中添加外键指向另外一张表的主键。

- 练习: 创建员工表和部门表  emp dept    创建db5  utf8 并使用
- 保存以下数据:
    保存盘丝洞的妖怪部门的白骨精 年龄28 工资3000 蜘蛛精 年龄32 工资2000
    美国的英雄部门 钢铁侠 年龄45 工资8888 美国队长 年龄252 工资6000 
    日本的海贼部门 路飞 年龄18 工资100 娜美 年龄20 工资500
    
    create table emp(id int primary key auto_increment,name varchar(10),age int,sal int,deptid int);
    create table dept(id int primary key auto_increment,name varchar(10), loc varchar(10));
    
    insert into dept values(null,'妖怪部','盘丝洞'),(null,'英雄部','美国'),(null,'海贼部','日本');
    insert into emp values(null,'白骨精',28,3000,1),(null,'蜘蛛精',32,2000,1),(null,'钢铁侠',45,8888,2),(null,'美国队长',252,6000,2),(null,'路飞',18,100,3),(null,'娜美',20,500,3);

1. 查询每个员工姓名 工资 部门名称
    select e.name,e.sal,d.name
    from emp e join dept d
    on e.deptid=d.id;
2. 查询路飞的工资和工作地点
    select e.sal,d.loc
    from emp e join dept d
    on e.deptid=d.id
    where e.name='路飞';
3. 查询英雄部门的所有员工信息 
    select e.*
    from emp e join dept d
    on e.deptid=d.id
    where d.name='英雄部';
####多对多
- 什么是多对多:AB两张表:A表中一条数据对应B表中多条数据,同时B表中一条数据对应A表中的多条数据,称为多对多
- 场景: 老师表和学生表
- 如何建立关系:创建中间关系表 在关系表中添加两个外键指向两个表的主键
- 练习:        
1. 创建两张表主表 teacher(id,name) 和 student(id,name)
    create table teacher(id int primary key auto_increment,name varchar(10));
    create table student(id int primary key auto_increment,name varchar(10));
2. 创建一个关系表 t_s(tid,sid)
    create table t_s(tid int,sid int);
3. 插入以下数据     
    传奇老师:刘德华 张学友            
    苍老师:刘德华 张学友 小明 小红
    insert into teacher values(null,'传奇老师'),(null,'苍老师');
    insert into student values(null,'刘德华'),(null,'张学友'),(null,'小明'),(null,'小红');
    insert into t_s values(1,1),(1,2),(2,1),(2,2),(2,3),(2,4);
4. 查询每个学生对应的老师姓名
    select s.name,t.name
    from student s join t_s ts
    on s.id=ts.sid
    join teacher t
    on t.id=ts.tid;
5. 查询刘德华的老师姓名
    select t.name
    from student s join t_s ts
    on s.id=ts.sid
    join teacher t
    on t.id=ts.tid 
    where s.name='刘德华';
6. 查询苍老师的学生信息
    select s.name
    from student s join t_s ts
    on s.id=ts.sid
    join teacher t
    on t.id=ts.tid 
    where t.name='苍老师';

###自关联
- 什么是自关联: 当前表的外键指向自己表的主键这种称为自关联
- 应用场景:用于保存有层级关系,并且不确定有多少层的数据,如:员工和上级领导, 部门和上级部门,分类和上级分类。 
- 可以保存一对一或一对多的数据 

###连接方式和关联关系的区别
- 连接方式: 包括等值连接、内连接、外连接,是指关联查询的查询方式
- 关联关系: 指表设计时两张表之间存在的逻辑关系包括 一对一,一对多和多对多
####表设计案例:权限管理
1. 创建三张主表,用户表user:id,name 角色表role:id,name 权限表module:id,name
    create table user(id int primary key auto_increment,name varchar(10));
    create table role(id int primary key auto_increment,name varchar(10));
    create table module(id int primary key auto_increment,name varchar(10));
2. 创建两张关系表: 用户-角色关系表 u_r:uid,rid  角色-权限关系表 r_m:rid,mid
    create table u_r(uid int, rid int);
    create table r_m(rid int, mid int);
3. 用户表插入:刘德华、张学友、凤姐
    insert into user (name) values('刘德华'),('张学友'),('凤姐');
4. 权限表插入: 男浏览、男评论、男发帖、男删帖,女浏览、女评论、女发帖、女删帖
    insert into module (name) values('男浏览'),('男评论'),('男发帖'),('男删帖'),('女浏览'),('女评论'),('女发帖'),('女删帖');
5. 角色表插入:男会员、男管理员、女游客、女会员
    insert into role (name) values ('男会员'),('男管理员'),('女游客'),('女会员');
6. 角色和权限 保存以下关系 男会员对应权限:男浏览,男评论,男发帖;  男管理员对应权限:男浏览、男评论、男发帖、男删帖;女游客对应权限:女浏览;女会员对应权限:女浏览,女评论,女发帖
    insert into r_m values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(2,4),(3,5),(4,5),(4,6),(4,7);
7. 用户和角色 保存以下关系 刘德华 男会员,张学友男管理员,凤姐女会员和男会员.
    insert into u_r values(1,1),(2,2),(3,4),(3,1);
8. 查询刘德华所拥有的权限名称
    - 1. 子查询
    - 得到刘德华的id 
      select id from user where name='刘德华'
    - 通过用户id 得到对应的角色id
      select rid from u_r where uid=(select id from user where name='刘德华');
    - 通过角色id找到对应的权限id
      select mid from r_m where rid in (select rid from u_r where uid=(select id from user where name='刘德华'));
    - 通过权限id 得到权限的名字
      select name from module where id in (select mid from r_m where rid in (select rid from u_r where uid=(select id from user where name='刘德华')));
    - 2. 内连接
    select m.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on rm.rid=ur.rid
    join module m
    on rm.mid=m.id
    where u.name='刘德华';
9. 查询拥有男浏览权限的用户有哪些
    select u.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on rm.rid=ur.rid
    join module m
    on rm.mid=m.id    
    where m.name='男浏览';
10. 查询每个用户拥有的权限名称
    select u.name,m.name
    from user u join u_r ur
    on u.id=ur.uid
    join r_m rm
    on rm.rid=ur.rid
    join module m
    on rm.mid=m.id;

 

 

 ************************
 *~~~~~~day~~~~06~~~~~*
 ************************

###视图
- 什么是视图: 数据库中存在的表和视图都是其内部的对象,视图可以理解成是一个虚拟的表,数据来自原表,视图本质上就是取代了一段sql语句
- 为什么使用视图:因为有些数据查询的SQL语句比较长,每次书写比较麻烦,使用视图可以起到sql语句重用的作用,提高开发效率,可以隐藏敏感信息

- 格式: create view 视图名 as 子查询;
    -创建10号部门员工的视图
    create view v_emp_10 as (select * from emp where deptno=10);
    -创建没有工资的员工的信息
    create view v_emp_nosal as (select ename,job,deptno,mgr from emp);
- 练习:
1. 创建部门为20号部门并且工资小于3000的视图
    create view v_emp_20 as (select * from emp where deptno=20 and sal<3000);
2. 创建每个部门平均工资,工资总和,最大工资,最小工资的视图
    create view v_emp_info as (select deptno,avg(sal),sum(sal),max(sal),min(sal) from emp group by deptno);
####视图分类
- 简单视图: 创建视图的子查询中 不包含去重、函数、分组、关联查询的视图称为简单视图,简单视图可以对数据进行增删改查操作
- 复杂视图: 包含去重、函数、分组、关联查询的视图称为复杂视图,一般只进行查询操作。
####对视图中的数据进行增删改查
- 视图的操作方式和表的方式一样
1. 插入数据
    insert into v_emp_10 (empno,ename,deptno) values (10001,'钢铁侠',10);//原表中有  视图中有
    insert into v_emp_10 (empno,ename,deptno) values (10002,'葫芦娃',20);//原表中有  视图中没有  
- 往视图中插入一条 视图中不可见但是在原表中存在的数据 称为数据污染
- 解决数据污染: 在创建视图的时候添加 with check option 关键字
    
    create view v_emp_30 as (select * from emp where deptno=30) with check option;
    insert into v_emp_30 (empno,ename,deptno) values (10003,'蜘蛛侠',20);//报错
    insert into v_emp_30 (empno,ename,deptno) values (10004,'嘻哈侠',30);//成功
2. 修改数据 只能修改视图中存在的数据

    update v_emp_30 set ename='煎饼侠' where empno=10004;
    
    update v_emp_30 set ename='葫芦娃' where empno=10001;

3. 删除数据 只能删除视图中存在的数据

    delete from v_emp_30 where empno=10004;//视图中存在,成功
    delete from v_emp_30 where empno=10001;//视图中不存在,不成功

####修改视图
- 格式: create or replace view 视图名 as 子查询;
    create or replace view v_emp_20 as (select * from emp);
####删除视图

    drop view v_emp_20;

####视图别名
- 如果创建视图的时候使用了别名 则后面的各种操作只能使用别名

    create view v_emp_20 as (select ename name,sal from emp);

    update v_emp_20 set name='aaaa' where name='钢铁侠';//成功!
    update v_emp_20 set ename='aaaa' where ename='钢铁侠';//失败!

###约束
- 什么是约束: 约束是给表字段添加的限制条件
####非空约束 not null
- 限制字段的值不能为null 

        create table t1(id int,age int not null);
        
        insert into t1 values (1,20);//成功!
        insert into t1 values (2,null);//失败
####唯一约束 unique
- 限制字段的值不能重复

        create table t2(id int,age int unique);
        insert into t2 values(1,20);//成功!
        insert into t2 values(2,20);//失败
####主键约束 primary key 
- 限制字段值唯一并且非空
- 创建表时添加:

        create table t_pri(id int primary key auto_increment);
- 创建表后添加主键约束:

        create table t_pri2(id int);

        alter table t_pri2 add primary key (id);

- 删除主键约束

        alter table t_pri2 drop primary key;
        desc t_pri2;
####默认约束 default
- 给字段添加默认值,当字段不赋值的时候 此约束的值生效

        create table t3(id int,age int default 20);

        insert into t3 values (1,88);
        insert into t3 (id) values (2);
        insert into t3 values (3,null);
####检查约束 check  mysql中没有效果 但是语法不报错

        create table t4(id int,age int check(age>10));

####外键约束
1. 字段的值可以为null,可以重复,但是不能是不存在的值
2. 被依赖的数据不能先删除
3. 被依赖的表不能先删除

- 测试外键约束
1. 创建部门表
    create table dept(id int primary key auto_increment,name varchar(10));
    create table emp(id int primary key auto_increment,name varchar(10),deptid int,constraint fk_dept foreign key(deptid) references dept(id));
    - 格式: 在创建表最后一个字段后面添加   constraint 约束名 foreign key (外键字段名称) references 被依赖的表名(被依赖的字段名)

- 插入数据 
    insert into dept values(null,'神仙'),(null,'妖怪');
    -测试:
    insert into emp values(null,'悟空',1); //成功!
    insert into emp values(null,'赛亚人',3);//失败! 不存在的数据
    delete from dept where id=1;//失败  被关联的数据
    
###索引
- 什么是索引: 索引是数据库中用来提高查询效率的技术,类似于目录。
- 为什么使用索引: 如果不使用索引,查询数据时会依次遍历每一个保存数据的磁盘块,直到找到目标数据为止,使用索引后,磁盘块会以树状结构保存,查询数据时会大大降低磁盘块的访问量,从而提高查询效率。
- 原理图
![](01.png)
- 索引是越多越好吗?
    因为索引会占用储存空间,只对常用的查询字段创建索引。
- 有索引就一定好吗?
    如果数据量小的话 添加索引反而会降低查询效率。
- 索引的分类(了解)
1. 聚集索引(聚簇索引): 通过主键创建的索引称为聚集索引,一个表只能有一个聚集索引,添加了主键约束的表会自动创建聚集索引,聚集索引的树状结构中保存了数据

2. 非聚集索引: 通过非主键字段创建的索引称为非聚集索引,一个表可以有多个,树状结构中不保存数据只保存指针(磁盘块地址)


####导入索引测试数据
1. linux系统  把文件解压到桌面
    在终端中连接数据库 使用db6 执行 
        source /home/soft01/桌面/item_backup.sql;
2. window系统 把文件解压到D盘根目录
    在命令行中执行
        source d:/item_backup.sql;
-测试:
1.    show tables; //看 是否有item2
2.    select count(*) from item2; //查看是否是172万多条数据
3.  select * from item2 where title='100';
    //看查询时间是多少? 1.15秒 
####如何创建索引 
- 格式: create index 索引名 on 表名(字段名(长度));
    -给title字段添加索引
        create index index_item2_title on item2(title);
    -再次查询看时间多少? 0.04秒 提高近30倍
        select * from item2 where title='100';
 
####查看索引
    show index from item2;
####删除索引
    -格式:drop index 索引名称 on 表名;

    drop index index_item2_title on item2;
####复合索引
- 通过多个字段创建的索引称为复合索引
- 应用场景:频繁使用某几个字段作为查询条件的时候,可以为这几个字段创建复合索引
- 创建 标题和价格的索引:

    create index index_item2_title_price on item2(title,price);

####索引总结
1. 索引是提高查询效率的技术
2. 索引占存储空间不是越多越好
3. 数据量小时使用索引会降低效率
4. 聚集索引:只有一个 添加主键约束后自动创建,保存数据
5. 非聚集索引:多个 非主键字段创建  没有数据只保存指针
6. 尽量不要在频繁修改的表上面添加索引

###事务
- 数据库中执行SQL语句的工作单元,不可拆分,可以保证同一业务中的所有SQL语句全部成功或全部失败
#### 事务的ACID特性
- Atomicity:原子性,最小不可拆分,保证全部成功,全部失败
- Consistency:一致性,从一个一致状态到另一个一致状态 
- Isolation:隔离性, 多个事务之间互不影响
- Durability:持久性,事务完成后数据提交到数据库文件中 持久保存
#### 事务相关指令
    show variables like '%autocommit%';
    set autocommit=0/1;
    commit;
    rollback;
    savepoint s1;
    rollback to s1;

 

 

            JDBC
##JDBC
### 什么是JDBC
- Java Database Connectivity 数据库连接 ,实际是java中一套和数据库交互的api
应用程序编程接口
   java程序员需要连接多种数据库,为了避免每一个数据库都学习一套新的api sun公司提出了一个jdbc接口,各种数据库厂商根据此接口写实现类(驱动),这样java程序员只需要掌握JDBC
接口中的一套方法,就可以访问任何数据库。
(用JAVA语言访问数据库的一套API)

###如何使用JDBC
1. 创建maven工程
2. 下载mysql相关jar包

        登录达内私服:maven.tedu.cn
        
            MySQL
            mysql-connector-java
            5.1.6
        

##JDBC
###什么是JDBC
- Java DataBase Connectivity,java数据库连接,实际上jdbc是java中的一套和数据库交互的api(application program interface 应用程序编程接口)
###为什么使用JDBC
![](01.png)
- 因为java程序员需要连接多种数据库(orcale,mysql,db2等)为了避免每一个数据库都学习一套新的api,sun公司提出了一个jdbc接口,各个数据库厂商根据此接口写实现类(驱动),这样java程序员只需要掌握JDBC接口中的一套方法,就可以访问任何数据库。
###如何使用JDBC
1. 创建maven工程
2. 下载mysql相关jar包 

    登陆达内的私服:maven.tedu.cn

    登陆阿里私服:maven.aliyun.com

    - 首页搜索栏输入mysql 搜索
    - 找到5.1.6版本 复制坐标 到自己工程的pom.xml文件里
3. 创建JDBCDemo1.java类 添加main方法
4. 使用步骤:
    - 注册驱动
    - 获取连接对象
    - 创建sql执行对象
    - 执行sql语句
    - 关闭资源
    
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn = 
                DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/db3", 
                        "root", "root");
        //3.创建sql执行对象
        Statement stat = conn.createStatement(); statement<有陈述,说明的意思>
        //4.执行sql
        stat.execute("drop table if exists jdbct2");
        execute /ˈeksɪkjuːt; 执行; 实行
        System.out.println("删除成功!");
        //5. 关闭资源
        stat.close();
        conn.close();
- DriverManager 驱动管理
- Connection 连接接口
- Statement 语句管理
- ResultSet 结果集接口

####执行sql的方法
- execute(sql) 可以执行任意sql,但是推荐执行DDL
    返回值为boolean值 true代表有结果集 false代表没有结果集,成功或失败通过是否有异常来判断
- executeUpdate(sql) 推荐执行DML
    返回值为int 代表生效行数
- executeQuery(sql)推荐执行DQL

    insert into jdbct1 values(2,'Jerry'),(3,'李白');
    
    返回值ResultSet 里面装了查询结果
    next()方法的作用:判断有没有下一条数据有返回值为true(同时游标往下移动) 没有则false

            //4.执行sql
                ResultSet rs = 
                        stat.executeQuery("select * from jdbct1");
                    //遍历结果
                    while(rs.next()){
                        int id = rs.getInt("id");
                        String name = rs.getString("name");
                        System.out.println(id+":"+name);
                    }

###数据库类型和Java类型对比
        mysql             java
        int              getInt
        varchar          getString
        float/double     getFloat/getDouble
        datetime/timestamp   getDate
###ResultSet获取数据的方式
1. 通过字段名获取  如:getString("name")
2. 通过查询到结果数据的位置获取 如:getString(2); 位置从1开始

###读取配置文件


                //创建读取配置文件的对象
                Properties prop = new Properties();
                //获取文件输入流
                InputStream ips = 
                        DBUtils.class.getClassLoader()
                        .getResourceAsStream("jdbc.properties");
                //把文件加载到对象中
                try {
                    prop.load(ips);
                    //读取连接数据库的信息
                    driver = prop.getProperty("driver");
                    url = prop.getProperty("url");
                    username = prop.getProperty("username");
                    password = prop.getProperty("password");
                } catch (IOException e) {
                    e.printStackTrace();
                }

###数据库连接池
- DBCP DataBase Connection Pool:数据库连接池
- 为什么使用:如果没有连接池,每一次业务都需要和数据库服务器建立一次连接,业务处理完断开连接,如果有上万次业务就会有上万次的开关连接,频繁开关连接非常浪费资源,使用数据库连接池,可以设置几个初始连接,如果有业务需要使用连接,则从连接池中直接获取,如果连接池中连接用光,则会等待连接归还后再获取连接

- 如何使用:
1. 下载jar包: 从maven私服中搜索 dbcp
        
            commons-dbcp
            commons-dbcp
            1.4
        

2. 代码:
    private static BasicDataSource dataSource;
        static{//为保证只有一个连接池,所以放在静态块中
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/db3");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        //3. 设置连接池策略信息
        dataSource.setInitialSize(3);//初始连接数量
        dataSource.setMaxActive(5);//最大连接数量
        
        //4.从连接池中获取连接对象
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
    }

###解决jdbc乱码问题
在url后面添加如下内容
jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=UTF-8

    
    
        登录阿里云私服:maven.aliyun.com

        - 首页搜索栏输入 mysql搜索
        - 找到5.1.6版本复制坐标 到自己的pom.xml文件里
3. 创建JDBCDemo1.java类 添加main方法
4. 使用步骤:
    - 注册驱动
    - 获取连接对象
    - 创建sql执行对象
    - 执行sql语句
    - 关闭资源
    
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection conn = 
                DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/db3", 
                        "root", "root");
        //3.创建sql执行对象
        Statement stat = conn.createStatement();
        //4.执行sql
        stat.execute("drop table if exists jdbct2");
        System.out.println("删除成功!");
        //5. 关闭资源
        stat.close();
        conn.close();
       
 

你可能感兴趣的:(内功修炼-java基础)