数据库。。

day01

1.      数据库:DateBase简称DB

2.      MySQL启动:①cmdàservices.msc打开服务窗口

②使用管理员打开cmd:net stop mysql 启动  net start mysql 关闭

③手动 资源管理器-管理-服务

               登录:①mysql –uroot –p密码

                            ②mysql –hip –uroot –p连接目标的密码

             退出:exit/quit

         目录结构:数据库(文件夹)、表(文件)、数据(数据)

3.      SQL(结构化查询语言):定义了操作所有关系型数据库的规则;每种数据库操作存在差异,称为“方言”

4.      SQL的通用语法:

① SQL语句可单行或多行书写,以分号结尾

② MySQL数据库中的SQL语句不区分大小写,关键字建议使用大写 

③ 3种注释:单行注释:-- 注释内容(#注释内容:MySQL特有);* 多行注释:/* 注释 */

5.      SQL分类:DDL操作数据库、表;DML增删改表中的数据;DQL查询表中的数据;DCL(了解)

6.      DDL:CRUD操作数据库

C(Create):创建 ①create database 数据库名称;

                       ②create datebase if not exists 数据库名称;

                          ③create database 数据库名称 character set 字符集名;

                             ④create database if not exists 数据库名称 character set 字符集名;

R(Retrieve):查询 ①show databases;

                             ②查询某个数据库的创建语句:show create database 数据库名称;

U(Update):修改  修改数据库字符集:alter database 数据库名称 character set 字符集名;

D(Delete):删除 ①drop database 数据库名称;②drop database if exists 数据库名称;

使用数据库:①查询正在使用的数据库名称:select database();②使用数据库:use 数据库名称;

7.      DDL:CRUD操作表

C(Create):创建 ①create table 表名(

                                    列名1 数据类型1,

                                    列名2 数据类型2,

                                    …

                                    列名n 数据类型n

);

数据库类型:

1) int(整数类型):age int;

2) double(小数类型):score double(5,2)

3) data(日期): yyyy-MM-dd

4) datatime(日期):yyyy-MM-dd HH:mm:ss

5) timestamp(时间错类型):yyyy-MM-dd HH:mm:ss 默认使用系统当前时间

6) varchar(字符串):name varchar(20); 姓名最大二十个字符

②复制表:create table 表名 like 被复制的表名;

R(Retrieve):查询 ①show tables;②查询表结构:desc 表名;

U(Update):修改 ①表名:alter table 表名 rename to 新表名;

                              ②修改字符集:alter table 表名 character set 字符集;

                              ③添加列:alter table 表名 add 列名 数据类型;

                              ④修改列名、类型:alter table 表名 change 列名 新列名 新数据类型;

                                                            alter table 表名 modify 列名 新数据类型;

                              ⑤删除列:alter table 表名 drop 列名;

D(Delete):删除 ①drop table 表名;②drop table if exists 表名;

8.      DML(增删改):

1) 添加数据:insert into 表名(列名1,列名2…列名n) values (值1,值2…值n)

l  若不写列名,则为所有列添加值

2) 删除数据:delete from 表名 【where 条件】; 

l  不加条件删除所有记录,有多少条记录删除多少次(不推荐)

l  TRUNCATE TABLE 表名; 先删除表,在创建一张一样的空表

3) 修改数据:update 表名 set 列名1=值1,列名2=值2……where 条件;

l  不加条件修改全部记录

day02

1.      DQL(查询):

1)   基础查询:select 列名1… from 表名;   select * from 表名;

a)       去除重复:distinct

b)       计算列:列名相加(ifnull(表达式1,表达式2):null参与运算,计算结果都为null)

c)        起别名:as(可省略)

2)   条件查询:

 where子句后跟条件

                     运算符

                     * > 、< 、<= 、>= 、= 、<>、!=

                     * BETWEEN...AND  

                     * IN( 集合) 

                     * LIKE:模糊查询:select * from 表名 where name like “_&”

                            * 占位符:

                                   * _:单个任意字符

                                   * %:多个任意字符

                     * IS NULL  

                     * and  或 &&

                     * or  或 || 

 * not  或 !

3)   排序查询:order by 排序字段1,排序方式1……

l  asc(默认),升序;desc,降序

l  多个条件时,仅前面条件一样,走后面条件

4)   聚合函数:列纵向计算(排除null值)

①count:计算个数    select count(列名) from 表名; <一般选择非空列:主键>

②max:计算最大值     select max(列名) from 表名;

③min:计算最小值     select min(列名) from 表名;

④sum:计算和            select sum(列名) from 表名;

⑤avg:计算平均值     select avg(列名) from 表名;

5)   分组查询:

①group by 列名; select 列名,avg(math) from student group by 列名;

                              select 列名,avg(math) from student where 条件 group by 列名;

                                     select 列名,avg(math) from student group by 列名 having 条件;

  where在分组前限定条件,having在分组后

   where后不可跟聚合函数,having可以

6)   分页查询:(limit是一个方言)

limit 开始的索引<(当前页码-1)*每页显示条数>;

select * from student limit 0,3;

select * from student limit 3,3;

select * from student limit 6,3;

2.      约束:对表中的数据进行限定

1) 非空约束:not null

① 创建表时添加约束 id int not null;

② 创建表后添加约束 alter table 表名 modify name varcher[20] not null;

③ 删除约束:alter table 表名 modify name varcher[20];

2) 唯一约束:unique

① 创建时:name varchar[20] unique;

② 创建后:alter table 表名 modify name varchar[20] unique;

③ 删除:alter table 表名 drop index 列名;

3) 主键约束:primary key(非空且唯一,每个表只有一个字段为主键)

① create table 表名(

         id int primary key,

         age int

);

         ② 创建表后添加主键:alter table 表名 modify id int primary key;

          ③ 删除主键:alter table stu drop primary key;

l  自动增长:

①创建表时,添加主键约束:

create table 表名(

                       id int primary key auto_increment,

                       age int

);

                ②删除自动增长:   alter table stu modify id int;

                ③添加自动增长:  alter table stu modify id int auto_increment;

4) 外键约束:foreign key

① 创建表时添加:

         create table 表名(

       …

       外键列

       constraint 外键名称 foreign key (外键列名称) reference 主表名称(主表列名称)

);

         ② 删除外键:alter table 表名 drop foreign key 外键名称;

         ③ 添加外键:

alter table 表名 add constraint 外键名称 foreign key (外键名字段)   references 主表名称(主表列名称) 

④ 级联操作:

alter table 表名 add constraint 外键名称 

foreign key (外键名字段)    references 主表名称(主表列名称)on update cascade on delete cascade

级联更新:on update cascade

级联删除:on delete cascade

3.      数据库的设计:

1) 多表之间的关系:

① 一对一:任意一方添加唯一外键指向另一方的主键

② 一对多:“多”建立外键指向“一”的主键

③ 多对多:需借助“中间表”,“中间表”至少两个字段,这两个字段作为“中间表”的外键指向两表主键

4.      数据库范式:<后面的范式满足前面的范式>

1) 第一范式(1NF):每一列都是不可分割的原子数据项

2) 第二范式(2NF): 函数依赖:aàb

完全函数依赖:(a,b)àc

部分函数依赖:aàc  (a,b)àc    

传递函数依赖:aàb,bàc

码:一个属性/属性组被其他属性完全依赖

3) 第三范式(3NF):2NF基础上消除函数依赖

5.      数据库的备份、还原:

1) cmd:mysqldump –u用户名 –p密码 数据库名>保存的路径 

2) 图形化工具

day03

1.      多表查询:select * from 表名1,表名2…

l  得到笛卡尔积(两个集合的所有组成情况)

1)   内连接查询:

① 隐式内连接:select * from 表名1,表名2 where 条件;

② 显式内连接:select * from 表名1 [inner] join 表名2 on 条件;

2)   外连接查询:

① 左外连接:select * from 表1 left [outer] join 表2 on 条件;

② 右外连接:select * from 表1 right [outer] join 表2 on 条件;

3)   子查询:查询中嵌套查询

2.      事物:

1)   概念:被事物管理的多个操作,要么同时成功,要么同时失败

2)   操作:① 开启事物:start transaction;

 ② 回滚:rollback;

 ③ 提交:commit;

l  查看事物提交方式:select @@autocommit;   1—自动提交  0—手动提交

l  修改:select @@autocommit=0;

3)   四大特征:① 原子性:不可分割的最下操作单位,要么同时成功,要么同时失败

 ② 持久性:事物提交或回滚后,数据库会持久化保存数据

 ③ 隔离性:多个事物之间,相互独立

 ④ 一致性:事物操作前后,数据总量不变

4)   隔离级别(了解):

概念:多个事物之间有隔离性,若操作同一批数据,会引发一些问题,设置不同隔离级别来解决

存在问题:脏读、不可重复读、幻读

隔离级别:① read uncommitted :读未提交   

                 ② read committed:读已提交(Oracle)    可解决脏读

                              ③ repeatable read:可重复读(MySQL)    可解决脏读、不可重复读

                              ④ serializable:串行化                     均可解决

l  隔离级别从小到大安全性越来越高,效率越来越低

l  查询隔离级别:select @@tx_isolation;

l  设置隔离级别:set global transaction level 级别字符串; 

3.      DCL:管理用户,授权

1) 管理用户:① 创建用户:create user ‘用户名’@‘主机名’ identified by ‘密码’;

 ② 删除用户:drop user ‘用户名’@‘主机名’;

 ③ 修改用户密码:update user set password = password(‘新密码’) = ‘用户名’;

                            set password for ‘用户名’@’主机名’=passWord(‘新密码’);

            *忘记密码:①以管理员运行cmd,停止MySQL:net stop mysql;

                                       ②使用无验证方式启动MySQL:mysqld –skip-grant-tables,回车

                                     ③打开新的cmd,直接输入MySQL,回车

                                     ④use MySQL;改密码语句

                                       ⑤任务管理器关闭mysqld

                                       ⑥以管理员运行cmd,启动MySQL:net start mysql;

                                     ⑦新密码登录

 ④ 查询用户:切换到MySQL数据库:use MySQL;

                       查询user表:select * from user; 

l  通配符:% 表示可以在任意主机使用用户登录数据库

2) 权限管理:① 查询权限:show grants for ‘用户名’@‘主机名’;

 ② 授予权限:grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;

权限通配符:          all   

数据库名、表名通配符:*

 ③ 撤销权限:revoke 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’;

day04

1.      JDBC概念:Java DataBase Connectivity     java数据库连接——java操作数据库

l  本质:sun公司定义的一套操作所有关系型数据库的规则——接口。

各个数据库厂商去实现这套接口,提供数据库驱动jar包。

我们使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2.      步骤:     

    1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar                 

1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下               

 2.右键-->Add As Library           

 2. 注册驱动           

 3. 获取数据库连接对象 Connection           

 4. 定义sql           

 5. 获取执行sql语句的对象 Statement           

 6. 执行sql,接受返回结果           

 7. 处理结果           

 8. 释放资源

3.      各个类详解:

a)    DriverManager:驱动管理对象
i.    注册驱动
ii.    获取数据库连接:

  • 方法:static Connection getConnection(String url, String user, String password) 

              * 参数:

                  * url:(指定连接的路径)jdbc:mysql://ip地址(域名):端口号/数据库名称

                      * 例子:jdbc:mysql://localhost:3306/db3

                  * user:用户名

                  * password:密码

  b)    Connection:数据库连接对象

      1. 功能:

          1. 获取执行sql 的对象

              * Statement createStatement()

              * PreparedStatement prepareStatement(String sql)  

          2. 管理事务:

              * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事物

              * 提交事务:commit() 

              * 回滚事务:rollback()

c)    Statement: 执行sql

    1. boolean execute(String sql) :可以执行任意的sql 了解 

    2. int executeUpdate(String sql) :

执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句

        * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。

    3. ResultSet executeQuery(String sql)  :执行DQL(select)语句

 d)   insert语句:

              代码:

                   Statement stmt = null;

                   Connection conn = null;

                   try {

                       //1. 注册驱动

                       Class.forName("com.mysql.jdbc.Driver");

                       //2. 定义sql

                       String sql = "insert into account values(null,'王五',3000)";

                       //3.获取Connection对象

                        conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");

                       //4.获取执行sql的对象 Statement

                        stmt = conn.createStatement();

                       //5.执行sql

                       int count = stmt.executeUpdate(sql);//影响的行数

                       //6.处理结果

                       System.out.println(count);

                       if(count > 0){

                           System.out.println("添加成功!");

                       }else{

                           System.out.println("添加失败!");

                       }

           

                   } catch (ClassNotFoundException e) {

                        e.printStackTrace();

                   } catch (SQLException e) {

                        e.printStackTrace();

                   }finally {

                       //stmt.close();

                       //7. 释放资源

                       //避免空指针异常

                       if(stmt != null){

                           try {

                                stmt.close();

                           } catch (SQLException e) {

                                e.printStackTrace();

                           }

                       }

           

                       if(conn != null){

                           try {

                                conn.close();

                           } catch (SQLException e) {

                                e.printStackTrace();

                           }

                       }

                   }

        e)  ResultSet:结果集对象,封装查询结果             

    * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),

如果是,则返回false,如果不是则返回true

            * getXxx(参数):获取数据

                * Xxx:代表数据类型  如: int getInt() ,    String getString()

                * 参数:

                    1. int:代表列的编号,从1开始  如: getString(1)

                    2. String:代表列名称。 如: getDouble("balance")

           

            * 注意:

                * 使用步骤:

                    1. 游标向下移动一行

                    2. 判断是否有数据

                    3. 获取数据

4.      JDBC管理事物:

    * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务

        * 在执行sql之前开启事务

    * 提交事务:commit() 

        * 当所有sql都执行完提交事务

    * 回滚事务:rollback() 

        * 在catch中回滚事务

day05

数据库连接池:

1.      概念:存放数据库连接的集合(节约资源、用户访问高效)

2.      实现:

a)       标准接口:DataSource 

                     i.            方法:

1.        获取连接:getConnection();

2.        归还连接:Connection.close()

b)       由数据库厂商来实现它

                     i.            C3P0:数据库连接池技术  

                    ii.            Druid:数据库连接池实现技术,由阿里巴巴提供

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值