JDBC配置MySQL的具体流程
1.MySQL服务启动
- 1.从官网下载并安装MySQL Server: 本地机器安装/linux安装
- 2.启动MySQL服务:
net start MySQL80
停止:net stop MySQL80
- 3.通过
sudo ss -tlnp | grep 3306
查看MySQL是否正确监听在3306端口
2.JDBC配置并获取数据库连接
-
1.下载MySQL的驱动:`mysql-connector-java-8.0.36.jar``
-
2.添加到项目中:
- 方式一:手动导入,放到lib文件夹下,并将lib文件夹添加为库使用
- 方式二:通过maven,在
pom.xml
中添加MySQL对应的依赖:mysql-connector-java
,maven会自动从中央仓库下载并管理该依赖
-
3.创建连接:创建连接时需要传入数据库连接的参数:比如访问数据库的url、用户名、用户密码
- 方式一:通过添加静态变量来设置
- 方式二:通过配置文件,在配置文件中指定对应字段并赋值,在配置参数时引入该配置文件并配置参数为字段名即可
-
4.使用驱动提供的API:
DiverManager.getConnection(url, username, password)
获取到一个数据库的连接 -
5.关闭连接:一定要及时释放资源,避免内存泄漏
3.定义sql语句完成数据的增删改查
- 使用
PreparedStatement
相当于预封装了一些简单的sql,可以直接套用 - 如果需要完成更加复杂的增删改查就需要自己另外定义sql语句
java
import java.sql.Connection;
import java.sql.PreparedStatement;
public class InsertExample {
public static void main(String[] args) {
String sql = "INSERT INTO users(name, age) VALUES(?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "Alice");
ps.setInt(2, 20);
int rows = ps.executeUpdate();
System.out.println("插入成功,受影响行数:" + rows);
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC中使用PreparedStatement有什么优势?
PreparedStatement
实质上是将输入数据作为参数传入SQL语句中,对输入数据中的特殊字符进行了转义
优势:
- 1.可以防止SQL注入
- 2.预编译SQL,提高相同模板下的效率
预编译SQL(在创建PreparedStatement时就已经编译好了SQL模板)
正常的JDBC流程:
- 1.在Java中编写SQL语句,传入到MySQL中
- 2.在MySQL中需要对Java中编写的SQL语句进行语法检查
- 3.语法检查通过之后需要编译SQL,将SQL编译成可执行的函数
- 4.执行SQL
当需要使用相同结构的SQL对不同输入数据的查询时,每次都要执行上述流程。
而使用PreparedStatement之后:
- 1.在Java中编写SQL语句,传入到MySQL中
- 2.在MySQL中需要对Java中编写的SQL语句进行语法检查
- 3.语法检查通过之后需要编译SQL,将SQL编译成可执行的函数
- 4.传入参数
- 5.执行SQL
这样当输入不同数据时,相同模板下的SQL就无需再次编译,只需要通过setXxx()
方法传入参数,即可执行SQL
MySQL中索引失效的情况有哪些?
- 1.聚合索引没有符合最左前缀法则
- 如果查询条件的第一个不是联合索引最左侧的索引字段,会导致全部索引都失效,走全表扫描
- 如果中间跳过联合索引的中间某一个索引列,会导致后面的它后面的索引失效(部分索引失效)
- 联合索引中出现范围查询时,会导致范围查询右侧的列索引失效
- 2.对建立索引的字段进行了运算,会导致索引失效
- 3.索引列进行了前段模糊匹配:
%xxx
会导致索引失效,后段模糊匹配则不会:xx%
- 4.字符串类型的索引列查询时没有加
''
,会导致对应索引失效:name = 张三
- 5.使用
or
连接的前后两个条件中的字段都需要有索引,如果一侧没有索引,则会导致另外一边的索引也失效:xxx or xxxx
- 6.数据分布影响:如果MySQL评估使用索引查询比全表扫描还要慢,则不会使用到索引
失效演示:
- 1.如果不添加最左侧的索引,则会发生索引失效,走全表扫描:
中间跳过某个索引时,会出现部分索引失效,只使用了profession的索引

只要出现最左侧索引即可,更查询顺序无关。
联合索引中使用范围查询(<,>)的,范围查询右侧的列索引失效
- 2.当对phone字段进行截取匹配时,会导致phone字段原本的索引失效:
- 3.使用尾部模糊匹配查询名字为
like '软件%'
,仍能够使用name字段的索引,而使用头部模糊匹配查询名字为like '%工程'
时,走的是全表扫描,无法使用name字段的索引:
- 4.status字段为String类型,当查询时没有加
''
时,可以查询到数据,但是无法使用status字段的索引:
- 5.phone和status都建立了索引,而当使用
or
连接时,由于age没有索引,导致在or
另外一侧的phone和status字段的索引都无法使用:
- 6.查询phone大于某一个值的数据时,由于MySQL判断根据当前条件查询的数据较多时(表中绝大多数数据都是满足条件时),会直接走全表扫描,而当根据查询条件判断查询的数据占表中的数据较少时,则会走索引:
MySQL中有哪些索引?
- 1.按结构分:
- BTree索引:MySQL默认索引
- Hash索引:基于哈希表,等值查询,不支持范围
- R-Tree索引:支持空间索引,MyISAM常用
- 2.按涉及的列数分:
- 单列索引:只涉及一个字段
- 联合索引:一个索引包含多个列,遵循最左前缀法则
- 3.按物理存储方式分:
- 聚集索引:叶子节点存储数据,(InnoDB中主键索引就是聚集索引)(必须有,只能有一个)
- 非聚集索引:索引和数据分开存储,每次查询需要根据索引定位,再回表查询数据
- 4.按功能分:
- 主键索引:每个表只能有一个,唯一并且不允许null(默认是聚集索引)
- 唯一索引:唯一,可以包含null,可以多个
- 全文索引:用户全文搜索
- 空间索引:用于空间数据类型,常用于地理位置相关的范围查询