存档九月 2023

Mysql 数据库操作





Mysql 数据库操作         - 2023.9.16 -




DDL  数据定义语言  create 创建  alter 修改表(增加列 删除列等) dorp 删除 rename 重命名 truncate清空(有表结构)    
DML  数据操作语言  insert 增加  delete 删除         update 修改数据(某一个具体的值)   select 查询   
DLC  数据控制语言  commit 提交  rollback 回滚 撤销  savepoint 保存点  grant设置权限   revoke回收权限
DQL  数据查询语言  select 查询  

一. DDL: 数据库设计   // database  可以替换成 schema

    ❶. 对数据的操作   增 删 改 查

        show databases;                         // 查询所有数据库 
        create database db01;                   // 创建数据库
        create database if not exists db01;     // 如不不存在则创建
        use db01;                               // 使用数据库 db01
        select database();                      // 查看当前操作的数据库  函数的调用形式    
        drop database db01;                     // 删除数据库
        drop database if exists db01;           // 如果存在
        show tables;                            // 查看表
        desc tb_emp;                            // 查看某一个 表的 结构
        show create table tb_emp;               // 查看 表的 建表语句

    ❷. 对表的操作    增 删 改 查

      ①. 创建表      // 注意:最后一个字段后面 没有,逗号  []方括号内容 可写可不写
        create table 表名(
            字段1 字段类型 [约束] [comment '字段1注释'],
            ...
            字段n 字段类型 [约束] [comment '字段n注释']
        )
        create table user2(
             id int primary key auto_increment comment 'id,唯一标识',
             username varchar(20) not null unique comment '用户名',
             name varchar(10) not null comment '姓名',
             age int comment '年龄',
             gender char(1) default '男' comment '性别'
        )
        约束: 约束是作用于表中字段上的规则,用于限制存储在表中的数据 保证数据库中数据的正确性 有效性 完整性
              约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
            not null        非空约束    限制该字段不能为null
            unique          唯一约束    保证字段的所有数据都是唯一、不重复的
            primary key     主键约束    主键是一行数据的唯一标识,要求非空且唯一
                primary key auto_increment  从 1 自动增长
            default         默认约束    保存数据时,如果未指定该字段值,则采用默认值   default '指定的默认值'
            foreign key     外键约束    让两张表的数据建立连接,保证数据的一致性和完整性
        
      ②. 修改表结构  删除表

        1. 添加字段  alter table 表名 add 字段名  类型(长度) [comment '注释'] [约束];
            alter table tb_emp add qq varchar(10) comment 'QQ';      // 为表 tb_emp 添加字段qq varchar(11)
        2. 修改字段类型  alter table 表名 modify 字段名 新数据类型(长度);
            alter table tb_emp modify qq varchar(13) comment 'QQ'     // 修改 表 tb_emp qq的字段类型 varchar(13)
        3. 修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型(长度) [comment '注释'] [约束]
            alter table tb_emp change qq qq_num varchar(13) comment 'QQ';
        4. 删除字段  alter table 表名 drop column 字段名;
            alter table tb_emp drop column qq_num;
        5. 修改表名  rename table  表名 to 新表名;
            rename table tb_emp to emp;
        6. 删除表中 自动增长  auto_increment   表中 自动增长字段 只能有一个 必须是主键
            alter table tb_emp modify id int;
        7. 删除表中主键  alter table 表名 drop primary key;      // 如果 表中有 自动增长属性 先要删除 自动增长属性
            alter table tb_emp drop primary key;                // 
        8. 给表的字段 增加主键 alter table tb_emp add primary key(字段1,字段2);    // 主键可以有多个
            alter table tb_emp add primary key (id);            // 这里只添加了一个
        9. 给表的主键 字段设置 自动增长 alter table 表名 modify 字段名 int auto_increment;
            alter table tb_emp modify id int auto_increment;    // 设置 自动增长
            alter table emp01 auto_increment = 1;               // 设置 自动增长 为 1  默认为1

二. DML: 数据操作语言

    ❶. 添加数据    insert into 表名(字段列表) values (字段值列表);
        1. 指定字段添加数据  insert into 表名(字段1,字段2) values ('值1','值2');
            insert into tb_emp(username,name,gender,create_time) values ('janice','小龙女',now(),now());
            insert into tb_emp(id,username,name,gender,create_time) values (null,'janice','小龙女','2020-02-05',now());
        2. 全部字段添加数据  insert into 表名 values('值1','值2');
        3. 批量添加数据(指定字段)  insert into 表名(字段1,字段2) values ('值1','值2'),('值1','值2');
        4. 批量添加数据(全部字段)  insert into 表名 values ('值1','值2'),('值1','值2');

        注: 赋值的时候 字符串 和 时间 要加 单引号
            如果给 自动增长的主键赋值的时候  null 即可
            now()  函数  获取系统当前时间

    ❷. 修改数据     update 表名 set 字段名=字段值 [where 条件];
        1. 修改表中的数据 单个字段  update 表名 set 字段1=值1, 字段2=值2 [where 条件];
            update tb_emp set name='任盈盈' where id = 18;
        2. 修改表中 某个字段的所有数据 update 表名 set 字段1=值1;
            update tb_emp set qq = '113487606';     // 修改所有数据 不用加where 但是会有黄色的提示 点击确认修改Execute即可

    ❸. 删除数据     delete from 表名 [where 条件];
        删除一行数据  delete from 表名 [where 条件];
            delete from tb_emp where id = 17;
        删除表中所有数据  delete from 表名;     会有黄色的提示
            delete from tb_emp; 

三. DQL: 查询语句 数据库查询
    
    ❶. 基本查询
        select      字段列表
        from        表名列表         基本查询
        where       条件列表         条件查询
        group by    分组字段列表     分组查询
        having      分组后条件列表
        order by    排序字段列表     排序查询
        limit       分页查询         分页查询

        select 1;
        select 1 + 1;
        select 3 * 2 from dual;    // dual 是个 伪表 不存在的 只是为了结构完整
        select * from employees;   // * 代表 表中的所有的字段或列

        ①. 查询多个字段  select 字段1,字段2,字段3 from 表名;
            select name,entrydate from tb_emp;

        ②. 查询所有字段(通配符)  select * from 表名;
            select * from  tb_emp;

        ③. 别名 as   可加在 字段名  表名
            加双引号   不要加单引号(虽然也好使,只不过sql语言不那么敏感)  as   alisa缩写   as可以省略
            select 字段1 [as 别名1], 字段2[as 别名2] from 表名;
            最好加双引号 代表一个整体   不要加单引号(虽然也好使,只不过sql语言不那么敏感) as是alisa缩写  as可以省略

            select name as 姓名, entrydate as 入职日期 from tb_emp;
            select student_id "stu" from user "u"
            select student_id as stu from user as u

        ④. 去重 distinct        在字段前面加  表示 去重复 该字段
            select distinct 字段列表 from 表名;
            select distinct job from tb_emp;
            select distinct sutdent_id from user           // 去重复 sutdent_id 字段
            select distinct sutdent_id, salary from user   // 去重复 sutdent_id和salary 整体去重

        ⑤. 空值:  null为空值  null参与计算  计算值为 null
            ifnull(salary,0)  如果salary值不是空值,用salary,如果是空值用0计算

        ⑥. 着重号:  ` `     反引号  当出现字段跟系统关键字冲突时候 加 着重号

        ⑦. 查询常数
            select '哈哈',123,student_id from user         // '哈哈'和123为常数 的会给每一行都加一个 123

        ⑧. 显示表结构 describe 或 desc
            describe user;        // 查看 user 的表中 字段的 详细信息
            desc user;            // 作用同上
                Type   null   Key   Default   Extra

        ⑨. 过滤 数据  where      where关键字紧跟在from后面
            select * from cust_user_info where parent_id = 41       // where 是条件

    ❷. 聚合函数: 将一列数据作为一个整体,进行纵向计算

        select 聚合函数(字段列表) from 表名

        count(*)         统计数量     不对 null 值 进行计算
        count(cust_id)   计数
        max()            最大值
        min()            最小值
        avg()            平均值
        sum()            求和
        select count(*) from tb_emp;                      // 结果跟上面都一样 推荐使用 count(*)
        select count(*) from shop_order_addr;             // 这个表一共多少行
        select count(*) as addr from shop_order_addr;     // as 换个名 addr 
        select count(*) from `shop_order_addr` where province_code > 60;  // where 是条件 查询 province_code > 60 有多少
        select AVG(cust_id) from shop_order_addr;

        select min(entrydate) from tb_emp;  // 查询 最早入职时间  查询 最小值
        select max(entrydate) from tb_emp;
        select avg(id) from tb_emp;
        select sum(id) from tb_emp;
        select count(id) from tb_emp;    
        select count(1) from tb_emp;        // 1  和 a 都是常量  结果和 字段一样
        select count("a") from tb_emp;

    ❸. 分组查询  group by   可以把有共性的字段整合起来
        group by     在分组查询中, 主要查询一类是: 分组字段    另外一类是聚合函数
        having       分组之后的查询条件
        select 字段列表 from 表名[where 条件] group by 分组字段名 [having 分组后过滤条件];
        select gender,count(*) from tb_emp group by gender;       // 查询男 和女 分别有多少人
        select job,count(*) from tb_emp where entrydate <= "2015-01-01" group by job;   // 查询2015年前入职 各职位的人数
        select job,count(*) from tb_emp where entrydate <= "2015-01-01" group by job having count(*) >= 2; // 大于等于2
        select receiver, count(*) from shop_order_addr group by receiver;
            // 根据 GROUP BY receiver 此字段属性 每个receiver属性 有多少个
                第一列receiver      第二列COUNT计数
        select receiver, mobile, count(*) from shop_order_addr group by receiver, mobile;
            // 查询receiver和mobile两个字段 . 完全相同则计数   不相同单独计数

    ❹. 排序查询  order by
        order by   排序    默认是 升序 asc    没有加规则就是 asc  asc可以省略
            asc  升序 默认值
            desc 降序
        select 字段列表 from 表名 [where 条件列表] [group by 分组字段] order by 字段1 排序方式, 字段2 排序方式;
            select * from tb_emp order by entrydate desc;                // 安装入职时间 进行降序
            select * from tb_emp order by entrydate, update_time desc;   // 按照入职时间 升序 如果相同 在安装 更新时间 降序
            select * from cust_user_info order by parent_id;
            select * from cust_user_info order by parent_id desc;
            select * from cust_user_info where level = 10 order by parent_id desc;
            select * from cust_user_info where level = 10 order by parent_id desc, lft; // 按parent_id 降序 在按lft 升序
            select * from cust_user_info where level = 10 order by parent_id desc, lft desc;//按parent_id 降序在按lft降序

    ❺. 分页查询  limit
        # select * from user limit 0,10;    // 显示 前十条数据  每页 10条数据
        # select * from cust_user_info where level = 10 order by parent_id desc, lft desc limit 0,10;
        limit 10,10      // 从第11条数据开始 显示 10条    第二页
        limit 20,10      // 第三页
        limit 10         // 如果 位置偏移量是0的时候  可以简写 0可以省略
        limit 位置偏移量,条目数
        公式: limit(pageNo - 1) * pageSize,pageSize
        limit 2  offset 31  //  mysql8.0中的语句  加入了 offse关键字  offset后面跟偏移量 从第32条显示 2条数据
        select * from cust_user_info where level = 10 order by parent_id desc, lft desc limit 2 offset 10;
        select 字段列表 from 表名 limit 起始索引,查询记录数;  // 起始索引从0开始  起始索引 = (页码 -1) * 每页展示记录数
        select * from tb_emp limit 0,10;
        select * from tb_emp limit 10;    // 如果查询的是第一页数据,起始索引可以省略 简写成 limit 10;

    ❻. 条件判断 if(gender = 1, '男','女')
        select gender,count(*) from emp group by gender;
        select if(gender =1,'男','女') as 性别,count(*) from emp group by gender;      // 在gender 加入了条件判断

    ❼. 流程控制 case 表达式 when 值1 then 结果1 when 值2 then 结果2 ... else ... end
        select job,count(*) from tb_emp group by job;
        select
            (case job when 1 then '班主任' when 2 then '讲师' when 3 then '学工主管' 
            when 4 then '教研主管' else '未分配职位' end)as 职位,
            count(*)
        from tb_emp group by job;


四. 表结构设计

    一对多的的关系: 父表是1 子表是多
    部门表是父表    员工表是子表
    一对多关系实现: 在数据库表中多的一方,添加字段,来关联一的一方的主键

    ❶. 外键约束
        物理外键
            创建表时指定
                create table 表名(字段名 数据类型, [constraint] [外键名称] foreign key(外键字段名) references 主表(字段名));
            建立完表后,添加外键
                alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(字段名);
        逻辑外键 在业务逻辑中, 解决外键关联

    ❷. 连接查询
        内连接: 相当于查询A  B交集部分数据 ... 内连接无联系数据不显示

          隐式内连接: select 字段列表 from 表1,表2 where 条件;
            select * from emp,dept where dept.id = emp.dept_id;
            select dept.name,emp.name from emp,dept where dept.id = emp.dept_id;
            select d.name,e.name from emp as e ,dept as d where d.id = e.dept_id;  // 使用别名后 不能以在用表.字段调用 
          显示内连接: select 字段列表 from 表1[inner] join 表2 on 连接条件;  // inner 可以省略            要一直使用别名
            select * from emp inner join dept on emp.dept_id = dept.id;
            select emp.name,dept.name from emp inner join dept on emp.dept_id = dept.id;

        外连接:       外连接一定显示主表   left左表    right右表
            左外连接   以表1 为准  select 字段列表 from 表1 left [outer] join 表2 on 连接条件;
            右外连接   以表2 为准  select 字段列表 from 表1 right [outer] join 表2 on 连接条件;
                select * from emp left join dept d on d.id = emp.dept_id

    ❸. 子查询 sql 语句中的嵌套 select 语句 成为 嵌套查询 又称 子查询
       子查询外部的语句可以是 insert  update delete select 的任何一个 最常见的事select

        标量子查询 select * from 表1 where 字段1 = (select 字段1 from 表2);
            select id from dept where name = '教研部';            // 两个查询 合并成 一个查询
            select name,dept_id from emp where dept_id =2;                                 // ↓↓查询 在方东白 之后入职的
            select name,dept_id from emp where dept_id =(select id from dept where name = '教研部';); // 查询教研部所有人
            select name,entrydate from emp where entrydate >= (select entrydate from emp where name = '方东白');

        列子查询  常用的操作符:  =    <>    in    not in
            用于查询一个字段中 某些筛选数据  
            select * from 表1 where  字段0 in (select 字段0 from 表2 where 字段1 = '值1' or 字段1 = '值2');
            select id from dept where name = '教研部' or name = '咨询部';      // 查询 教研部和咨询部所有的员工信息
            select name,dept_id from emp where  dept_id in (select id from dept where name = '教研部' or name = '咨询部');

        行子查询 子查询返回的结果是一行(可以是多列)   常用的操作符:  =    <>    in    not in
            用于查询 与某一个字段 的其他属性相同的 其他数据
            select * from 表名 where (字段1,字段2) = (select 字段1,字段2 from 表名 where 字段0 = '字段0);
            select dept_id,entrydate from emp where name = '韦一笑';    
            select * from emp where entrydate = (select entrydate from emp where name = '韦一笑') 
                and job = (select job from emp where name = '韦一笑');       // ↓查询与韦一笑在一个部门同时入职的员工
            select * from emp where (entrydate,job) = (select entrydate,job from emp where name = '韦一笑'); 

        表子查询  把查询的 信息 作为一张表使用 放到 from 后
            select * from (select * from emp where entrydate > '2013-01-01') e, dept d where e.dept_id = d.id;

    ❹. 事物  就是 开启了 撤销模式  在开启事务后执行的代码并没有真正提交 只有commit后才是真正提交  可以回滚
        开启事务: start transaciton;  /   begin;
        提交事务: commit;
        回滚事务: rollback;


五. 数据类型

    ❶. 数值类型
          类型   大小(byte)   有符号(SIGNED)范围  无符号(unsigned)范围   描述       // ↓在类型后面使用 unsigned 使用无符号
        tinyint    1  (-128,127)                 (0,255)         小整数值    tinyint unsigned . 
        smallint   2  (-32768,32767)             (0,65535)       大整数值    smallint unsigned
        mediumint  3  (-8388608,8388607)         (0,16777215)    大整数值    ...
        int        4  (-2147483648,2147483647)   (0,4294967295)  大整数值    ... 
        bigint     8  (-2^63,2^63-1)             (0,2^64-1)      极大整数值  ...                   // ↓2 表示小数位个数
        float      4  (-3.40 E+38,3.40 E+38)  0  (1.17 E-38,3.40 E+38)  单精度浮点数值  float(5,2):5表示整个数字长度
        double     8  (-1.79 E+308,1.79 E+308)0  (2.22 E-308,1.79 E+308)双精度浮点数值   double(5,2):5表示整个数字长度
        decima     l   在金融使用                 小数值(精度更高)    decimal(5,2):5表示整个数字长度,2 表示小数位个数

    ❷. 字符串类型
        类型                         大小      描述
        char        0-255           bytes   定长字符串
        varchar     0-65535         bytes   变长字符串
        tinyblob    0-255           bytes   不超过255个字符的二进制数据
        tinytext    0-255           bytes   短文本字符串
        blob        0-65535         bytes   二进制形式的长文本数据
        text        0-65535         bytes   长文本数据
        mediumblob  0-16777215      bytes   二进制形式的中等长度文本数据
        mediumtext  0-16777215      bytes   中等长度文本数据
        longblob    0-4294967295    bytes   二进制形式的极大文本数据
        longtext    0-4294967295    bytes   极大文本数据

        char(10): 最多只能存10个字符,不足10个字符,占用10个字符空间
        varchar(10): 最多只能存10个字符,不足10个字符, 按照实际长度存储
        phone char(11)
        username varchar(20)

    ❸. 日期时间类型
         类型 大小(byte)                范围                              格式                          描述
        date        3       1000-01-01 至 9999-12-31 YYYY-MM-DD         日期值
        time        3       -838:59:59 至 838:59:59  HH:MM:SS           时间值或持续时间
        year        1       1901 至 2155 YYYY                           年份值
        datetime    8       1000-01-01 00:00:00 至 9999-12-31 23:59:59   YYYY-MM-DD HH:MM:SS 混合日期和时间值
        timestamp   4       1970-01-01 00:00:01 至 2038-01-19 03:14:07   YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

        birthday date
        update_time datetime

六. 运算符

    ❶. 算术运算符:   +    -   *   /    div也是除    %取模、余数   mod取模、余数  余数的符号跟被除数相同 跟除数没有关系
        select 100 + '1'      // 结果是 101    会把字符串 1 转换成数字 隐式转换
        select 100 +  'a'      // 结果是 100    a 不能转换是数字    a看做0处理
        select 100 * 'A'      // 结果是 0
        select 100 div 0      // 结果是 null   除数不能是0

    ❷. 比较运算符:
        返回结果是 1 为真
        返回结果是 0 为假
        返回结果是 null 为其他情况  只要有 null 值 参与比较 结果为 null,null 和 null 比较 结果也是null

        >     大于
        >=    大于等于
        <     小于
        <=    小于等于
        !=    不等于     可以参与null运算
        <>    不等于     可以参与null运算
        =     等于     会把 等号 两边的 值做比较 如果相同 返回1  结果不同返回0
            select 1 = 2, 1 = '1', 1 = 'a', 0 = 'a' ;
            select update_user from cust_user_info WHERE update_user = NULL   // 有null参与运算 不会返回任何结果
        <=>   安全等于  和 = 用法一样   唯一区别可以进行 null 运算
            select 1 <=> null, null <=> null;
            select update_user from cust_user_info WHERE update_user <=> NULL;

        is null      空       判断值  字符串或表达式是否为空
        is not null  不为空   判断值  字符串或表达式是否不为空
        isnull()     空     函数   判断值  字符串或表达式是否  
            select update_user from cust_user_info WHERE update_user is null;  // 取 update_user 是null的情况
            select update_user from cust_user_info WHERE update_user is not null;
            select parent_id from cust_user_info where ISNULL(parent_id);

        between ...  and   在 ... 之间
            select parent_id from cust_user_info where parent_id between 28 and 50; // 包括28 包括50 前面的数要小于后面的数
            select parent_id from cust_user_info where parent_id not between 28 and 50; // 不包括28 不包括50 不在28-50之间
            select parent_id from cust_user_info where parent_id < 50 or parent_id >28;
            select parent_id from cust_user_info where parent_id >10 && parent_id <50;
            select cust_id, parent_id from cust_user_info where parent_id = 10 or parent_id = 50; // 出现10或50的
            select cust_id, parent_id from cust_user_info where parent_id = 10 or 50; // 查询所有  因为50不为零返回值是 1 
        
        in()           具体的 等于 某一直     或多选一
        not ... in()   不等于 某一直
            select * from tb_emp where job in (2);
            select * from tb_emp where job in (2,3,4);
            select * where parent_id in (10,20,50);
            select * where parent_id in (10);
            select * where parent_id not in (10);

        like   模糊查询
            _         下划线 代表一个字符
            %         百分号 不确定字数的字符   包括 0个
            \         反斜杠 转义字符  代表 本身的意思
            escape    定义转义字符

            select * from tb_emp where name like '美';          // 这样的结果是  是 美的 查询出来 并不是模糊查询 相当于 =
            select * from tb_emp where name like '方芝美';      //
            select * from tb_emp where name like '%美%';        // 模糊查询 带 美 字的就可以
            select * from tb_emp where name not like '%美%';    // 不带美子字的 
            select * from tb_emp where name like '_美%';        // 第二个字是美的                      
            select * from tb_emp where name like '_\_a%';       // 第二个字符是 下划线的
            select * from tb_emp where name like '_$_a%' escape '$';      //把 $符 定义成 转义字符
            select * from tb_emp where name like '__';          // 查询 两个字的员工

        least     取 最小值     如果是字母  a 最小  z 最大
        greatest  取 最大值
            select least('g','b','c','v') from dual;       // 输出 b
            select greatest('c','s','y') from dual;        // 输出 y
            select greatest('2','3','1') from dual;        // 输出 3
            select least(lft,rgt) from cust_user_info;     // 比较两个字段  取最小值的字段

        regexp       正则表达式运算符
        rlike        正则表达式运算符
            select cust_name, cust_id from cust_user_info where cust_name regexp '^陈'       // 以陈开头的
   
    ❸. 逻辑运算符
        or   ||   或      两边有一个真就可以
        and  &&   且      两边都是真 and和 or 可以一起使用 and优先级高于or   a and b or c and d  先算and
        not  !    非
        xor       亦或    两边一个真一个假的时候  成立
            select * from cust_user_info where parent_id = 50 xor lft < 20     // 这里相当于 or 了 这不常用了解就好
    



    

Java SE 基础




Java SE 基础         - 2023.9.15 -




一. 数据类型 及 运算符

❶. 常量

    字符串常量
    整数常量
    小数常量
    字符常量
    布尔常量
    空常量

    println 输出格式
        public class a {
            public static void main(String[] xrgs){
                System.out.println("您好");
                System.out.println(123);
                System.out.println(123.23);
                System.out.println('9');
                System.out.println(true);
                System.out.println(false);
                System.out.println(5 > 10);
            }
        }

    双引号    字符串
    单引号    只能存放单个字符
    整数
    小数
    true
    false
    null     空常量 不能直接打印

❷. 变量

    存储单元
        bit  位 比特位  b表示   计算机存储设备(硬盘 内存)最小信息单元
        byte 字节       B表示  计算机最小存储单元 由连续的 8个位 组成  

    数据类型
        整数     默认为 int
            byte 字节   1字节     -128~127
            short       2        -32768~32767
            int         4        -2的31次方 ~ 2的31次方-1
            long        8        -2的63次方 ~ 2的63次方-1
        浮点数   默认为 double
            float      4        1.401298e-45 ~ 3.402823e+38        单精度
            double     8        4.9e-324 ~ 1.797693e+308           双精度
        字符
            char       2        0 ~ 65535
        布尔
            boolean    1        true  false

        定义变量
            数据类型 变量名 = 数据值

            int a = 10;                 // 定义变量 一定要加 数据库类型
            double b = 12.3; 
            char c = 'a';               // 字符 需要 单引号
            boolean d = true;

            a = 30;                     // 此为赋值 并不是定义 上面需要有定义才才能赋值

            int a;
            a = 10;

            int a = 10 , b = 20 ,  c =30;   // 一条语句定义多个变量

            float e = 12.3f;                // 必须加F   定义 浮点数 要加 大写F 或 小写f
            float e = 12.3F;

            long f = 1000l;                 // 可以不加L  定义 长整形 要加 大些L 或 小写l
            long f = 1000L;

            注:
                变量名不允许重复定义
                变量的作用域范围  只在它所在的大括号中有效

    键盘录入
        import java.util.Scanner;

        public class b {
            public static void main(String[] args) {
                System.out.print("请输出数字:");
                Scanner sc = new Scanner(System.in);     // System.in 系统输入
                int a = sc.nextInt();                    // nextInt() 是Scanner已经写好的方法
                System.out.println(a);
            }
        }


    标识符
        有数字 字母 下划线 美元符号 组成
        1. 不能以数字开头
        2. 不能是关键字
        3. 区分大小写

        方法 变量   命名使用 小驼峰
        类   命名使用 大驼峰 

❸. 数据类型转换

    隐式转换  
        取值范围小的数据 给取值范围大的类型赋值 可以直接赋值
            int a =10;
            double b = a;
            System.out.println(b);    // 会输出 10.0
            byte < short < int < long < float < double
                    char <

        小的数据类型 和大的数据类型运算 小的会提升为大的之后 再进行运算
            int a = 10;
            double b = 12.3;
            double c = a + b;
            System.out.println(c);

        byte short char 三种数据在运算的时候 不管是否有更高的数据类型 都会提升为int 在进行运算
            byte a = 10;
            byte b = 20;
            int c = a + b;
            System.out.println(c);

    强制转换
        int d = (int)c;

        大范围 转换为 小范围

            int a = 10;
            byte b = (byte)a;
            System.out.println(b);

            double c = 12.3;
            int d = (int)c;                  // 会把小数点后面的都干掉
            System.out.println(c);
            System.out.println(d);

            byte d = 3 + 4;                  // 常量优化机制 先相加 如在byte范围内 通过 不在byte内 报错

            long a = 123;                    // 不会报错  因为123默认为 int 类型 可以转换成 long 类型
            long a = 12345645632156123123L   // 不加L 会报错 因为 已经超过int的范围 

            short s = 1;
            s = (short)(s + 1);
            System.out.println(s);

    实例1. 变量互换

        public class D {
            public static void main(String[] args){
                int a = 3;
                int b = 5;
                System.out.println("a= "+a);
                System.out.println("b= "+b);
                a = a + b;
                b = a - b;
                a = a - b;
                System.out.println("a= "+a);
                System.out.println("b= "+b);
            }    
        }

        public class D {
            public static void main(String[] args){
                int a = 3;
                int b = 5;
                System.out.println("a= "+a);
                System.out.println("b= "+b);
                a = a ^ b;
                b = a ^ b;
                a = a ^ b;
                System.out.println("a= "+a);
                System.out.println("b= "+b);
            }
        }

❹. 运算符及表达式

    运算符: 对常量或变量进行操作的符号
    表达式: 用运算符把常量或者变了连接起来符号java语法的式子

    int a = 10;
    int b = 20;
    int c = a + b;

    + 是运算符  并且是 算术运算符
    a + b 是表达式 并且是 算术表达式

    +    -    *   /    %取余数

    System.out.println(10 + 20);
    System.out.println(10 - 20);
    System.out.println(10 * 20);
    System.out.println(10.0 / 3);   // 两个整数相除 结果只能得到整数 
    System.out.println(10 / 3.0);   // 如果想要得到带有小数的结果, 必须加入 浮点型 运算
    System.out.println(5 % 2);

❺. 字符 + 操作 
    ASCII码 查询
        public class F{
            public static void main(String[] args){
                int a = 0;
                char b = 'a';
                System.out.println(a + b);  // 会先把 b 的值 按照 ASCII码进行转换 在相加
            }
        }

    ASCII码
        a   97
        A   65
        0   48

    字符串 + 操作
        对于字符串 +号 为 连接符
            System.out.println(1 + 99 + "年");
            System.out.println("5+5="+5+5 );
            System.out.println("5+5=" + (5+5));      // 小括号为 提升优先级 先算

    实例二: 数字拆分  
        键盘录入一个三位数 将其拆分为个位 十位 百位后 打印出来

        import java.util.Scanner;
        public class c {
            public static void main(String[] args){
                System.out.print("请输出三位数字: ");
                Scanner sc = new Scanner(System.in);
                int i = sc.nextInt();
                System.out.println("您输入的个位是: " + (i % 10));
                System.out.println("您输入的十位是: " + (i / 10 % 10));
                System.out.println("您输入的百位是: " + (i / 100 % 10));
            }
        }

        %10 取最后一位
        /10 消最后一位

        个位:  数值 % 10
        十位:  数值 / 10 % 10
        百位:  数值 / 10 / 10 % 10
        千位:  数值 / 10 / 10 / 10 % 10
        ...

❻. 运算符

    自增自减运算符
        ++i;
        i--;

        int a = 10;
        int b = ++a;           // 先加在赋值   b为11

        int c = 10;
        int d = a++;           // 先赋值在加   d为10

    赋值运算符
        =
        +=    // 将符号左右两边的数据 做加法运算 结果赋值给左边
        -=
        *=
        /=
        %=

    这些赋值运算符 隐含了强制类型转换
        short s = 1;
        ss += 1;                // 相当于 s = (short)(s + 1);
        System.out.println(s);

    关系运算符 比较运算符  
        ==        // 比较  返回值 为 true 或 false
        !=
        >
        >=
        <
        <=

    逻辑运算符
        
        &    并且    返回布尔类型            x > 5 & x < 15
        |    或
        !    非
        ^    异或   true ^ true 返回  false   相同为假  不同为真
                    false ^ false 返回 false
                    true ^ false 返回 true

    短路逻辑运算符
        &&   与     有短路效果   左边为false 右边不执行
        ||   或     有短路效果   左边为true 右边不执行

    三元运算符
        关系表达式 ? 表达式1 : 表达式2
        int a = 10;
        int b = 20;
        int c = 30;
        int max = a > b ? a:b;          // 如果a大于b max取值a 否则max取值b
        int max1 = max > c ? max : c; 
        int max2 = a > b ? a : b  > c ? a > b ? a : b : c;   // 结果与 max1 相同


二. 流程控制

    ❶. if语句

        if (关系表达式){}
        if (i >= 18){}
        if (90 <= i & i <= 100){}

        if (){}
        else {}

        if (){}
        else if (){}
        ...
        else{}

        注: 如果if语句所控制的语句 是一条语句  大括号可以省略
            if 语句的小括号后面不要写分号

    ❷. switch语句

        switch(i){
            case 1:
                break;
            case 2:
                break;
            default:
                break;
        }

        注: case 穿透  如果switch语句中  case 省略了 break语句 就会开始 case 穿透
            当开始case穿透 后续的case就不会具有匹配效果 内部的语句都会执行 知道看见break才停止

    ❸. for 循环
        for(int i = 1; i <= 3; i++ ){}

        for(int i = 0; i <=100; i = i + 2){}          //  偶数
        if(i % 2 == 0){}                              //  偶数
        if(i % 2 == 1){}                              //  奇数

        if (i % 2 == 0){                   // 引入统计变量 如果是2的倍数 则 打印一个换行
                System.out.println();
        }

    ❹. while 循环               适合 不明确 循环次数
        
        while(i <= 100){
            sum += i;
            i++;
        }


        do{
            System.out.println(i);
            i++;
        }while(i <=10);

    ❺. 死循环   标号
        for(;;){}

        teo:while(true){           // 此 teo: 为循环 起的名字 可以使用 break teo; 跳出
            break teo;             // 跳出 teo 循环
            continue teo;
        }
        do{}while(true)
        continue;        // 跳过一次循环
        break;           // 结束循环

    ❻. Random 随机数
        import java.util.Random;
        public class a {
            public static void main(String[] args) {
                Random r = new Random();
                int i = r.nextInt(10);              // 产生一个 0 - 9 之间的随机数 不包括10
                System.out.println(i);
            }
        }
        int i = r.nextInt(10) + 1;              // 可以产生 1 - 10 之间的随机数


三. 数组

    ❶. 定义数组

        数据类型[] 变量名
        int[] array;
        数据类型 变量名[]
        int array[];

    ❷. 动态初始化

        int[] arr = new int[3];        // 索引从0开始  为  0   1  2
        arr[1] = 11;                   // 为 1 号索引位置 赋值

        System.out.println(arr);

            [I@119d7047             // 打印数组变量名 会出现 内存地址

                @ :   分隔符
                [ :   当前的空间是一个数组类型
                I :   当前数组容器中所存储的数据类型  int
                119d7047 :  十六进制内存地址

        System.out.println(arr[0]);      // 调取0号索引  默认初始值为 0

        数组默认值

            数据类型       默认值
            整数            0
            浮点数          0.0
            布尔            false
            字符            空字符
            引用数据类型     null
        int[] arr2 = arr1;          //  定义数组arr2   和 arr1 相同

    ❸. 静态初始化

        int[] arr = new int[]{1,2,3};    // 定义数组并直接赋值
        int[] arr = {1,2,3};

        arr.length       //  数组中的元素个数  就是个 int 的 整数

        for(int i = 0; i < arr.length; i++){        // 打印所有数组中的元素
            System.out.println(arr[i]);
        }


        int[] arr = new int[5];
        for(int i = 0; i < arr.length; i++){
            // arr[i] = 10;
            arr[i] = sc.nextInt();              
        }

    ❹. 数组命令整理

        int[] arr;                                // 定义数组  动态初始化
        int arr[];                                // 定义数组  动态初始化

        int[] arr = new int[3];                   // 定义数组并赋值 索引从0开始  为  0   1  2
        arr[0] = 11;                              // 为 0 号索引 赋值

        System.out.println(arr[0]);               // 调取0号索引 如果不赋值 默认初始值为 0
        System.out.println(arr);                  // 打印数组  会出现内存地址

        int[] arr2 = arr1;                        //  定义数组arr2   和 arr1 相同

        int[] arr = new int[]{1,2,3};             // 定义数组并直接赋值  静态初始化
        int[] arr = {1,2,3};                      // 定义数组并直接赋值  静态初始化

        arr.length                                // 数组中的元素 个数 获取数组arr的长度 就是个 int 的整数

        for(int i = 0; i < arr.length; i++){      // 打印所有数组中的元素
            System.out.println(arr[i]);
        }

        for (int i = 0; i < arr.length; i++) {               // 键盘录入  存放到 数组中
            System.out.println("第" + (i + 1) + "个数");
            arr[i] = sc.nextInt();
        }


四. 方法

    public static void teo(){            //  定义一个方法    void 空白 没有返回值

    }

    teo();             // 调用

    public static void teo(int a, int b){}            //  定义一个 带参数的方法

    teo(5,7);                                  // 调用 方法

    形参  方法定义中的参数
    实参  方法调用中的参数

    public static int teo4(int a,int b){       // 定义 int 类型 返回值的 方法
        int i = a + b;
        return i;                              // 返回值 i
    }

    int num = teo4(5,6);                       // 定义 num 变量 接收 返回值


    return;      // 结束方法 也可在void中使用 只有 return 没有返回值 后面的代码不执行 所在的方法会从栈内存中清除 亦叫 弹栈

    方法重载  同一个类中 方法名相同 参数不同的方法 叫 方法重载

    public static void teo5(int[] arr){}       // 数组作为参数 传递给方法
    int[] arr = {11,22,33,44,55};
    teo5(arr);

    public static int[] teo6(int[] arr){       // 数组作为参数  返回值 依然是 数组
        int[] arr1 ={max,min};
        return arr1;                           // 返回 arr1 数组
    }
    int[] arr = new int[]{1, 54, 89, 65};      // 用于传递的arr数组 
    int[] arr1 = teo6(arr);                    // 用于接收arr1数组    方法之间的数组内存不相同  方法之间传参的数组内存相同

    cmd calc 计算器
        mstsc 远程连接
        msconfig 服务
        regedit 注册表

五. 进制

    二进制    数值前面以 0b开头  b大小写都可以
    八进制    数值前面以 0开头
    十六进制  数值前面以 0x开头  x大小写都可以

    ❶. 任意进制 转换成 十进制

        公式: 系数 * 基数的权次幂 相加
        系数: 数字
        基数: 二进制为2   8进制为8  16进制为16
        权:   从右边开始  以0为编号  逐个加1

        0b100

            0*2^0 = 0
            0*2^1 = 0
            1*2^2 = 4

        0x100
            0*16^0 = 0
            0*16^1 = 0
            1*16^2 = 256

        0100
            0*8^0 = 0
            0*8^1 = 0
            1*8^2 = 64

    ❷. 十进制  转换成  任意进制 

        公式: 除基取余   使用源数据不断的除以基数 得到余数 直到 商为0 在将余数倒着加起来
        11 转换成 二进制   1011
            2  11
                5 ... 1
                2 ... 1
                1 ... 0
                0 ... 1

        60 转换成 十六进制   3c
            16  60
                3 ... 12
                0 ... 3

    ❸. 二进制 转 十进制

        0b1011  转换成 十进制
        8421码

            128     64     32     16     8     4     2      1       8421码表
                                         1     0     1      1       二进制
                                         8 + 2 + 1  = 11            十进制 把二进制 1对应的相加

    ❹. 二进制 转 八进制

        分成多组  从右边开始 每三个一组
        0b111100 转换成 八进制 

            128     64     32     16     8     4     2      1       8421码表  
                                               1     0      0       第一组
                                               1     1      1       第二组
                                               4                    第一组相加结果
                                               4 + 2 + 1 = 7        第二组相加结果
                                               74                   转换成 八进制

    ❺. 二进制 转 十六进制

        分成多组  从右边开始  每四个一组
        0b111100 转换成 十六进制

            128     64     32     16     8     4     2      1       8421码表  
                                         1     1     0      0       第一组
                                                     1      1       第二组
                                               8 + 4 = 12           第一组相加结果
                                               2 + 1 = 3            第二组相加结果
                                               3c                   转换成 十六进制 
    ❻. 位运算

        先吧数字转换成 二进制 在运算  在二进制运算中  1表示 true  0表示false

        &   位与    遇 false 则 false 
        |   位或    遇 true  则 true
        ^   位异或  相同为false 不同为true     一个数被另外一个数 异或两次 该数本身不变
        ~   取反    全部取反 0变1  1变0  包括符号位

        6 位运算 2
        00000000 00000000 00000000 00000110      二进制 6
        00000000 00000000 00000000 00000010      二进制 2

                                        010      6 & 2 的结果 返回为 2
                                        110      6 | 2 的结果 返回为 6
                                        100      6 ^ 2 的结果 返回为 4

        ~6的计算
        00000000 00000000 00000000 00000110      二进制 6
        11111111 11111111 11111111 11111001      二进制 6取反
                                         -1      求出来反码
        11111111 11111111 11111111 11111000      反码

        10000000 00000000 00000000 00000111      反码推源码   第一个1 为符号位 1表示负数
                                         -7      转换成十进制为 -7
                                                 ~6 的结果 返回为 -7

        System.out.println(6 & 2);              // 可打印查看相关结果
        System.out.println(6 | 2);
        System.out.println(6 ^ 2);
        System.out.println(~6);

    ❼. 位移运算符

        <<  有符号左移运算符 二进制位向左移动 左边符号位丢弃
            向左移动几位 就是 乘以 2的几次幂
                5 << 1  就是 5乘以2
                5 << 2  就是 5乘以4

        >>  有符号右移运算符 二进制位向右移动 使用符号位进行补位
            向右移动几位 就是 除以 2的几次幂
                5 << 1  就是 5除以2
                5 << 2  就是 5除以4

        >>> 无符号右移运算符 无论符号位是0还是1 都补充0  (用处相当少)

        12 << 2 
        00000000 00000000 00000000 00001100    12的二进制
        00000000 00000000 00000000 00110000    12 << 2 转换成十进制结果为 48  
                                               亦可使用  12 * 2^2 = 48            
        12 >> 2                                         12 / 2^2 = 3

        -6 >>> 1
        10000000 00000000 00000000 00000110    -6的二进制
        01000000 00000000 00000000 00000011    -6 >>> 1 转换成十进制结果为 2147483645 (用处相当少)

        System.out.println(12 << 2 );              // 可打印查看相关结果
        System.out.println(12 >> 2 );
        System.out.println(-6 >>> 1);

    ❽. 数据交换
        a 与 b的值 交换 方法一
            int temp = a;
            a = b;
            b = tmp;

        a 与 b的值 交换 方法二  异或的应用
            a = a ^ b;
            b = a ^ b;
            a = a ^ b;

        数组中的数据交换
            int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13};
            teo7(arr);
            for(int i =0; i < arr.length;i++) {
                System.out.println(arr[i]);
            }

            public static void teo7(int[] arr){
                for(int start = 0,end =arr.length -1; start < end; start++,end--){
                    int temp = arr[start];
                    arr[start] = arr[end];
                    arr[end] = temp;
                }
            }


六. 二维数组
    ❶. 动态初始化
        int[][] arr;        // 常用 二维数组是记录一维数组的 内存地址
        in arr[][];
        int[] arr[];

        int[][] arr = new int[2][3];    // 定义一个二维数组  可以存放2个一维数组 每个一维数组可以存放 3个int类型的元素
        arr[0];            // 第一个 一维数组 内存
        arr[0][0];         // 第一个 一维数组 中的 第一个元素
        arr[0][0] = 11;    // 赋值
        arr[0] = arr1;     // 把 一维数组arr1 整体添加到二维数组arr中的 arr[0]数组中

    ❷. 静态初始化

        int[][] arr = new int[][]{{11, 22, 33}, {44, 55, 66}};
        int[][] arr = {{11, 22, 33}, {44, 55, 66}};
        int[] arr1 = {11, 22, 33};
        int[] arr2 = {44, 55, 66};
        int[][] arr = {arr1, arr2};

    ❸. 二维数组的遍历
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }


七. 面向对象
    public class phone {
        String brand;
        int price;
        public void call(){
            System.out.println("打电话" );
        }

        public void sendMessage(){
            System.out.println("发短信");
        }
    }

    phone p = new phone();
    p.call();
    p.sendMessage();

    私有的成员变量 只能在本类中使用
        private int i;           \\ 定义一个私有的 成员变量

        public void setI(int a){
            i =a;
        }
        public int getI(){
            return i;
        }

    成员变量
    局部变量

    面向对象三大特征     
    封装 将类的某些信息隐藏的类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现
         对隐藏信息的操作和访问成为变量private,提供对于的 get  set 方法
    继承 
    多态

    构成方法 与 类名相同   没有返回值


............................................................................................................


八. 杂项

    CS架构   客户端 + 服务器

    BS架构   浏览器 + 服务器

    JavaEE 服务器
        weblogic     实现了JavaEE规范, 重量级服务器 又称JavaEE容器.
        websphereAS  实现了JavaEE规范,重量级服务器.
        JBOSSAS      实现了JavaEE规范,重量级服务器,免费的.
        Tomcat       实现了jsp/servlet规范,是一个轻量服务器,开源免费

    HelloWorld

        # vim HelloWorld.java
            public class HelloWorld {
                public static void main(String[] args){
                    System.out.println("Hello World !");
                }
            }

        # javac HelloWorld.java
        # java HelloWorld

    public 类名 与 文件名相同


    关键字
        关键字 字母 全部小写 有颜色


    Win + e  资源管理器

    java se    基础     桌面应用的开发
    java me    手机java程序开发 已被安卓 ios取代
    java ee    web方向 网站开发


    JRE: 编写代码的过程中, 需要使用JRE中java已经写好的代码  java运行环境 包含JVM虚拟机及java核心类库
        类: 就是java文件 里面存放java代码    A.java
        类库: 存放多个java文件的仓库
        核心类库: java 已经写好的 代码仓库


    JDK  翻译 A.java代码的工具 翻译完成后可被JVM虚拟机所执行
    JVM  JVM虚拟机 启动翻译java代码的作用... ... 运行代码的过程中, 需要使用JDK中的运行工具

    关系
        JDK 包含 JRE和开发工具
            JRE包含JVM和核心类库



    java8.0 最常用的java版本

    静态资源发布:

        修改 javaEE (Legacy) 主页文件
            # vim /WEB-INF/web.xml                                  // 修改 静态项目 主页文件
                <welcome-file-list>
                    <welcome-file>/index/index.html</welcome-file>
                </welcome-file-list>
                </web-app>                                           // 在</web-app>标签上面 添加 三行代码