这是非常基础的API.还有一些高级框架:
这些框架都是对JDBC的高级封装.
份额:
我们一般不会通过JDBC直接操作.
实际上,JDBC是面向接口的:

示例操作¶
注册驱动:告诉程序我们要使用哪个数据库的驱动.
要获取SQL执行对象才能进行(步骤3)
创建程序¶
主要是三项依赖:
<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>
测试¶
executeUpdate能够执行所有的DML语句.(增删改)
样例¶
其中驱动的那里,表示使用的是mysql的驱动.
两个问号是两个占位符.
prepareStatement如图:
它可以用来执行sql语句.需要处理占位符.
上面这种用法叫做预编译sql.
这种方式推荐使用,性能更高更安全.
结果集对象:
next()会一行一行地向下走.
示例:
最后关闭资源:

预编译SQL¶
静态SQL获取的是Statement对象,预编译SQL获取的是PreparedStatement.
我们一般的登录是这样的:
查看count(*)是否是0,就知道有没有这个用户.这样是可以sql注入的.
如果使用静态sql:

预编译sql是可以预防sql注入的.
tip:java -jar xxx.jar 就可以直接执行jar包
如果使用预编译sql,那么会把两个占位符同步发给sql服务器.
是将整体发过去的.sql服务器同时还会对一些字符进行转义.这样会防止sql注入.
为什么性能更高?因为mysql有缓存:
执行多条时:
这些都不能利用缓存.而使用delete from user where id=?;就可以很好利用缓存.
这个过程中,如果多次输入delete from user where id=?,那么就缓存好了,不需要再编译了,直接在执行sql时把?替换成1 2 3即可.