数据库
存储数据的仓库,本质是一个文件系统,数据按照指定的格式将数据存储起来,
用户可以对数据库中的数据进行增删改查.
数据表和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 值,限制该列记录如果没有插入值,这使用默认值
排序查询
是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的实现类
数据表与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语句,同时传入占位符的参数值,是可变参数
- <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params): 执行SELECT查询, 并根据传入的结果集处理器来处理结果
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):关闭连接,内部处理了异常