笔记 数据库基本概念
数据库分类
关系型
mysql
oracle
db2
非关系型
redis
DBMS 数据库管理系统
数据库结构
数据库
-->表(列)
-->数据
sql分类
DDL(数据库和表的操作)
DML(数据的增删改)
DQL(数据的查询)
DCL(DBA)
数据类型
VARCHAR(长度)
CHAR(长度)
TEXT
DATE
DATETIME
TIMESTAMP 默认当前系统时间
约束
主键 AUTO_INCREMENT
外键 FOREIGN_KEY
非空 NOT NULL
唯一 UNIQUE
多表的关系
1对1
1对多
多创建外键指向一主键
多对多
中间表2列作为(外键/联合主键)分别指向其他2个主表的主键
MYSQL
安装卸载
net start mysql
net stop mysql
netstat -ano | findStr "3306"
taskkill /F /PID mysql的进程id
sqlyog工具使用
--------------------------------------------
DDL
数据库
CREATE DATABASE 数据库名 CHARACTER SET utf8
DROP DATABASE 数据库名
SHOW DATABASES
SHOW CREATE DATABASE 数据库名
SELECT DATABASE()
USE 数据库名
表
CREATE TABLE 表名(列名 数据类型 约束,列名 数据类型 约束)
DROP TABLE 表名
SHOW CREATE TABLE 表名
SHOW TABLES
DESC 表名
ALTER TABLE 表名 ADD 列名 数据类型 约束
ALTER TABLE 表名 DROP 列名
ALTER TABLE 表名 MODIFY 列名 数据类型 约束
ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 约束
ALTER TABLE 表名 CHARACTER SET utf8
RENAME TABLE 表名 TO 新表名
TRUNCATE TABLE 表名
DML
INSERT INTO 表名(列名...) VALUES(值...)
DELETE FROM 表名 WHERE 条件
UPDATE 表名 SET 列名 = 值 WHERE 条件
DQL
单表
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名 ASC/DESC LIMIT 索引,多少条 --
多表
内连接
隐式
SELECT 列名 FROM 表名1,表名2 WHERE 关联条件 AND 条件
显式
SELECT 列名 FROM 表名1 JOIN 表名2 ON 关联条件 WHERE 条件
外链接
SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 关联条件 WHERE 条件
SELECT 列名 FROM 表名1 RIGHT JOIN 表名2 ON 关联条件 WHERE 条件
子查询
所有的子查询必须在“()”中编写
子查询在操作中有三类:
单列子查询:返回的结果是一列的一个内容
单行子查询:返回多个列,有可能是一个完整的记录
多行子查询:返回多条记录
查询嵌套查询
条件: 单行单列,多行单列
虚拟表 多行多列
事务
START TRANSACTION;
COMMIT;
ROLLBACK;
事务的特点
开启事务 : transaction
Q提交事务/回滚操作: commit/ rollback
事务提交方式:
mysql默认自动提交事务,oracle默认手动提交w't
*事务提交的方式:
*自动提交
*手动提交
*事务提交方式变更:
查询 select @@autocommit --1代表自动,0代表手动;
变更 set @@autocommit 1/0
四大特性:
原子性:是不可分割的最小单位,要么同时成功,要么同时失败
持久性:事务一旦提交或者回滚数据库会发生持久化的保存数据
隔离性:多个事务之间.相互独立.
一致性:事务操作前后,数据总量不变.
事务的隔离级别:
*多各事务同时操作一批数据,会引发并发问题
*存在问题:
1.脏读:一个事务,读取到另一个事务中没有提交的数据:
2.虚度:在同一事务中,了两个读取到数据不一样
3.幻读:一个事务操作(DML)le
*隔离级别:
1.read uncommited: 读未提交 问题:脏读,不可重复读,虚读,幻读(效率高,但是非常不安全)
2.read commited: 读已提交 问题:不可重复读,虚读,幻读
3.repateable read: 可重复读 问题:虚读,幻读
4.serializable: 串行化 没有问题,但是效率太低
*注意:隔离级别从小到大安全性递增,效率递减;
jdbc
概念
一套接口(java提供的规范) --> 要求厂商自己实现操作各自数据库的 驱动
面向接口编程
1.注册驱动
2.获取连接
3.创建sql和执行sql的对象
4.执行sql获取结果
5.处理结果
6.释放资源
ps:
1.ResultSet的遍历
while(rs.next()){
rs.getObejct(1);
rs.getObejct("列名")
}
2.sql注入
使用 PrepareStatement 配合占位符 ?
pst.executeQuery() --> 没有参数
pst.executeUpdate() --> 没有参数
3.事务
conn.setAutoCommit(false);
conn.commit()
conn.rollback();
连接池
C3P0
接入步骤:
1.导jar
1.c3p0 2个
2.mysql驱动
2.导入配置文件(src目录下)
c3p0-config.xml
3.使用
DataSource dataSource = new ComboPooledDataSource();
Connection con = dataSource.getConnection();
DRUID(德鲁伊)
接入步骤
1.导jar
1.druid
2.mysql驱动
2.导入配置文件(src)
druid.properties
3.使用
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
DataSource dataSource = DruidDataSourceFactory.createDataSoure(pro)
Connection con = dataSource.getConnection();
JdbcUtils实现思路
1.获取数据源(连接池) DataSource
2.获取连接对象 Connection
3.释放资源 重载
思路:
1,2:
DataSource在类加载的时候就应该初始化,为了保证对象能够及时创建,在 static{} 静态代码块中创建的对象
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
dataSource = DruidDataSourceFactory.createDataSoure(pro)
提供返回数据源的方法 getDataSource() ---> return dataSource
提供返回连接 getConnection() ---> return dataSource.getConnection()
3:
在关闭之前做非空判断!!!
JdbcTemplate
SPRING (基于jdbc来简化数据库的操作)
!!!如果有占位符需要传入参数
DataSource dataSource = new ComboPooledDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
增删改
template.update("sql",[具体参数]);
查询
单条结果
Map<String,Object> map = template.queryForMap("sql",[具体参数]);
Bean bean = template.queryForObject("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
多条结果
List<Map<String,Object>> list = template.queryForList("sql",[具体参数]);
List<Bean> list = template.query("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
|
|