索引事务
一、索引(Index)接触
概念: 简单意义上来说,就是加速查询的一种数据结构。
优点: 提升查询效率,可用于快速定位、检索数据。
缺点: 降低了插入、修改、删除效率,增加了硬盘的使用空间。
使用场景: 索引不是无限制加的,根据需要来加;
- 数据量够大
- 索引应该加在经常查找的字段上。
索引的分类:
- 主键 Primary Key
- 唯一键 Unique
- 普通索引(一般提到索引,没有特别说明,都是这个)Key/Index
//查看索引
how index from 表名
//创建索引
create index 索引名 on 表名(字段名);
//删除索引
drop index 索引名 on 表名;
调优查询的工具: EXPLAIN 命令
explain select * from test_user where id_number=0812886;
explain select * from test_user\G
二、事务(Transaction)接触
首先大家都会有一个疑问:为什么使用事务呢?
我们来举一个简单的例子:比如说,盖盖今天要给最好的朋友小明转账200块钱;
准备测试表:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar(20) comment '账户名称',
money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('盖盖', 5000),
('小明', 1000);
-- 盖盖账户减少200
update accout set money=money-200 where name = '盖盖';
-- 小明账户增加200
update accout set money=money+200 where name = '小明';
如果在执行以上第一句SQL时,出现网络错误,或是数据库崩掉了,盖盖的账户会减少200,但是小明的账户上就没有了增加的金额。这可怎么办才好呢?
这个时候就可以使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。
概念: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
使用:
(1)开启事务:start transaction/begin;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
begin;
update account set money = money - 200 where name = '盖盖';
update account set money = money + 200 where name = '小明';
commit;
这样就不会出现上面的困扰啦!
JDBC编程
一、 通过 JDBC 进行 mysql 的连接步骤
- 注册驱动(JDBC-Driver)(程序中只需要进行一次)
Class.forName("com.mysql.jdbc.Driver");
-
获取一条 MySQL 的网络连接对象(TCP 连接)
a) 配置连接 URL(一般大家需要修改的,只有默认数据库)
-
获取 Connection 对象
a) 每次 SQL 都使用一个新的 Connection(弊端:效率较差)
b) 共用 Connection(限制:不是线程安全的)
c) 连接池(Connection pool) -
通过连接获取一条语句对象(每个 statement 对象只能用于一条语句)
-
执行 CRUD sql(Select 有点特殊,有个结果集问题)
Insert/Update/Delete executeUpdate (建议)
Select executeQuery (建议)注意点:
executeQuery 只能用于 SELECT
executeUpdate 不能用于 SELECT
execute 用于 DDL 语句Select:
a) 需要拿到结果集对象
b) 从结果集对象中遍历获取数据
c) 销毁结果集对象
注:结果集马上需要销毁,所以通过 List 保存结果 -
销毁
【详细代码应用示例可以私信盖盖】
二、JDBC API 变形
Statement 变形成 PrepareStatement
我们首先引入—>SQL 注入:用户输入特殊字符导致SQL不是按照作者期望的方式运行。
可能这样说很多小伙伴不能理解,举个例子:加入我们写了一个小微博系统,用的是Statement语句,会出现“bug”,就会导致用户名取巧用特殊字符,密码随便是什么都可以进入的现象:
用户名: ‘ OR 1 = 1 OR ‘
密码随便
所以我们将Statement 变形成 PrepareStatement防止 SQL 注入。
获取连接的方式:
1、较早版本的 JDBC 的规定
DriverManager.getConnection();
弊端: 每次获取连接,都是一次网络请求,用完之后马上销毁,导致效率很低
2、新版本的 JDBC 的规定
DataSource
优点:使用方式简单,可以带有连接池功能(建议但不强制)
连接池:池化技术,提升效率
总结:DataSource + PrepareStatement
ResultSet对象
ResultSet对象被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问,ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
try(ResultSet rs = statement.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("username"));
System.out.println(rs.getString("password"));
System.out.println("========");
}
}
【以上两个的详细代码应用可以私信盖盖】