数据库
Database
mysql中严格意义上,数据库称为schema(命名空间)
-
数据库的操作是没有大小写区别的
-
create database 数据库名称; 创建一个数据库
-
可以创建N个数据库名,数据库名在服务器中必须是唯一的,并且符号标识符规范:
- 可以是字母、_、@、#
- 但是在5.0之后满足Java的辨识符规范加了$
-
drop database 数据库名称 删除数据库
-
use 数据库名称 使用数据库
Table
create table 表名(
字段 字段类型(字段长度) 默认值
) 创建一个表
row 行
日期和时间数据类型
Mysql数据类型 | 含义 |
---|---|
date ☆ | 3字节,日期,格式:2014-09-18 |
time | 3字节,时间,格式:08:42:30 |
datetime ☆ | 8字节,日期时间,格式:2014-09-18 08:42:30 |
timestamp | 4字节,自动存储记录修改的时间 |
year | 1字节,年份 |
整型
Mysql数据类型 | 含义(有符号) |
---|---|
tinyint | 1字节,范围(-128~127) |
smallint | 2字节,范围(-32768~32767) |
mediumint | 3字节,范围(-8388608~8388607) |
int ☆ | 4字节,范围(-2147483648~2147483647) |
bigint | 8字节,范围(±9.22*10的18次方) |
浮点型
Mysql数据类型 | 含义 |
---|---|
float(m, d) | 4字节,单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节,双精度浮点型,m总个数,d小数位 |
decimal(m, d) ☆ | decimal是存储为字符串的浮点数 |
字符串数据类型
Mysql数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) ☆ | 可变长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
clob 字符对象
blob 字节对象 啥都可以存
自增长机制
auto_increment (只针对于int类型)
数据完整性
-
可靠性+准确性=数据完整性
-
主键约束(Primary Key)
主键(Primary Key)是表中的一到多个列,主键列不能为空,也不能重复。 -
唯一约束(Unique)
唯一约束是指给定列的所有值必须唯一,该列在表中每一行的值必须唯一。它和主键约束的区别在于该列可以为空,并且可以在一张表中给多个列设置唯一约束
Column(字段名)
Create Table My_class select *from t_class
更新操作
update 表名 set 字段名=修改的字段值 where 字段名=字段值
delete 删除数据
select 查询操作
like 模糊查询
select distinct 列 from 表名 去除重复的
and的优先级默认比 or高
select * from mohaoyi where age is not
null; 查询不为null的
order by 排序
varchar 用字典排序
group by 分组
外键处理
外键并不约束空值问题
-
in 包含于什么
-
not in 不属于
-
all
-
any
-
在GROUP BY 中嵌套
GROUP BY中嵌套和SELECT中嵌套类似,要求子查询只能返回单行单列值。 -
在HAVING中嵌套
HAVING中嵌套子查询和WHERE中嵌套子查询类似,只是能用到聚合函数。 -
在ORDER BY 中嵌套
ORDER BY中嵌套子查询和SELECT中嵌套子查询类似,要求子查询只能返回单行单列值。上面三个位置嵌套子查询实际作用不大,因此很少会用到。
Join
企业标准写法
select
xs.xing_ming,bj.ban_ji_ming_cheng
from
xue_sheng as xs join
ban_ji as bj
where
xs.ban_ji_id = bj.id;
-
内连接 inner join inner可以省略
-
左连接 left join 左表内的数据全部要显示,即使没有与右表有关联
-
new() 生成当前时间
-
limit 完成分页操作
-
limit a,b
-
a代表从什么下标开始
-
b表示显示多少条
JDBC
statement对象的JDBC
public static void main(String[] args) throws Exception {
String driver="com.mysql.jdbc.Driver";
//加载驱动
Class.forName(driver);
String url="jdbc:mysql://localhost:3305/maple?useSSL=false";
String user="root";
String password="123456";
//数据库连接池
Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select id, name, password, sex from yue");
while (resultSet.next()){
String string = resultSet.getString("id");
System.out.println(string);
}
resultSet.close();
statement.close();
}
使用statement 对象效率低
PreparedStatement对象
public static void main(String[] args) throws Exception{
String driver="com.mysql.jdbc.Driver";
//加载驱动
Class.forName(driver);
String url="jdbc:mysql://localhost:3305/maple?useSSL=false";
String user="root";
String password="123456";
//数据库连接池
Connection connection = DriverManager.getConnection(url, user, password);
//预处理执行集必须先放sql
PreparedStatement ps = connection.prepareStatement("select id, username, password from users where id=?");
ps.setInt(1,2);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString("username")+" "+resultSet.getString("password"));
}
ps.close();
connection.close();
}
统一提交测试
public static void main(String[] args) throws Exception{
String driver="com.mysql.jdbc.Driver";
//加载驱动
Class.forName(driver);
//&rewriteBatchedStatements=true 开启统一提交
String url="jdbc:mysql://localhost:3305/maple?useSSL=false";
String user="root";
String password="123456";
//数据库连接池
long starTime = System.currentTimeMillis();
Connection connection = DriverManager.getConnection(url, user, password);
connection.setAutoCommit(false);
//预处理执行集必须先放sql
Statement statement = connection.createStatement();
for (int i = 1200000; i <1300000 ; i++) {
statement.addBatch("insert into users(username, password) VALUES ('"+i+"','"+i+"')");
}
statement.executeBatch();
connection.commit();
System.out.println(System.currentTimeMillis()-starTime);
statement.close();
connection.close();
}
数据库事务
Transaction 事务
- 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要不完全不执行。
- 事务处理可以确保除非事务性单位内的所有操作都成功完成,否则不会永久更新面向数据的资源。
- 通过将一组相关操作组合为一个要么全部成功或者全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
- 一个逻辑工作单位要成为事务,必须满足所谓的ACID(原子性,一致性,隔离性和持久性)属性。
- 事务是数据库运行中的逻辑工作单位,有DBMS中的事务管理子系统负责事务的处理。
一句话整理事务的意义:要么全成功,要么全失败。
开发中,如果遇到同时需要操作多条SQL时(增、删、改),一定要使用事务。
-
setAutoCommit() 设置自动提交 true表示开启 ,false 不自动提交
-
commit() 提交
-
rollback() 回滚 catch默认在事务出错时调用rollback
什么时候开启事务管理?
- 多SQL批量处理
- 增删改的时候才使用,而查询没有事务
- 反则推知:单条事务不需要事务处理
原子性(Atomicity)
- 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
- 通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。
- 如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
一致性(Consistency)
- 事务在完成时,必须使所有的数据都保持一致状态。
- 在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
- 事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
- 某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。
- 例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
隔离性(Isolation)
- 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
- 事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
- 这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
- 当事务可序列化时将获得最高的隔离级别。
- 在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。
- 由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
风险性最大的是:单实例模式(所有用户使用的是相同对象)
持久性(Durability)
- 事务完成之后,它对于系统的影响是永久性的。
- 改修改即使出现致命的系统故障也将一直保持。
事务的隔离级别
1、SERIALIZABLE(串行化–序列化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;性能最差
2、REPEATABLE READ(可重复读)(MysQL)
防止脏读和不可重复读,不能处理幻读性能比SERIALIZABLE好
3、READ COMMITTED(读已提交数据)(oracle)
防止脏读,不能处理不可重复读和幻读;性能比REPEATABLE READ好
4、READ UNCOMMITTED(读未提交数据)
可能出现任何事物并发问题,什么都不处理。性能最好
脏读行为:A用户读取了班级信息
B用户删除了班级信息
A 再去修改信息
高级JDBC
DatebaseMetaDate
ResultSetMetaDate
MysQL)
防止脏读和不可重复读,不能处理幻读性能比SERIALIZABLE好
3、READ COMMITTED(读已提交数据)(oracle)
防止脏读,不能处理不可重复读和幻读;性能比REPEATABLE READ好
4、READ UNCOMMITTED(读未提交数据)
可能出现任何事物并发问题,什么都不处理。性能最好
脏读行为:A用户读取了班级信息
B用户删除了班级信息
A 再去修改信息
[外链图片转存中…(img-j7mCL7vt-1617809667151)]
高级JDBC
DatebaseMetaDate
[外链图片转存中…(img-yboSItF8-1617809667152)]
ResultSetMetaDate