数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)
- 2.DDL/DML:char不用动态变化,效率高
- 3.DQL:select(相当于System.out)第一个但在倒数第二执行
- 4.约束和自增长:字段约束(字段的赋值规范)/主键约束(唯一非空且一张表只有一个主键)
- 5.单表缺点和外键约束:多从外 引出
- 6.三种多表关系:中间表两外键:一对一(简历),一对多(员工,部门),多对多(学生,课表)
- 7.多表查询:表..join表on
- 8.子查询:优先于主查询产生结果
- 9.事务:一组操作,要么同时成功,要么同时失败
- 10.四个接口:左java.sql包下的DCSR,右com.mysql.jdbc.Driver
- 11.释放资源:finally,工具类封装
- 12.JDBC事务操作:conn.setAutoCommit(false)
- 13.登陆案例: ' " +name+ " '
- 14.登陆案例的预编译改造:PreparedStatement,setString,executeQuery
- 15.c3p0连接池:jdbc2.0才引进连接池,不是线程池(连接池的技术标准就是DataSource替代DriverManager)
- 16.类加载器路径:is = classLoader.getResourceAsStream()
- 17.druid连接池:自动ds.set
- 18.execute/update方法:template =
- 19.queryForXX方法:Map.Entry < String, Object > ,Map < String, Object > 两个数据类型
- 20.query方法:获取类并反射得到方法,rowMapper作为参数传入query方法
- 21.redis安装:加载.conf
- 22.操作:set/get,push/pop,add/rem
- 23.持久化策略:存文件,.aof和.rdb文件删了,数据库里数据全没了
- 24.Jedis:java程序连接redis,拿到jedis
- 25.案例_好友列表:json = om.
- 26.总结:存储过程(PL/SQL代码集,像没有返回值的自定义函数)和函数需要用户显示调用才执行,而触发器是由一个事件来触发运行,当某个事件发生时会自动地隐式运行,不能被显示的调用。冒泡,二分查找,sql多用group by
1.mysql安装:存储:集合(内存:临时),IO流(硬盘:持久化)
1.1 服务端:双击mysql-installer-community-5.6.22.0.msi
mysql安装包:链接:https://pan.baidu.com/s/18Ctus6BLVrECZP0W-QKtfw 提取码:94s9。
上面next,execute安装后,下面开始配置。
1.2 客户端:命令行输入mysql -u…实际是如下安装路径的bin文件夹的mysql.exe
命令行java -version要配环境变量,看mysql有没有运行,只能从任务管理器看有没有mysql的进程。
win下cmd输入:完整版没有括号:mysql -h(host)
127.0.0.1 -P(port)
3306 -u(username)
root -p(password)
。简略版:mysql -u root -p。
可视化工具navicat链接:https://pan.baidu.com/s/11qAEA7yEGSIz6J9GIC_S6A 提取码:1w9n。navicat免安装链接:https://pan.baidu.com/s/1zanhYyyNsUXajI-czfW7KA 提取码:om5g。
2.DDL/DML:char不用动态变化,效率高
如下中间蓝框里一个数据库相当于一个excel表
,紫色框里一个table相当于excel表里的一个sheet
。use 数据库相当于双击打开excel表格,select查看函数返回值,desc全称description,like复制表结构,change 旧字段 新字段 新类型
。
数据库名字不建议修改,用数据库备份改名(新建一个数据库,把原数据库数据复制过来)。mysql中utf-8中-无法识别,用utf8。ISO-8859-1用latin1。
注意(),逗号,分号。
如下数(整小)日字
,oracle两个不同:number包含整小,varchar2。
选用timestamp而不用datetime,因为datetime不会自动设置时间。
int(11)默认11位不用写出来,2147483647即21亿10位
,如果有负数还有最前面一位是符号位,所以一共11位
。
如下是表记录,select非常多,删除只是记录,表结构还在。
DDL后面不需要加from等词,D【cdat】CM【idu】Q。
如下单引号可加可不加。
如下要写两个add。
3.DQL:select(相当于System.out)第一个但在倒数第二执行
如下3中第一排序字段相同的里面再进行第二排序。
如下查询id是1或3或5的学生。
d低下降,只要有数字都比null大。
如下有英语成绩有6个,不能代表总人数,缺考没算入。
select后的第一个字段要和group by后同。
如下是select语句执行顺序,红字书写顺序必须这样。
sql只有一种情况报错:语法写错。如下索引越界不会报错。
page和count是前端传来的两个参数,count不用变。
数量(count(*))降序只要一个(limit 1)。
如下将db3数据库整个连数据备份,本质create,insert。
记住mysqldump和source。
4.约束和自增长:字段约束(字段的赋值规范)/主键约束(唯一非空且一张表只有一个主键)
如下验证主键唯一和非空
,如下两个框都报错。
如下的Null列表示是否允许为空。
5.单表缺点和外键约束:多从外 引出
多表是外键约束的前提,外键约束解决下面多表的2个问题,add…多了一条线。alter table emploee drop foreign key
fk_001。
如上是在已有表添加外键,如下建表就添加(开发中常用)。
如果要删除department表的id为001即整个研发部门,需要先在employee表中删除id=001的很多记录,很麻烦。现在想要删除department的001部门时employee为001的行也一起删了,所以用外键级联操作
,如下create table …中省略同上。
6.三种多表关系:中间表两外键:一对一(简历),一对多(员工,部门),多对多(学生,课表)
7.多表查询:表…join表on
CREATE DATABASE day03;
USE day03;
-- 创建部门表
CREATE TABLE dept (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dept_id INT
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
如下要查出有用的记录需要emp.dept_id(emp外键)=dept.id(dept主键)。
因为select * ,所以将两个橙色横框拼接起来,棕色框。
7.1 外连接:左外=左表+内连接
如下注意记住左表不动。
如下第一个内连接没有销售部(销售部没有和员工表任何数据相交),第二个有销售部。
union all不去重,左外连接+右外连接。
8.子查询:优先于主查询产生结果
如下执行两句sql,要连接两次数据库,子查询一般要写在()里。
如下1,2是dept_id,可以把in换成 = any
。
如下第一行和第二行效果相同。
如下两个select等价。
如下还是写上面的题目,如果用内连接,沙僧会没有,左外或右外连接都可以。
如下将上面的id1列去除(即将dept表的id列去除不显示)。
on比where先执行。
-- 11111111111111111111111111111111111111111111111111111111111111111部门表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- 部门id
dname VARCHAR(50), -- 部门名称
loc VARCHAR(50) -- 部门位置
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');
-- 1111111111111111111111111111111111111111111111111111111职务表,职务名称,职务描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');
-- 11111111111111111111111111111111111111111111111111111111111111111111员工表
CREATE TABLE emp (
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
job_id INT, -- 职务id
mgr INT , -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
dept_id INT, -- 所在部门编号
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);
-- 1111111111111111111111111111111111111111111111111111111111111111工资等级表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY,
losalary INT,
hisalary INT
);
-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
如下以dept为主体,分组后再进行count聚合。
因为d.id是主键唯一,所以用group by d.id,效果如下。
坑1:如上财务部没人也需要写0,所以如下用外连,如下第一个sql产生效果同上面第一个,就多了财务部一行。
count(*)是整行记录。
9.事务:一组操作,要么同时成功,要么同时失败
如下若在执行一次sql前执行一次start transaction,若不commit,刷新数据库不显示。
10.四个接口:左java.sql包下的DCSR,右com.mysql.jdbc.Driver
如下jdbc是父类引用。
如下mchange. .和c3p0. .一起。第一个导入的是mysql-connector…。
如下代码第一行new Driver()是导入com.mysql.jdbc(用mysql实现好的,就是上面导入的mysql-connector..jar包)
而不是java.sql(自己不会重写抽象方法)下,参数是接口类型需要传入接口的实现类对象即new Driver()。
registerDriver相当于set方法,get获取的是mysql.Driver.connect方法返回的Connection类即com.mysql.jdbc.JDBC4Connection(有mysql.的都是导入的jar包)。
加载DriverManager这个类用到打破双亲类加载:DriverManager是jdk自带的类,DriverManager类使用的是bootstrap引用类加载器。数据库是用户类用bootstrap加载不合适,所以DriverManager去加载h2的Driver需要把当前引用类加载器替换为当前系统或当前线程的应用app类加载器。
package com.itheima01.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.*;
public class JdbcDemo
public static void main(String[] args) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException
//1. 注册驱动 (注意: 导入的mysql的驱动)
/*
* A. 查看mysql.Driver源码: 点new Driver()中Driver看源码
* 发现static 代码块里 已经注册了驱动 -> 驱动自注册 相当于set一次就行
* 带来问题: 外部的注册没有意义(重复注册)
*
* 解决: 保证mysql.Driver类被加载(静态代码块就会执行),如下两种方案:
* 1. 创建对象
* 2. 反射:a. 节省内存
* b. 跟驱动包的关联只剩一个字符串:"com.mysql.jdbc.Driver"
* 待会将字符串写入配置文件,只要改配置文件就行 就会跟 mysql驱动包的彻底解耦
*/
//111111111111111111111111111111111111111111111111111111111111111111111111111111111111
// DriverManager.registerDriver(new Driver()); //这行重复注册,下行new了就会加载 源码里的静态代码块,所以这行=下行
//new Driver(); // Class对象 + 普通实例 //只要用了这个类,这个类就会被加载内存中方法区 //自动导包
// new Driver()的内存消耗等价于下面两行: 其实只需要calss对象,不需要实例
// Class<?> clazz = Class.forName("com.mysql.jdbc.Driver"); //获取这个类的class对象
// Object obj = clazz.newInstance(); //利用class对象调用其空参构造来创建一个实例
Class.forName("com.mysql.jdbc.Driver"); //获取Class对象,没有普通实例,因为普通实例没有意义 //用反射,com.mysql.jdbc.Driver这个类也会被加载
//111111111111111111111111111111111111111111111111111111111111111111111111111111111111
//2. 获取连接
/*
* 只要涉及两个软件通信 : 网络三要素(必要非充分:一定要,但是有它们三不一定够如多了资源位置)
* 1. 协议 : jdbc:mysql (主协议:子协议)
* 2. ip : 数据库所在的计算机(自己:localhost或127.0.0.1)
* 3. port : mysql数据库3306
* 资源位置: 数据仓库的名称
*
* 协议://ip:port/资源位置
* https://www.baidu.com:443
*/
// String url = "jdbc:mysql://localhost:3306/day03"; //day03是数据库
String url = "jdbc:mysql:///day03"; //ip:localhost port:3306 可以省略
String user = "root";
String pwd = "1234";
Connection conn = DriverManager.getConnection(url, user, pwd);
System.out.println("conn:" + conn); //引用类型打印地址
//1111111111以上是关于数据库1mysql安装,DDL/DML,DQL,外键约束,多表/子查询,事务,登陆案例,预编译,连接池,jdbcTemplate方法,redis安装,操作,持久化,Jedis,总结的主要内容,如果未能解决你的问题,请参考以下文章