目录
1.数据库编程的必备条件
- 编程语言,如Java,C、C++、Python等
- 数据库,如Oracle,MySQL,SQL Server等
- 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提 供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
2.Java的数据库编程JDBC
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
3.JDBC的工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包 含一些通用的接口类。
JDBC访问数据库层次结构:
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
4.第三方库connector的下载和导包
下载
这里提供一个最为简单的下载方法:去maven中央仓库下载
- 链接:
看自己的数据库的版本情况来下载(点击Central下载即可)对应的版本(经典版最高是8.0,更高的版本在最新版中)
注:MySQL的版本必须和connector的版本一致
导包
- 下载好 .jar 包
- 把 .jar导入到自己的Java项目中
先在项目中创建一个目录.名字随便起,但是不要带有中文/特殊字符
把下载好的jar包,拷贝到lib目录中
右键刚才的lib目录, 点击add as library(告诉idea,这个lib目录是一个"库"目录)
5.JDBC的使用
使用步骤
(1)创建数据源对象DataSource
(描述当前数据从哪来即数据库服务器所在的位置)
通过原码我们可以看到DataSourse是被interface修饰的类,不能用来直接实例化该对象,因此我们只能实例化它的子类MysqlDataSourceDataSource dataSource = new MysqlDataSource();
DataSourse:Java标准库JDBC自带的接口
MysqlDataSource:刚刚导入的 .jar包(2)给对象设置必要的属性
1)数据库服务器在哪里 2)访问服务器的账户是啥 3)访问服务器的密码是啥//第一种写法 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("jqka"); //第二种写法 MysqlDataSource mysqlDataSource = new MysqlDataSource(); mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false"); mysqlDataSource.setUser("root"); mysqlDataSource.setPassword("jqka");
第一种写法的好处:耦合程度更低
按照第一种写法,后续代码中如果再使用DataSource这个东西,是看不到"MysqlDataSource"这个信息的.
就使得后续的其他部分代码和“mysql"这个概念解耦合了.后面的代码,和啥数据库没关系.如果要更换数据库,此时代码修改的成本就比较低说明:
Url
jdbc:mysql: 描述了url的用途是用来给jdbc的mysql使用的 127.0.0.1: IP地址.描述了mysql服务器所在的主机的位置. 3306:端口号,用来区分一个主机上的应用程序的. java112?characterEncoding=utf8:数据库名和字符集 useSSL=false:额外的参数起到了针对这次的数据库连接,解释说明,这里表示关闭加密User
root就是DBA权限最高账户管理员Password
jqka即自己数据库的密码(3)和数据库建立网络连接
受查异常,所以要向上进行抛异常
//2.和数据库服务器建立连接 Connection connection = dataSource.getConnection(); System.out.println(connection);
此处的Connection 对象,就是表示了一个数据库连接,
注意:这里必须选择sql的Connection
(4)程序构造sql语句
我们之前在cmd敲的sql,是把 sql发送到mysql服务器mysql服务器负责解板,解析完成之后,执行.解析检查sql是否有语法错误具体要完成什么工作.....
解析工作,需要消耗系统资源
由于mysql服务器,同一时刻可能要同时给多个客户端提供服务.解析工作积少成多,也就会比较消耗资源因此往往就可以把解析工作,放到客户端来完成(自己写的代码)
客户端发送sql之前,先解析好,先把一些能做的工作做好,这样服务器就可以降低一些工作量,减轻压力了构造方法有很多种,这里我们使用最主流的PreparedStatement预编译语句来完成这一操作
//4.程序构造MySQL语句 String sql = "insert into student values(2,'李四')"; PreparedStatement statement = connection.prepareStatement(sql);
(5)将sql语句传到服务器上执行
statement.executeUpdate();的返回值表示影响了几行数据
(6)释放上述资源
//5.释放上述资源 statement.close(); connection.close();
说明:释放资源的顺序,要和创建资源的顺序相反
建立连接/创建语句的时候,就需要消耗一定的内存/硬盘/网络筹资源....这些资源,都是跟随这个连接来走的.
如果连接不再使用了,就需要把这些资源释放掉.
优化
此时我们还可以使用Scanner自定义让用户输入数据
Scanner scanner = new Scanner(System.in); System.out.println("请输入id: "); int id = scanner.nextInt(); System.out.println("请输入name: "); String name = scanner.next();
在我们输入的时候可以使用占位符来进行操作避免出现多个引号的情况
String sql = "insert into student values(?,?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1,id); statement.setString(2,name);
注意:
替换时下标是从1开始的
整体代码
package jdbc;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBC1 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入name: ");
String name = scanner.next();
//1.创建数据源对象
//向下转型,DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("jqka");
/*MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("jqka");*/
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.程序构造MySQL语句
//String sql = "insert into student values(2,'李四')";
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
//4.把sql语句传到服务器上执行
int n = statement.executeUpdate();
System.out.println(n);
//5.释放上述资源
statement.close();
connection.close();
}
}
具体操作
插入删除修改操作都是相似的,改语句内容即可
//插入数据
String sql = "insert into student values(2,'李四')";
//删除id = 1的数据
String sql = "delete from student where id = 1";
//修改id = 2的name为张三
String sql = "update student set name = '张三' where id = 2";
//传送sql语句到服务器上
int n = statement.executeUpdate();
select操作有所差异
- statement对象使用的方法为executeQuery()
- 使用该方法后返回的结果是一个结果集,需要用ResultSet来接收
- ResultSet需要单独进行释放
//查表
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//接受的是一个结果集合
ResultSet resultSet = statement.executeQuery();
//遍历
while (resultSet.next()) {
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
}
resultSet.close();
说明:通过ResultSet表示查询结果的临时表~~
代码中使用的时候可以当做"集合类"来使用,可以进行遍历
总结两种执行SQL的方法
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete 语句
6.JDBC常用接口和类
(1)JDBC API
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全 解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
(2)数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
- 通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 创建数据库连接 Connection connection = DriverManager.getConnection(url);
一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource(); ((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test"); ((MysqlDataSource) ds).setUser("root"); ((MysqlDataSource) ds).setPassword("jqka"); Connection connection = ds.getConnection();
区别:
1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源 时,通过connection.close()都是关闭物理连接。
2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接 是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将 Conncetion连接对象回收。
(2)Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。
实际开发中最常用的是PreparedStatement对象: