一.简单了解JDBC
JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API。
本质:
-
sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
-
各个数据库厂商去实现这套接口,提供数据库驱动jar包。
-
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
二.用JDBC写一个入门程序
1.前提:
(1)在数据库中创建相应数据,以及完成maven等环境的配置。
(2)注入依赖
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
2.代码演示
步骤:
1.注册驱动
2.连接数据库
3.获取SQL语句执行对象
4.执行SQL语句
5.释放资源
翻译理解:connection(连接),statemnet(语句),execute(执行·),update(更新)
注意点:executeUpdate执行的是DML语句(增,删,改)
三.通过JDBC来实现对数据库的查询功能
1.代码实现:
2.翻译理解
prepare(准备),query(查询)
3.代码解析
1.PreparedStatement
预编译SQL(参数动态传递)(用?占位避免数据写死)
这种呢,并未将参数值在SQL语句中写死,而是使用 ? 进行占位,然后再指定每一个占位符对应的值是多少,而最终在执行SQL语句的时候,程序会将SQL语句(SELECT * FROM user WHERE username = ? AND password = ?),以及参数值("daqiao", "123456")都发送给数据库,然后在执行的时候,会使用参数值,将?占位符替换掉。
作用:
-
防止SQL注入(一种黑客攻击手段)
-
性能更高
2.ResultSet
ResultSet(结果集对象):封装了DQL查询语句查询的结果。
-
next():将光标从当前位置向前移动一行,并判断当前行是否为有效行,返回值为boolean。
- true:有效行,当前行有数据
- false:无效行,当前行没有数据
-
getXxx(…):获取数据,可以根据列的编号获取,也可以根据列名获取(推荐)。
四.详细了解预编译SQL的作用
作用1:防止SQL注入
如果采用静态参数
假设正确的用户和密码是songjiang 123456
数据库中的查询代码为
当按图所示进行登录时却能够成功
关键就在于登录后提交到数据库的查询代码会变为
从而登录成功。
如果使用动态参数
在预编译SQL语句中,当我们执行的时候,会把整个' or '1'='1
作为一个完整的参数,赋值给第2个问号(' or '1'='1
进行了转义,只当做字符串使用)
那么此时再查询时,就查询不到对应的数据了,登录失败。
作用2:性能高
编译SQL后会将SQL语句缓存起来,在执行下一条语句之前会先查看缓存里有没有,如果有可以直接执行,不用再进行前面的三步操作,从而提高效率。