1.介绍
关系型数据库:(SQL)
MySQL ,Oracle ,Sql Server,DB2,SQLLite
通过表和表之间,行和列之间的关系进行数据的储存,学院信息表,考勤表……
非关系型数据库:(NoSQL) Not Only
Redis,MongDB
非关系型数据库,对象储存,通过对象自身属性来决定。
DBMS(数据库管理系统)
数据库管理软件,科学有效的管理数据,维护和获取
2.基本命令
连接数据库
mysql -u root -p*****(密码,没空格)
修改密码:
updata mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
刷新权限:
flush privileges
查看所有数据库
show databases
切换数据库:
use 数据库
查看数据库中的表
show tables
查看表中数据
describe 表名
创建数据库
create database 表名
数据库语言有以下几种:
- DDL 定义
- DML 操作
- DQL 查询
- DCL 控制
3,操作数据库
创建数据库---如果没有就创建
create databases if not exists 数据库名
删除数据库
drop database if exists gao;
创建表
create table Gao(
ID char(4) primary key, --这里的主键设置不要在后面写
NAME char(4) not null)charset=utf8; --设置编码格式
删除表
drop table if exists 表名;
显示表的结构
desc 表名;
修改表名
alter table 旧表名 rename as 新表命;
增加表的字段
alter table 旧表名 add 新表名 int(4);
修改表的字段
alter table 表名 modify 字段名 需要修改的约束/类型; --修改约束
alter table 表名 change 旧字段名 新字段名 字段类型; --字段重命名
删除表的字段名
alter table 表名 drop 字段名
4.数据类型
数据
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准整数 4个字节
- bigint 较大的数据 8个字节
- float 浮点数 4个字节
- double 浮点数 8个字节
- decimal 字符串形式的浮点数 金融计算的时候 使用
字符串
- char 字符串固定大小的 0~255
- varchar 可变字符串 0~65535 常用的变量 String
- tinytext 微型文本 2^8-1
- text 文本串 2^16-1 保存大文本
时间日期
- data YYYY-MM-DD,日期格式
- time HH:mm:ss 时间格式
- datatime YYYY:MM-DD HH:mm:ss 最常用时间格式
- timestamp 时间戳 1970.1.1 到现在的毫秒数
- year 年份表示
null
- 没有值,未知
- NULL进行运算结果为NULL
5 数据管理
5.1 DML语言(数据操作语言)
5.1.1 插入
1.values 后可以有多个值用逗号隔开;
2.如字段名是键值,则键值不能重复;
3.字段名可以省略,直接写插入值
4.注意字段名/表名不能和关键字相同,可以用单引号区分
insert into 表名 ([字段名1,字段名2,字段名3……]) values('值1',‘值2’);
5.1.2 修改
update 表名 set '字段名' = '修改值' where 条件
5.1.3删除
delete from '表名' where 条件
truncate 表名
5.1.4 查询
去掉重复
select distinct 字段名 from 表名
连表查询
分页显示:
limit 起始页,页面大小 --(几条数据)
5.2 MD5 数据加密
不可逆
update 表名 set 字段名 = (字段名) where id=1;--后面的是条件
6 事务
6.1 事务介绍
原子性:
要么一起成功,要么一起失败
一致性:
事务前后的数据完整性要保证一致;
持久性:
事务一旦提交则不可逆,被持久化到数据库中
隔离性:
事务的隔离性是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其他事务的操作数所干扰,事务之间要相互隔离;
不隔离所导致的问题
脏读:
一个事务读取了另外一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某行数据,多次读取结果不同,(不一定时错误,只是某些场合不对)
虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
6.2 事务的操作
mysql 是默认开启事务自动提交的
set autocommit = 0 --关闭自动提交
set autocommit = 1 --开启自动提交
手动处理事务
start transaction --一个事务开始,从这里之后的sql都在同一个事务内
手动提交
commit;
回滚
rollback; 事务出现错误,回滚会回到原来样子;
设置保存点名(可有可无)
savepoint 保存点名字;
rollback to save 保存点名; --回滚到指定保存点
6.3 索引
6.3.1 索引介绍
索引(Index)是帮助MySQL高效获取数据的数据结构;
6.3.2 索引的分类
- 主键索引 (primary key)
唯一标识,主键不可重复,只能有一个列作为主键
- 唯一索引 (unique key)
避免重复的列出现,可以重复,多个列都可标记为唯一索引
- 常规索引 (key/index)
默认的,index,key 关键字设置
- 全文索引 (FullText)
在特定的数据库引擎下才有,MylSAM
快速定位数据
6.3.3 索引的使用
创建表时添加索引:
show index from 表名; --显示所有的索引信息
6.3.4 索引规则
- 索引不是越多越好
- 不要对进程变动数据加索引
- 小数据量的表不加索引(500万上)
- 索引一般加在常用来查询的字段上
索引数据结构:
Hash 类型的索引
Btree : innoDB的默认数据结构
7.权限管理和备份
导出:mysqldump
mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置
导入:source
mysql -u用户名 -p 密码 库名 < 备份文件
8.JDBC
8.1.JDBC介绍
提取码:tr8b
项目里创建文件lib,将JDBC驱动放到里面然后,右键add as library,然后点ok
package text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcFirst {
public static void main(String[] args) throws Exception {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
// url
/*
* jdbc:mysql 数据库
* 主机地址
* 端口号
* 数据库名
* 参数useUnicode
* characterEncoding 字符集
* useSSL 加密方式
* */
String url = "jdbc:mysql://localhost:3306/gao?useUnicode=true&characterEncoding=utf8&useSSL=true";
//用户信息
String username = "root";
String password = "密码";
//连接成功,数据库对象 Connection 代表数据库
Connection connection = DriverManager.getConnection(url,username,password);
//Statement执行SQL的对象 PrepareStatement 执行sql对象
Statement statement = connection.createStatement();
//执行SQL的对象 去执行SQL,
String sql = "select * from test1";
//返回结果
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id" +" " + resultSet.getObject("id"));
System.out.println("name" +" " + resultSet.getObject("name"));
System.out.println("zi" +" " + resultSet.getObject("zijin"));
System.out.println("=============================================");
}
//释放连接
resultSet.close();
statement.close();
connection.close();
}
}
8.2 statement对象
jdbc中的statement对象用向数据库发送SQL语句,像完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查
增删改 使用:Statement.executeUpdate()
查 使用:Statement.executeQuery();
8.3 工具类
src下的目录都可以通过反射拿到
在src目录下的创建file文件------db.properties
配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/gao?useUnicode=true&characterEncoding=utf8&useSSL=true username=root password=Aaqwe123
工具类(通过反射获取配置文件信息)
package utils;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username= null;
private static String password = null;
static {
try{
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties =new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
Class.forName(driver);
}catch (Exception e){
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws Exception{
return DriverManager.getConnection(url,username,password);
}
//释放资源
public static void release(Connection conn, Statement st, ResultSet rs){
if (rs!=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if (st!=null){
try {
st.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if (conn!=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
使用:
package utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestInstert {
public static void main(String[] args) {
Connection conn = null;
Statement st =null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();//获取数据库连接
st = conn.createStatement();//获得SQL的执行对象
String sql = "insert into test1(id,name,zijin)"+"values(4,'gao',11)";
int i = st.executeUpdate(sql);
if (i>0){
System.out.println("插入成功");
}
}catch (SQLException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn,st,rs);
}
}
}
8.4 SQL注入
例如:输入用户名和密码时
输入:‘or ’ 1 = 1
输入:‘or ’ 1 = 1
可以直接盗取到服务器里所有的,账号密码
原因是判断语句:
select * from user
where 'name' = 账号 and password = 密码;
问题解决:使用安全的PreparedStatement对象
可以防止SQL注入并且效率更高;
预编译SQL
package utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestInsert_prepareStatement {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
try{
conn = JdbcUtils.getConnection();
//和Statement写法区别
//使用? 占位符代替参数
String sql = "insert into test1(id,name,zijin) values(?,?,?)";
st = conn.prepareStatement(sql);//预编译,先写sql,不执行
//手动给参数赋值
st.setInt(1,5);//第一个数为第几个?(占位符)第二个为参数
st.setString(2,"prepare");
st.setInt(3,1111111);
//注意:sql.Date 数据库的时间
// util.Date java时间
int i = st.executeUpdate();
if (i>0){
System.out.println("插入成功!");
}
}catch (SQLException e ){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn,st,null);
}
}
}
8.5 IDEA连接数据库
如果右侧没有database,在左下角有个标志点一下
如果出现not found jdbc 这个事没安装数据库驱动,可以导入或者安装,我这个时直接提示了,可以直接点download
然后会进入下面页面
连接成功!
8.6 IDEA操作事务
package test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ShiWu {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
//关闭数据库的自动提交,自动会开启事务
conn.setAutoCommit(false);//开启事务
String sql1 = "update test1 set zijin = zijin-10 where id = 1";
st = conn.prepareStatement(sql1);
st.executeUpdate();
String sql2 = "update test1 set zijin = zijin+10 where id = 2";
st = conn.prepareStatement(sql2);
st.executeUpdate();
conn.commit();
System.out.println("成功");
} catch (SQLException e) {
try{
conn.rollback();
}catch (SQLException ee){
ee.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
8.7 数据库连接池
数据库连接——>释放十分浪费资源
池化技术:准备一些预选的资源,过来就连接预先准备好的
最小连接数,最大连接数,等待超时