目录
Statement和PreparedStatement的区别 (掌握***)
一、JDBC概述
JDBC是Java Database Connectivity的缩写,意为Java数据库连接。是Java提供的一种数据库访问规则、规范, 由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库提供商去实现底层的访问规则。 Java程序只要使用sun公司提供的标准接口去操作数据库即可。
二、JDBC主要API
- DriverManager (管理驱动:注册驱动、获取连接对象)
- Connection (代表到数据库的连接,获取执行对象、管理事务、释放资源)
- Statement、PreparedStatement (执行对象,可以执行CRUD语句、释放资源)
- ResultSet (查询结果集对象,封装了查询结果、释放资源)
三、JDBC CRUD操作
3.1JDBC操作数据库一般流程
- 加载驱动类(只需加载一次,新版本JDK可以省略)
- 获取连接对象`Connection`
- 获取执行语句对象`Statement`或`PreparedStatement`,执行SQL语句
- 使用`ResultSet`对象接收数据库查询结果(一般只有查询语句需要)
- 将`ResultSet`中的结果封装成对应的`JavaBean`类型对象
- 释放资源、关闭连接
3.2操作步骤
3.2.1下载依赖
Maven Repository: Search/Browse/Explore
选一个引用量高的下载,详见下面推荐
3.2.2导入jar包
3.2.3创建类,测试连接
3.2.4实现增删改查
3.3Mysql 5.x和Mysql 8.x的区别
在使用JDBC操作数据库时,会发现虽然能操作成功,但是总是会出现如下的提示信息
这个提示信息的含义是现在我们使用的Mysql驱动是com.mysql.jdbc.Driver,但是新的Mysql驱动为com.mysql.cj.jdbc.Driver。为什么会出现这种提示信息呢?主要是因为我们现在使用的数据库为Mysql 8.x,而Mysql在Mysql 8.x上做出了很多更新,使得我们在使用Mysql 8.x的时候跟使用Mysql 5.x版本是有一些区别的。
- Mysql 5.x和Mysql 8.x使用的驱动不同
//Mysql 5.x驱动加载
Class.forName("com.mysql.jdbc.Driver");
//Mysql 8.x驱动加载
Class.forName("com.mysql.cj.jdbc.Driver");
- Mysql 5.x和Mysql 8.x使用的数据库连接不同
//Mysql 5.x数据库访问地址
private static final String URL="jdbc:mysql://localhost:3306/db9";
//Mysql 8.x数据库访问地址
private static final String URL="jdbc:mysql://localhost:3306/db9?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
3.4jdbc面试题
jdbc连接数据库的基本步骤(掌握**)
1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver"); // MySQL 5.x
// 或 MySQL 8.x+
Class.forName("com.mysql.cj.jdbc.Driver");
2.建立数据库连接
String url = "jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC";
String user = "用户名";
String password = "密码";
Connection conn = DriverManager.getConnection(url, user, password);
3.创建Statement 或者PreparedStatement
Statement statement = conn.createStatement();
// 或
PreparedStatement preparedstatement = conn.prepareStatement("SELECT * FROM table WHERE id=?");
4.执行SQL语句
// 查询
ResultSet rs = stmt.executeQuery("SELECT * FROM table");
// 或
pstmt.setInt(1, 1001);
ResultSet rs = pstmt.executeQuery();
// 更新
int rows = stmt.executeUpdate("UPDATE table SET column='value' WHERE id=1");
5.处理结果集
while(rs.next()) {
String name = rs.getString("column_name");
int id = rs.getInt("id");
// ...
}
6.关闭资源(从内到外)
rs.close();
stmt.close(); // 或 pstmt.close()
conn.close();
Statement和PreparedStatement的区别 (掌握***)
Statement接口用来执行一段SQL语句并返回结果,不支持参数占位符写法。Statement执行 ,其实是拼接sql语句的。 先拼接sql语句,然后再一起执行。如果传入的参数是一段可执行的SQL,也会被执行,**有SQL注入的风险。**
PreparedStatement接口继承自Statement接口,相比较以前的statement, **预先处理给定的sql语句**,对其执行语法检查。 在sql语句里面使用 ? **占位符**来替代后续要传递进来的变量。 后面进来的变量值,只会被看成参数值,不会产生任何的关键字的效果。
Statement支持表名、列名动态传入,如果表名、列名不固定,不能使用PreparedStatement。