文章目录
- JDBC
- 1.概念
- 2.原理
- 3. 如何使用JDBC编程
- 1. 下载mysql的jdbc驱动
- 2. 项目中引入驱动
- 4. JDBC使用
- 1. 和数据库建立连接
- 2.获取连接
- 3. Statement对象
- 4. 释放资源
JDBC
1.概念
JDBC,即Java Database Connectivity,java数据库连接。是Java提供的API用来执行SQL语句,它是Java中的数据库连接规范,这个API由java.sql.*,javax.sql.*
包中的一些类和接口构成,它为Java开发人员操作数据库提供了一个标准的API,提供了多种关系的数据空提供访问。
2.原理
JDBC为多种关系数据库提供了统一访问方式,数据库的种类有很多,每个数据库提供的接口都各不同,Java就能够使用一套代码就能操作各种不同种类的数据库。
Java开发者只需呀关注怎么使用就可以了,JDBC的API是Java标准库里提供好的类,驱动程序往往是一个jar包,访问的是数据库服务器。
3. 如何使用JDBC编程
1. 下载mysql的jdbc驱动
- MySQL官网下载
- 从MySQL的githup下载
- Maven中央仓库下载
需要注意的是,如果MySQL的服务器是5.7话,那么驱动包也得是5系列的,8就用8系列的驱动包.
下载后的jar包里其实就是包含了很多.class
文件,安装特定的目录结构组织,能够被Java识别.
2. 项目中引入驱动
- 创建一个目录
- 把jar包拷贝进来
- 由键这个目录,add as libray
- 然后确定即可
4. JDBC使用
1. 和数据库建立连接
这个URL是和数据库建立连接时必备的它的基本格式为
String URL = "jdbc:mysql://127.0.0.1:3306/system_book?characterEncoding=utf8&useSSL=false";
jdbc:mysql
:协议名,对于JDBC来说是固定的127.0.0.1
:数据库服务器ip(这里表示本机Ip)3306
:MySQL默认端口号system_book
:数据库名characterEncoding=utf8
:当前成员以utf8字符集解析数据useSSL=false
:传输是否加密
创建连接代码
private static final String URL = "jdbc:mysql://127.0.0.1:3306/system_book?characterEncoding=utf8&useSSL=false";
private static final String USER = "root";
private static final String PASSWORD = "root";
private static DataSource dataSource = new MysqlDataSource();
static {
((MysqlDataSource)dataSource).setURL(URL);
((MysqlDataSource)dataSource).setUser(USER);
((MysqlDataSource)dataSource).setPassword(PASSWORD);
}
-
USER
:数据库用户名 -
PASSWORD
:数据库密码 -
DataSource
:是JDBC提供的一个接口 -
MysqlDataSource
:是一个类,实现了DataSource
接口,用于MySQL操作数据库 -
这里的
setURL
、setUser
、setPassword
都是MysqlDataSource
的方法 -
为啥上述方法不是
DataSource
接口的?原因就是并不是所有数据都能设置者几个东西 -
这里的代码为啥要先向上转型再向下转型呢?其实可以写成这样
MysqlDataSource mysqlDataSource = new MysqlDataSource(); mysqlDataSource.setURL(URL); mysqlDataSource.setUser(USER); mysqlDataSource.setPassword(PASSWORD);
-
使用
DataSource
的好处就是,我们持有的是DataSource
示例,它可以接受实现了它的其它类,假设如果后续要更换数据库,只需要修改这几行代码即可。如果使用MysqlDataSource
就要修改大量代码
2.获取连接
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL(URL);
((MysqlDataSource)dataSource).setUser(USER);
((MysqlDataSource)dataSource).setPassword(PASSWORD);
Connection connection = dataSource.getConnection();
还有一种获取连接的方式,通过DriverManager(驱动管理类)的静态方法获取
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(URL);
以上两种方式的区别是:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源
时,通过connection.close()都是关闭物理连接 - DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接
是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将
Conncetion连接对象回收
3. Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象
- PreparedStatement
- 用于执行带或不带参数的SQL语句
- SQL语句会预编译再数据库系统
- 执行速度快于Statement对象
- Statement
- 用于执行不带参数的简单SQL语句
- CallableStatement
- 用于执行数据库存储过程的调用
当然PreparedStatement是最常用的,主要有executeQuery()
方法和executeUpdate()
方法
executeQuery()
方法执行后返回单个结果集的,通常用于select语句executeUpdate()
方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
语句
带有参数的SQL执行
public boolean add(Book book) {
Connection connection = null;
PreparedStatement statement = null;
try {
// 和数据库建立连接
connection = DBUtil.getConnection();
// 拼装sql
String sql = "insert into book values (null,?,?,?,?,?)";
statement = connection.prepareStatement(sql);
statement.setString(1,book.getName());
statement.setString(2,book.getAuthor());
statement.setString(3,book.getType());
statement.setBigDecimal(4,book.getPrice());
statement.setString(5,"未借出");
// 执行sql
int ret = statement.executeUpdate();
if (ret > 0) {
return true;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DBUtil.close(connection,statement,null);
}
return false;
}
不带参数的SQL执行
ResultSet对象:ResultSet是一个结果集 ,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供
了对这些行中数据的访问 ,我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环 。
public List<Book> getAll() {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Book> bookList = new ArrayList<>();
try {
// 和数据库建立连接
connection = DBUtil.getConnection();
// 拼装sql
String sql = "select * from book";
statement = connection.prepareStatement(sql);
// 执行sql
resultSet = statement.executeQuery();
while (resultSet.next()) {
String bookName = resultSet.getString("name");
String auth = resultSet.getString("author");
String type = resultSet.getString("type");
BigDecimal price = resultSet.getBigDecimal("price");
String status = resultSet.getString("status");
Book book = new Book(bookName,auth,type,price);
book.setLoanOut(("未借出".equals(status) ? false : true));
bookList.add(book);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
DBUtil.close(connection,statement,resultSet);
}
return bookList;
}
4. 释放资源
建立连接后,使用完毕后一定要记得释放这个连接,如果不一直不释放可能就会造成资源泄露的情况。
注意释放的顺序一定是先创建的后释放。
try {
// 先创建的额后释放
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}