MYSQL索引事务及JDBC编程

上一篇:MySQL表的增删查改(提高篇)

索引事务

一、索引(Index)接触

概念: 简单意义上来说,就是加速查询的一种数据结构。

优点: 提升查询效率,可用于快速定位、检索数据。

缺点: 降低了插入、修改、删除效率,增加了硬盘的使用空间。

使用场景: 索引不是无限制加的,根据需要来加;

  1. 数据量够大
  2. 索引应该加在经常查找的字段上。

索引的分类:

  1. 主键 Primary Key
  2. 唯一键 Unique
  3. 普通索引(一般提到索引,没有特别说明,都是这个)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 的连接步骤

  1. 注册驱动(JDBC-Driver)(程序中只需要进行一次)
Class.forName("com.mysql.jdbc.Driver");
  1. 获取一条 MySQL 的网络连接对象(TCP 连接)
    a) 配置连接 URL(一般大家需要修改的,只有默认数据库)
    在这里插入图片描述

  2. 获取 Connection 对象
    a) 每次 SQL 都使用一个新的 Connection(弊端:效率较差)
    b) 共用 Connection(限制:不是线程安全的)
    c) 连接池(Connection pool)

  3. 通过连接获取一条语句对象(每个 statement 对象只能用于一条语句)

  4. 执行 CRUD sql(Select 有点特殊,有个结果集问题)
    Insert/Update/Delete executeUpdate (建议)
    Select executeQuery (建议)

    注意点:
    executeQuery 只能用于 SELECT
    executeUpdate 不能用于 SELECT
    execute 用于 DDL 语句

    Select:
    a) 需要拿到结果集对象
    b) 从结果集对象中遍历获取数据
    c) 销毁结果集对象
    注:结果集马上需要销毁,所以通过 List 保存结果

  5. 销毁

【详细代码应用示例可以私信盖盖】

二、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("========");
                    }
                }

【以上两个的详细代码应用可以私信盖盖】


在这里插入图片描述

发布了46 篇原创文章 · 获赞 82 · 访问量 8161

猜你喜欢

转载自blog.csdn.net/weixin_45662626/article/details/104512514