黑马程序员技术交流社区

标题: 【石家庄校区】数据库总结 [打印本页]

作者: 石家庄付天恩    时间: 2018-1-11 15:37
标题: 【石家庄校区】数据库总结
本帖最后由 小石姐姐 于 2018-1-12 10:36 编辑

数据库总结




day01


数据库

存储数据的仓库,本质是一个文件系统,数据按照指定的格式将数据存储起来,

用户可以对数据库中的数据进行增删改查.


数据表和Java关系

表:Java类

字段名:类的成员属性

记录:类的对象


INT 整数

DOUBLE:浮点数(小数)

VARCHAR:存储空间是可变的,可变长度字符

CHAR:存储空间是固定的


创建

CREATE DATABASE 库名

删除

DROP DATABASE 库名

查看

SHOW DATABASE  


* 修改表的结构

        * 格式: `ALTER TABLE 表名 操作关键字 列名 数据类型 约束;`

                * 操作关键字

                        * `ADD`: 增加列.

                                * `ALTER TABLE 表名 ADD 新列名 数据类型 约束;`

                        * `MODIFY`: 修改指定列的数据类型和约束(不能修改列名).

                                * `ALTER TABLE 表名 MODIFY 要修改的列名 新数据类型 新约束;`

                        * `CHANGE`: 修改指定列的列名+数据类型+约束.

                                * `ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;`

                        * `DROP`: 删除列.

                                * `ALTER TABLE 表名 DROP 列名;`

* 修改表名

        * 格式: `RENAME TABLE 旧表名 TO 新表名;`


约束

constraint

作用:就是对列中记录的值进行限制,如果插入的数据不符合约束规则,则该操作会立即终止

约束的种类

主键约束:PRIMARY KEY,限制该列的记录纸不能为空且唯一(不能重复),相当于同时设定了

NOT NULL和UNIQUE

自增约束  AUTO_INCREMENT,设置该列的记录值可以自动增加

外键约束:FOREIGN KEY,主要是连接另一个表的主键

非空约束;UNIQUE,唯一,限制该列的记录值不能重复

检查约束: CHECK,限制该列插入的记录值是否符合要求

默认值约束  DEFAULT 值,限制该列记录如果没有插入值,这使用默认值



day02


排序查询

是SELECT的子句,将查询后的结果集进行排序

格式:

ORDER BY 列名 排列选项

SELECT...FROM...WHERE...ORDER BY 列名 排列选项

查询,对结果集进行排序

  升序,降序,对指定列排序

  order by 列名 [desc][asc]

                 降序  升序(可以不写)

注意:WHERE 和 ORDER BY 的顺序

WHERE 在前 ,ORDER BY 在后,否则报错

因为排序是对SELECT查询出的结果再次进行排序,而不是对表中的数据进行排序.

所以要先把SELECT WHERE的查询结果拿到,才能使用ORDER BY 排序


拓展

排序可以按照多列,如先按a列降序,如果a列中有相同的值,则再使用拥有相同值的行,继续再排序其他属性.

SELECT * FROM users ORDER BY age DESC, salary DESC;


ORDER BY 是SQL语句的末尾吗?

不一定是SQL语句的末尾,后面还可以写LIMIT字句


聚合函数

SQL内置了一些函数(类似于API方法,可以对查询的结果进行相关计算)

作用:

竖向对某一列的值进行计算,然后返回一个计算结果

格式:

SELECT 函数名(列名) FROM 表名

常用的5个聚合函数

COUNT(列名) 计算指定列的记录航速

注意;值为NULL的记录不会被统计

SUM(列名):计算指定列的数据综合

         如果数据类型不是数据,则结果为0

MAX(列名):获取指定列的数值中的最大值

MIN(列名):获取指定列的数组中的最小值

AVG(列名):计算指定列的数值中的平均值

如果数据类型不是数值,则结果为0        


         注意:

聚合函数的函数名和小括号之间要连着写,不要有空格

  正确: SUM(zname)

      NULL与任何数的运算结果都是 NULL: SELECT(NULL+10)结果为NULL


分组查询

         是SELECT的字句,用于将查询出的结果集再次按照某列分组合并显示,记录值相同的归为一组.

同时还可以对分组后的结果再次使用条件进行过滤

格式:

GROUP BY 列名 HAVING 条件

SELECT...FROM...WHERE....GROUP BY 列名 HAVING条件;

HAVING的作用: 可选,对查询结果进行分钟显示后,再次按条件过滤

注意:

聚合函数与分组的使用效果

使用聚合函数后再进行分组,才相当于汇总统计

HAVING和WHERE的区别

过滤时间不同

WHERE是在分组钱先对查询结果进行过滤

HAVING是在查询结果分组后再次过滤

是否跟聚合函数不同

WHERE条件中不可使用聚合函数

HAVING条件中可以使用聚合函数

条件可用列名不同

         HAVING条件中的列名必须是SELECT或GROUP BY 中使用过的列名

WHERE条件中可以使用表的所有列名

最终一个完整的SELECT语句格式

SELECT...FROM...WHERE...GROUP BY ...HAVING....ORDER BY ...DESC;


JDBC原理

JDBC是一套API,可以通过JAVA代码来使用JDBC,同时提供了一套接口,用于让数据库厂商根据自己数据库特点去实现JDBC的功能


JDBC开发:前提,导入数据库驱动jar包


JDBC开发:1注册数据库驱动

注册数据库驱动的源代码

java.sql.DriverManage类:管理JDBC驱动

static void registerDriver(Driver driver):注册数据驱动

java.sql.Driver接口:数据库驱动必须实现的接口,在数据库驱动jar包中已经实现了


注册驱动的2种方式

方式1.DriverManager.registerDriver(new Driver());

其中Driver类是jar包驱动中的实现类,如com.mysql.jdbc.Driver.

用第一种方式会创建两次new Driver,因为new Driver的源码里的静态代码块也创建了一次new Driver.(静态代码块只要调用或加载或new就会执行一次,也只执行一次,一般用来初始化)

方式2, Class.forName("com.mysql.jdbc.Driver");//类的全名

Class.forName(),是获取字节码的一种形式,会把传入的类,如"com.mysql.jdbc.Driver", 加入到内存中去,并且为class文件创建一个对象出来,因为静态代码块的特点,new它对象会加载静态代码块,所以会执行静态代码块里的new Driver.也就创建了连接


      这是MySQL推荐的,内部也是使用方式1实现的

注意:

MySQL驱动com.mysql.jdbc.Driver类中已经编写了注册驱动的方法,我们只需要通过反射区加载

MySQL的驱动类,让其中的静态代码块执行,从 而注册驱动即可,不要手动注册驱动导致浪费资源

// 1.注册驱动, 使用反射的方式Class.forName("com.mysql.jdbc.Driver");

C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjmWQYniWIMLxajLby2efwEg/3408c41be16a4b9fb91ce2f9c7d39334/da6cfecb0d9042a1a9dd4ab61bec8c0f.jpg


C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjmWQYniWIMLxajLby2efwEg/4a8bf8018ed64f0cbf715bab07b6d308/e2ef025b077c4a499a35218b840dd398.jpg

JDBC开发:2获取数据库连接对象

这一步相当于SQLyog点击连接连接按钮(小海豚)

java.sql.DriverManage类

static Connection getConnection(String url, String user, String password):获取Collection接口的实现类,实现类是jar包中实现的.

url:数据库地址,jdbc:mysql://主机IP:端口号/数据库名

固定格式: jdbc:mysql://后面可变

String url = "jdbc:mysql://localhost:3306/mybase"

String username="root";

String password="123456";

static Connection getConnection(String url, String user, String password):获取的是Collection接口的实现类,所以用Collection接收.(静态方法,类名调用)

Connection connection = DriverManager.getConnection(url,username,password);


3.获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象

con对象调用方法  Statement createStatement() 获取Statement对象,将SQL语句发送到数据库

返回值是Statement接口实现类对象.

4.执行sql语句  获取结果集

通过执行者对象调用SQL语句,获取结果

int executeUpdate(String sql) 执行数据库中 SQL语句,仅限 insert delete  update

返回值 int,操作成功数据表多少行

5,处理结果集

String sql ="select * from sort"

ResultSet接口方法 boolean next() 返回true,有结果集,返回false没有结果集

          ResultSet rs = statement.executeQuery(sql);

while (rs.next()) {

                        System.out.println(rs.getInt("sid")+"\t" +

                rs.getString("sname")+"\t" +

                rs.getDouble("sprice") +"\t"+ rs.getString("sdesc"));

                }

或者都用rs.Object  rs.String


statement有个子接口PreparedStatement

如何获取PreparedStatement的实现类

   
day03

数据表与Java类的转换关系案例演示

案例需求

使用JDBC查询sort表的所有记录,将查询出的结果集中的每条记录封装为一个Sort类对象,

再将这些Sort对象存入LIst.

步骤:

1,安装表和Java类的对应关系,定义一个以表名为名的类

2,类中属性就是字段

3,创建一个对象来封装查询出的记录的各个列的值

4,结果集中的多条记录,就是多个对象,将这些对象存入一个集合中,用集合来表示查询的结果集

有什么用?

这种方式完成了数据库表想Java对象的转换, 叫做 ORM,Object Relation Mapping,对象关系映

射,就是指Java对象和关系型数据表的相互转换过程

如果我们能将数据表转换为Java的类,那我们操作数据库的表就相当于操作集合对象,这样会变得简单很多/


Properties配置文件:将JDBCUtils的连接参数保持在配置文件中

JDBC中连接数据库的配置

会改变的配置项

驱动类类名

url

用户名

密码

我们希望修改更方便,而不是每次都要修改Java代码后重新编译,所以想到可以用读取文件的方式动态的获取这些信息

Properties文件

以.Properties后缀结尾的文件,以key=value方式编写配置 如:

driver = com.mysql.jdbc.Driver                  //炸包的地址链接,用于连接数据库

url = jdbc:mysql://localhost:3306/mybase // 数据库地址

user=root

password=123456

配置未接创建位置:在项目的src目录下创建该配置未接,在编译时会将该配置文件自动复制到

bin目录中


Properties配置文件:使用类加载器加载文件

回忆Java的编译原理和内存机制

src下存放java文件,编译后生成class文件到bin目录下

src下的其他文件,编译后也会自动复制到bin目录下

程序运行时,要使用一个类,必须先加载类到内存中,所以就会使用  类加载器 将要用的类的字节码加载到方法区中

所以使用类加载器,同样可以找到bin目录下的其他文件

注意:在src目录下修改配置文件,内容会自动同步到bin目录中

但是不能直接删除bin目录下的配置文件,如删除则需要重新在src目录中创建配置文件

加载bin目录下文件的方式

1,获取类加载,获取某个类的字节码对象,通过字节码对象获取类加载器对象

ClassLoader classLoader = 类名.calss.getClassLoader();

2.使用类加载器对象加载配置文件,返回字节输入流

C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjmWQYniWIMLxajLby2efwEg/81cd567f06dc4e608e60974e2f612f1d/5df1186e9e6f4b0cb06c758b59700583.jpg

InputStream in = classLoader.getResourceAsStream("相当于bin目录的相对路径")//传入配置文件地址.

3.使用Properties加载输入流,获得键值对信息


C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjmWQYniWIMLxajLby2efwEg/a1fff8472dad4f2bb20d4387c83079d5/30d75e5ada484f9da7117e33150fcdaa.jpg

properties.load(in)


读取配置文件,连接数据库

回忆Properties

         String getProperty(String key):通过键获取值


DBUtils工具类介绍,三个核心类:一个更好的JDBC工具类

DBUtils

是Apache的Cimmons项目中的组件,用于接话JDBC的开发,和我们定义的JDBCUtils的目的一样,

简化开发.

三个核心类/接口

QueryRunner类:提供操作SQL语句的API

QueryRunner():创建对象

int update(Connection con, String sql, Object...param):执行INSERT,DELETE,UPDATE语句,同时传入占位符的参数值,是可变参数

       ResultSetHandler接口: 定义SELECT操作后对结果集的操作方法,可以将结果集转换为Java类

ArrayHandler类:将结果集的第一条记录封装到一个Object[]数组中.数组中的每一个元素就是该条记录中的每一列的值

ArrayListHandler类:将结果中的每一条记录都封装给Object[]数组中,再将这些数组风找到List<Object[]>集合中

BeanHandler类:将结果集中的第一条记录封装到一个指定的JavaBean中

BeanListHandler类:将结果集中的每一条记录都封装到一个指定的JavaBean中,再将这些

JavaBean封装到List<T>集合中

ColumnListHandler类:将结果集中指定的列的字段值,封装到一个List集合,用于竖向查一个列

ScalarHandler类:将结果集的第一条记录封装到一个Map钟.key是列名,value是第一条记录的每个字段的值

MapListHandler类:将结果集的每一条记录封装到一个Map钟,key是列名,value是第一条记录的每个字段的值,然后再将这些Map封装到一个List钟

DbUtils类,用于关闭资源和事务处理

static void closeQuietly(Connection con):关闭连接,内部处理了异常











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2