一.数据库概述 1. 数据库的英文单词:DataBase 简称: DB 2. 什么是数据库? 用于存储和管理数据的仓库 3. 数据库的特点:
1.持久化存储数据的 2.方便存储和管理数据 3.使用了统一的方式操作数据库 -- SQL 4. 数据库软件和数据库的区别:
[] 里边的值可写可不写
二.mysql数据库
安装细节:报这个状态码2003(2005),安装软件时,没有管理员权限(以管理员身份运行安装程序)
第一步:以管理员命令打开DOS命令窗口
第二步:
卸载第四步:搜索regedit注册表,删除mysql相关注册表
数据库软件和数据库的区别:
配置 : Mysql服务启动\关闭 (每一个软件对应一个服务) 1.手动 2.mysql服务启动:cmd -->services.msc 再操作 3.Windows dos命令 net stop/start mysql (5 错误,因为权限不足) MySQL登陆 1.mysql -uroot -proot(默认登陆本地服务器) 2.mysql -hip (连谁写谁的ip) -uroot -p连接目标的密码 3. mysql --host=ip --user=root --password=连接目标的密码
mysql退出 exit quit(属于mysql操作命令,不属于sql语法) Mysql目录结构 mysql 安装目录
Bin:(二进制):exe ,bat 可执行文件 Conf configuration:(配置):核心配置文件:my.ini
lib:(图书馆,管理软件所需的jar包)比如:xxxjar Share:错误分享 mysql 数据目录 数据库:文件夹
表:文件(二维表格) 数据(表记录) Mysql,performance_schema不能对这两个数据库操作 MySQL服务器 硬件+软件 Mysql数据库安装好有三个文件夹(三个数据库)
三.sql指令(掌握)操作数据库使用统一的方式(sql指令)来操作所有的数据库 1. sql概述(结构化查询语言)
什么是SQL? 结构化查询语言(sql不仅能查询,还能进行添加,删除和修改操作(crud增删改查))
(定义了操作所有关系型数据库(英文单词)的规则(国际标准化组织制定的)) SQL通用语法 1. sql语句 2. 可 3. MYSQL数据库 4. 3种注释 单行注释:-- 注释内容(两个横杠,一个空格) # 注释内容(不用写空格)
多行注释: /* */(java文档注释) Sql常见的分类
DDL:数据库定义语言,作用:操作数据库/表,(表结构) 操作数据库:CRUD 1.C(Create):创建 创建 create database (if not exists)名称; 判断如果不存在则创建 指定字符集create database 名称 character set gbk; 2.R(Retrieve):查询
showdatabases 查询所有数据库的名称
(通过查询某个数据库的创建语句)可以查看某个数据库的字符集: show create database 数据库名称
安装好了目录下有4个文件夹(4个数据库)(其中一个不存在物理文件)
3.U(Update):修改 修改数据库的字符集(如果修改会造成已有数据混乱吗) alter database db3 character set utf8 (为什么不能写utf-8) 4.D(Delete):删除 删除数据库 drop databasedb3; 判断数据库是否存在,存在再删除数据库 Drop databaseif exists 数据库名 5.使用数据库
查询正在使用的数据库 操作表: 1.C(Create):创建 Creat table 表名 ( 列名1 数据类型1, 列名2 数据类型2, ... 列名n数据类型n );注意最后一列不加逗号
数据类型:1. int :整数类型 2.double(n,m) 小数类型 数据长度一共n位,小数点后面m位 3.日期类型 date:日期,只包含男月日, yyyy-MM-dd(数据必须添加进去,不添加没意义) 4.datetime: 日期,包含年月日时分秒 yyyy-MM-ddHH:mm:ss 5.时间戳类型 timestamp 包含年月日时分秒 yyyy-MM-ddHH:mm:ss 如果将来不给这个字段赋值,或者赋值为null,则默认使用当前系统时间来自动赋值 6.字符串 varchar(最多位数 小于等于) Create table 表名 like 被复制的表名;复制一个表 删除表 Drop (if exists )表名 第一行:表头行 2.R(Retrieve):查询 查询某个数据库中所有的表名称 showtables; 查询表结构 desc 表名; 3.U(Update):修改 1.修改表名 alter table 表名 rename to 新的表名; 2.修改表的字符集 showcreate table 表名 character set 字符集名称; 3.添加列 alter table 表名 add 列名 数据类型; 4.修改列名称 类型 alter table 表名 modify sex 新数据类型(只改类型) Alter table 表名 change 列名 新列名 新数据类型 5.删除列 alter table drop 列名 (列 , 表头 ,字段) 4.D(Delete):删除 DCL:数据库控制语言,作用:授权,(了解)
DML:数据库操作语言,作用:(操作数据,增删改表中的数据)对表中的记录(数据)进行添加,修改,,删除操作 1.添加数据: insert into 表名 (字段1,字段2,字段n) VALUES(数据1,数据2,数据n) Range(范围) 添加错会添加空值, 添加小数点超过范围的会发生精度损失, 注意事项:
1.列名和值要一一对应 2.如果表名后,不定义列名,则默认给所有列(不能少,少就会报错)添加值(不想写的值null ,时间戳的null会被替换为系统时间) 3.(日期默认格式以-分隔) 2.删除数据 delete form 表名 where 条件 如果不加条件(where-->),则删除表中所有记录(有多少条记录,就会执行多少次删除操作,效率比较低) 属于DDLTruncate table 表名; 推荐使用,效率更高删除表 ,然后再创建一个一模一样的空表 2. 修改数据 Update 表名 set 列名1 = 值1 ,列名2 = 值2... where 条件 如果不加任何条件,则会将所有记录全部修改
DQL:数据库查询语言,作用:(操作数据,查询表中数据)对表中的记录进行查询操作 语法: select 字段列表 From 表名列表 Where 条件列表 Group by 分组字段 Having 分组之后的条件 Order by 排序 Limit 分页限定 基础查询 1.多个字段的查询 Select * form 表名;(写*不方便阅读,显示所有字段 * 可以替换为一个或几个字段) 2.去除重复 select distinct (注意空字符) 查询出来的完全一样才去除,某一字段一样没用 3.计算列select name,math,english, math+english fromstudent; 如果有null参与的运算,计算结果都为null ifnull(表达式1,表达式2) 表达式1:哪个字段需要判断是否为null 表达式2:如果该字段为null后的替换值 select name,math,english, math+ifnull(english,0 as/(空字符,一个或多个) 总分 (起别名)from student; 第一个值为要判断的值 4.起别名 as (Alias)总分as也可省略 条件查询 模糊条件查询 分组条件查询 3. Sql操作数据库和表
注意: 1.字段 ,列名称,表头,都表示一个意思,都是表的Filed 2.字符集,编码格式,编码表,都表示一个意思,都是编码 常见的编码: Utf-8 万能的码表就,支持所有的字符 Gbk ,gbk2312,gb18030 中文的码表,支持中文,还支持其他字符,但不包含日文,韩文等 字符 Iso-8859-1 西欧的码表,支持西欧的字符,但不支持日文,韩文,中文等字符. 一. 单表查询(掌握) 条件查询: 1.Where子句后跟条件 2.运算符 > < <= >= = <> 不等于 Where age >=20 AND age <=30; Between and(betwwen 20 and 30) In(集合) Where age =22or,age =18 or age =25 Agein(22,18,25); Is (not)null(null值不能使用= /!=判断) And 或 &&(不推荐用符号) Or 或 || Not 或 ! 模糊查询 Like Like ‘黄‘ -->等于黄 // ename like (‘黄%’) % 匹配任意0到个任意字符 _表示任意一个字符 排序查询 语法: order by 子句 Order by 排序字段, 排序方式, 排序字段2,排序方式2 排序方式: ASC:(默认)升序 DESC:降序 注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件. 聚合函数查询 将一列数据作为一个整体,进行纵向的计算. Count:计算个数 Select count(ifnull(,)) from student; 解决方案: 1. 选择非空的列进行计算(一般用这个方法):主键(非空,唯一)
* 这条数据如果有值不为null则算作一条数据 2. Ifnull Select count(ifnull(,)) from student; Max:计算最大化 Min:计算最小值 Sum:计算和(排除null) Avg:计算平均值 注意:1.聚合函数里面的参数:表的字段 2.聚合函数的计算,排除null值(null值不参与运算) 3.聚合函数一般是对int类型的进行运算,其他类型没有意义 分组查询: 1. 语法:group by 分组字段; 2. 注意: (分组字段,要有共同特点) 1.分组之后查询的字段:分组字段/聚合函数 分组查询:查询的字段具有共同特点 Select sex, ang(math),count(id) fromstudent group by sex; Having count(id) >2; 2.where和having的区别? 1.where在分组之前进行限定,如果不满足条件,则不参与分组.having在分组之后进行限定,如果不满足结果,则不会被查询出来 2.where后不可跟聚合函数,having可以进行聚合函数的 Select 字段 把不符合的数据去掉,不参与下面分组 From 表名 Where 分组前条件判断 分组字段 Having 分组后的条件判断 Oredr by 排序字段 聚合函数一般放在放在分组后 分页查询 分页:数据太多,一次性查询出来,展示的效果不好,就是用户的体验不好.分页操作,不同的数据库分页基本原理不一样;(limit是一个mysql方言) Mysql: limit 进行分页,其他数据库不能使用limit进行分页
limt 开始的索引,每页查询的条数 (索引从0开始) 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数 二. 约束(掌握) 约束概述:一种规范(限制),数据库约束就是对表中的数据进行限定,保证数据的正确性,有效性,完整性. 数据库(mysql)约束分类: 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign key 非空约束:某一列的值不能为null 1.创建表时添加约束 2.创建表时在创建表头时后面添加not null 3.删除not null就是改变类型不添加. 4.添加not null alter table stu modify namevarchar(20) not null(duplicate 重复) 唯一约束:某一列的值不能重复 1. 在创建表时,添加唯一约束 2. 可以有nul,但是只能有一条记录为null 3. 删除 alter table stu drop index phone_number(与添加 not null 不同) 4. 在表创建完后添加唯一约束 (有重复记录无法添加) 主键约束:非空且唯一 1.注意:1.一张表只能有一个字段为主键 2.主键是表中记录的唯一标识 2. 1.在创建表时,添加主键约束 2.删除主键 alter table stu drop primary key 3.添加主键 (有重复记录无法添加) 3.自动增长(只对int类型,不一定是主键)
如果某一列是数值类型的,可以使用AUTO_INCREMENT实现自动增长 1.AUTO_INCREMENT 2.删除alter table stu modify id inf; 3.添加 外键约束:外间作用,让表与表之间建立关系,保证数据的的有效性,正确性. 外键特点: 1. 外键的值不能随便写(可以为null,但是没什么用) 2. 外键的值引用于另一张 (称重复数据为冗余的数据)让表与表之间产生关系 1.在创建表时,可以添加外键 Constraint(约束) 外键名称 foreign key (外键列名称) references(关联) 主表名称 3. 删除外键 Alter table employee dropforeign eky 外键名称; 1. 1对1(了解) 主表(子表)可以是任意一方 2. 1对多/多对1 主表:一方表 子表:多方表 3. 多对多 主表子表可以是任意一方(不推荐这样区分和设计外键) 外间设计原则: 级联操作 级联操作概述:只有表与表之间有关联关系,才能进行级联操作 三. 多表关联(掌握) 1.多表之间的关系 1. 1对1(了解) 2. 1对多/多对1 3. 多对多 四.数据库的设计范式(了解) 概念:设计数据库时,需要遵循的一些规范 数据库的备份和还原: 1. 命令行 备份语法: mysqldump -u用户名 -p密码 数据库名称> 保存的路径 还原: 1.登陆数据库 2.创建数据库 3.使用数据库 4.source 2. 图形化工具 一.JDBC:定义了操作所有关系型数据库的规则(接口) 1.概念:java database connectivity java数据库连接, java语言操作数据库 Jdbc本质:官方定义的一套操作所有关系型数据库的规则,即接口.各个数据库厂商去实现这套接口,提供数据库驱动jar包.我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类. 数据库驱动(实现类) 2.快速入门 1.步骤 1.导入驱动jar包 1.复制包到项目(建个目录) 2.右键-->add as library (真正将jar包加入到项目中) 2.注册驱动 Class.forname(“com.mysql.jdbc.Driver”) 3.获取数据库的连接对象 Connection 4.定义sql 5.获取执行sql语句的对象 statement 6.执行sql.接受返回结果 7.处理结果 8.释放资源 Denied 拒绝 Jdbc 常见的异常: Java.sql.Exception:Access denied for root@ 提示数据库的用户名或者密码错误 2.jdvc的api 1.java.sql.DriverManager(类):驱动管理对象 功能:1.注册驱动:把mysql在当前类启动起来 Static void registerDriver(Driver driver): 注册与给定的驱动程序DriverMangager 2.获取数据库连接拿到了连接对象:可以理解一座桥梁 当前代码和mysql的桥梁 方法: 参数: 2.java.sql.Connection(接口)数据库连接对象 3.java.sql.Statement(接口)执行sql的对象 4.java.sql.PreparedStatement(接口)执行sql的对象 5.ResultSet(接口)结果集对象 结果集概述:使用resultSet对象封装 第一类方法:next()方法:跳转到下一行,默认的位置是在第一行前边 跳转都最后一行的下面:没有数据,返回false,就不会继续向下跳转了 第二类方法: int 解决:代码冗余问题 1. 从加载驱动到获取连接对象
1.加载驱动Class.forName(“类名”)
2.通过DriverManager 2. 关闭资源closeResource 上面的工具类 问题1:获取连接对象的4个参数写死了 原因:后期在开发中.如果更换任意一个参数,需要修改源码,这种操作是不被允许的. 细节:在开发中,遵循一个OOP原则 对代码的修改是关闭的,对代码扩展是开放的. 解决方案: 步骤一:把四个连接参数配置到properties文件 步骤二:通过读取配置文件,获取四个参数,得到连接对象 SQL诸如问题:在拼接sql时,有一些sql的特殊关键字 为什么使用会出现sql注入问题? 原因:传递的参数会作为sql语句的一部分,进行拼接,而不仅仅时作为参数来使用 (可能会作为sql语句的一部分) 不会出现sql注入问题? 网络适配器 网卡 数据库连接池: 组建(spring的模板类:JDBCTemplate(crud操作)) 一. 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器.(存储和管理Connection对象的容器) 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时, 从容器中获取连接对象,用户访问完之后, 2.优点: 1.节约资源 == 在没有数据库池时,使用完Connection 以后,释放(销毁)Connection
如果从数据库连接池里面取Connection使用,使用完以后,归还给数据库连接池 2.用户访问高效(不用从系统申请) == 不用每次都创建连接对象,可以从数据库连接池 取 3.实现: 1.标准接口:DataSource java.sql包下 1.方法: 获取连接:getConnection() 归还连接:若果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接. 2.一般我们不去实现它,由数据库厂商来实现 1.C3P0:数据库连接池技术 2.Druid:(德鲁伊)数据库连接池实现技术,由阿里巴巴提供 数据库连接池:需要自己初始化Connection,存到池子里(在配置文件里) 数据库连接池,初始化连接对象时,需要导入数据库驱动包 -------需要4个参数,配置文件里 4.C3P0 使用步骤 1.导入jar包 (两个) 2.定义配置文件 名称:c3p0.properties 或者c3p0.config.xml 路径:直接刚在直接放在src目录下即可(自动加载) 3.创建数据库连接池对象 不传参数使用默认config,传参数使用指定名称配置 (对应名称 name的属性值) 4.获取连接对象 5.Druid: 步骤: 1.导入jar包 ,数据库驱动jar包 2.定义配置文件 Properties 可以叫任意名称,可以放在任意目录下,手动加载 3.加载配置文件 Properties 4.获取数据库连接池对象:通过工厂类来获取DruidDataSourceFactory 5.获取连接:getConnection (连接主机 地址值可以省略) Spring提供的模板类: JDBCTemplate 模板类概述: 本质也是类,作用:操作数据库,非常简单方便
Spring JDBC Spring框架对JDBC的简单封装.提供了一个JDBCTemplate对象简化 JDBC的开发 步骤: 1.导入jar包(5个) 2.创建对象JdbcTemplate对象.依赖于数据源DataSource 一般只写一个参数 3.调用JdbcTemplate方法来完成crud操作 Update():DML,增删改语句 如果有?值 , template.update(sql,写问好1对应的值,问号2对应的值)) !!!问号1,问号2 为一个可变参数,编译的时候会被封装成1个数组,所以可以直接写成一个数组 queryForMap:()查询结果将结果集封装为map集合 (这个方法查询的结果集只能是1行,将列名作为key,将值作为value) 如果有?值 , template.queryForMap(sql,写问好1对应的值,问号2对应值) queryForList:()查询结果将结果集封装为list集合 query:查询结果,将结果封装为JavaBean对象 query(sql, new RomMapper<要封装成的类型>(类型.class)) query的参数:RowMapper(BeanPropertyRowMapper)实现类, 可以完成数据到JavaBean的自动封装 queryForObject:查询总记录数 一般用于聚合函数的查询 第二个参数传递封装的返回值结果类型(的class) template.quetyForObject(sql,)
classcastException 类型转换异常
ctrl + p 查看参数类型 Select count (id/*) 查询总数 Conver null to bonus 查询报错
|