JDBC
一、JDBC简介
- JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
- JDBC的作用:可以通过java代码操作数据库。
二、通过DriverManager实现JDBC
实现JDBC的步骤:
- 注册驱动
- 获取数据库的连接
- 准备sql语句
- 预编译sql语句
- 执行sql语句
- 释放资源
具体实现:
准备sql语句public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库的连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
//准备sql语句
String sql = "select * from websites where id=?";
//预编译sql语句
ps = conn.prepareStatement(sql);
//这里是对sql语句中的?进行赋值,第几个?就写数字几
int id = 5
ps.setString(1, id);
//执行sql语句
//查询是返回一个数据集ResultSet
//增加、删除、修改是返回一个int值,表示有几条数据发生改变
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
注意:
-
DriverManager
- DriverManager:驱动管理对象
- 实现方法:Class.forName(“com.mysql.jdbc.Driver”)和Class.forName(“com.mysql.cj.jdbc.Driver”)
- com.mysql.jdbc.Driver 不支持mysql 8
-
PreparedStatement和Statement:
方法声明 |
作用 |
int executeUpdate(String sql) |
可执行增,删,改,返回执行受到影响的行数 |
ResultSet executeQuery(String sql) |
执行SQL查询,并返回ResultSet对象 |
//使用Statement
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from websites";
rs = statement.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
![image-20230320094547951](https://img-blog.csdnimg.cn/img_convert/55805cc205b456d04e6f1c321623ab12.png)
通过源代码我们可以看到PreparedStatement继承了Statement,我们在JDBC中也可以Statement,推荐使用 PreparedStatement。
原因:Statement直接执行sql语句,PreparedStatement先预编译sql语句,后面添加字段后再具体执行,有效防止sql注入的发生。
3. ?占位符
![在这里插入图片描述](https://img-blog.csdnimg.cn/997c5f8b0218436eafc1ba8f9d2ae2ab.png)
三、通过DataSource实现JDBC
public static void main(String[] args) throws SQLException {
//1.创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("123");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.sql语句
String sql = "select * from websites where id=?";
//PreparedStatement预编译sql语句,同时还能设置数据
PreparedStatement ps = connection.prepareStatement(sql);
int id = 5
ps.setString(1, id);
//4.执行sql语句
ResultSet ret = ps.executeQuery();
while (ret.next()){
int id = ret.getInt("id");
String name = ret.getString("name");
System.out.println("id="+id+" name="+name);
}
//5.释放资源
ret.close();
ps.close();
connection.close();
}
四、DataSource和DriverManager的区别
1.获取的对象不同。DataSource主要是获取数据库连接池,而DriverManager主要是获取数据库连接,通过管理JDBC驱动程序来建立连接。
2.DataSource中封装了DriverManager的使用。
3.DataSource创建的connection可以被复用,而DriverManager的则不行。
至于为什么要推荐使用DataSource进行数据池的连接,这主要是因为使用DriverManager.getConnection()耗费内存和时间,实用性低且这种方式获取的connection需要手动关闭,不然会大量的占用内存。如果你对数据库的操作很频繁,显然这种方式费力不讨好。而数据库连接池(DataSource)主要负责创建、管理和分配数据库连接。初始化数据库连接池时,会创建一定数量的数据库连接对象,并存放于数据库连接池中。当请求连接数据库时,连接池会分配处于空闲状态的连接;数据库连接不被使用时,会被连接池回收,并设置为空闲状态;当连接空闲时间大于在初始化连接池设定的连接空闲时间,连接池释放该连接。