一、JDBC基础
跟数据库连接,并且可以对数据库里面的数据通过SQL语句进行处理等操作。
1.1 JDBC
JDBC是SUN公司的,所以要按照他们的规范来,因为MYSQL和Oracle都是SUN公司的。三个产品都是一个公司的,一般不会出现兼容性不好的问题吧,甚至用他们来配合非常的美。
1.2 JDBC链接数据库需要的参数
-
需要明确哪一个数据库,针对于不同的数据库有着不同的驱动去进行连接。
-
导包 我们现在项目一般用到的是msyql数据库,导mysql-connector-java-5.1.47.jar包
-
对数据库进行连接,需要知道链接的数据库,当前的主机名,ip地址以及端口号等
jdbcUrl=jdbc:mysql://localhost:3306/连接的数据库名称?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
- 链接对应数据库需要使用用户名和密码,使用字符串数据
1.3 连接数据库案例
IDEA连接数据库,这是灰常重要的IDEA需要连接数据库!!!
依次点击,会进入到一个数据库连接界面
接下来,我们需要回想一下反射当中的获取Class对象的方法:Class.forName(String str)
这个方法有两种用途~
package JDBC;
public class JdbcDemo01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处* 1.获取指定类型的Class* 2.如果对应类型当前Java程序尚未加载,则加载指定类型* 当前的方法只是用了第二个功能*/Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection(JbdcUrl, username, password);System.out.println(connection);connection.close();}
}
1.4 JDBC核心API
class java.sql.DriverManager Java JDBC 驱动管理类,主要负责驱动注册和数据库连接对象获取常用方法:public static void registerDriver(java.sql.Driver driver); 注册符合 JDBC 规范要求的 Driver 对象,增强当前 Java 程序,可以操作数据库public static java.sql.Connection getConnection(String jdbcUrl, String username, String password)根据提供的 JdbcUrl JDBC 数据库连接规范 URL,对应的数据库用户名和密码获取到数据库 java.sql.Connection 连接对象interface java.sql.Connection Java JDBC 数据库连接对象接口,主要用于获取数据库连接相关的信息,获取数据库 SQL 搬运工对象常用方法:public java.sql.Statement createStatement();通过该数据库连接对象,获取对应当前数据库的 SQL 语句搬运工对象public java.sql.PreparedStatement prepareStatement(String sql);通过该数据库连接对象,根据参数 SQL 语句,获取对应当前数据库的 SQL 语句预处理搬运工对象。interface java.sql.StatmentJava JDBC 规范 数据库搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新(insert, update, delete),一部分为查询(select)常用方法:public int executeUpdate(String sql);执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。Query OK, 1 row affected(5ms)public java.sql.Resultset executeQuery(String sql);执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 java.sql.ResultSet 数据库查询结果集对象。interface java.sql.PreparedStatment extends java.sql.StatmentJava JDBC 规范 数据库【预处理】搬运工对象,在项目中主要处理的 SQL 语句可以分为两大部分,一部分为更新(insert, update, delete),一部分为查询(select),PreparedStatment 可以引入 SQL 语句参数操作。SQL参数为 ? 占位符常用方法:public void setXXX(int index, XXX value);可以给予 SQL 语句参数赋值操作,第一个参数是 SQL 语句参数下标位置(从 1 开始),给予当前 SQL 语句的实际参数。类型支持任意类型(int, double, float, long, Object, String ...)public int executeUpdate();执行 SQL 语句更新操作,主要可以执行的 SQL 语句类型为 insert,update,delete 操作,返回值是 int 类型,返回值是当前 SQL 语句执行,对应数据表受到影响的行数。Query OK, 1 row affected(5ms)public java.sql.Resultset executeQuery();执行 SQL 语句查询操作,主要可以执行的 SQL 语句类型为 select 操作,返回值为 java.sql.ResultSet 数据库查询结果集对象。interface java.sql.ResultSetJava JDBC 规范,数据库查询结果集对象。可以认为是 select 查询 SQL 语句最终结果表格对应的 Java 类型。常用方法:XXX getXXX(String columnName);根据列名/字段名,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型一致。支持(int, String, Long...)XXX getXXX(int columnIndex); 根据列下标,获取数据库当前数据行对应的数据信息,类型可以是任意类型,但是要求和数据库存储类型一致。支持(int, String, Long...)【注意】列下标从 1 开始boolean next();1. 判断当前数据库查询结果集对象是否还有数据行可以解析,如果可以返回 true,否则返回 false2. 提取当前数据行进行解析操作,同时指向下一行数据
1.5 使用JDBC进行初步的增删改查操作
添加操作
package JDBC;
import java.sql.*;
public class JdbcDemo02 {public static void main(String[] args) {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处* 1.获取指定类型的Class* 2.如果对应类型当前Java程序尚未加载,则加载指定类型* 当前的方法只是用了第二个功能*/try {//加载JDBC连接数据库的驱动Class.forName("com.mysql.jdbc.Driver");//通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息connection = DriverManager.getConnection(JbdcUrl, username, password);// 准备SQL插入语句String sql = "insert into gp_01.student(name, age, gender) VALUES ('小申',22,true)";//获取 SQL 语句搬运工对象statement = connection.createStatement();//执行 SQL 语句 返回结果是对数据库影响的行数int rows = statement.executeUpdate(sql);System.out.println("对数据库影响了" + rows + "行");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//按照先开后关的原则进行关闭资源try {if (statement != null) {statement.close();}if (connection != null){connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}}
}
运行结果发现数据已经添加到数据库中~
修改操作
//跟上面的代码除了sql语句外完全一样
String sql = "update gp_01.student set name = '被修改的小申' where id = 14";
删除操作
String sql = "delete from gp_01.student where id = 14";
查询操作
接下来开始变的不一样了,查询操作!一般我们都是很少动数据库中的数据,大部分都只是对数据库中的数据进行查询操作,但是想查询操作返回影响了几行数据,怪怪的~
查询操作和上面的有所不同,代码如下:
package JDBC;
public class JdbcDemo03 {public static void main(String[] args) {String JbdcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;ResultSet resultSet = null;/*** 加载驱动,Class.forName(String str)* 通过反射的形式去加载,当前方法有两个用处* 1.获取指定类型的Class* 2.如果对应类型当前Java程序尚未加载,则加载指定类型* 当前的方法只是用了第二个功能*/try {//加载JDBC连接数据库的驱动Class.forName("com.mysql.jdbc.Driver");//通过DriverManager连接到数据库 数据库连接对象接口,主要用于获取数据库连接相关的信息connection = DriverManager.getConnection(JbdcUrl, username, password);// 准备SQL插入语句String sql = "select * from gp_01.student where id = 1";//获取 SQL 语句搬运工对象statement = connection.createStatement();//执行 SQL 语句 返回结果是ResultSet数据类型,里面存储了数据resultSet = statement.executeQuery(sql);while (resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");int gender = resultSet.getInt("gender");System.out.println(id);System.out.println(name);System.out.println(age);System.out.println(gender);}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//按照先开后关的原则进行关闭资源try {if (resultSet != null){resultSet.close();}if (statement != null) {statement.close();}if (connection != null){connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}}
}
可以看出查询的代码和增删改的代码是不同的~~
public void testSelectAll() {// 1. 准备数据库连接必要的参数String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(jdbcUrl, username, password);statement = connection.createStatement();String sql = "select * from student";resultSet = statement.executeQuery(sql);ArrayList<Student> list = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");boolean gender = resultSet.getBoolean("gender");list.add(new Student(id, name, age, gender));}list.forEach(System.out::println);} catch (ClassNotFoundException | SQLException e) {throw new RuntimeException(e);} finally {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}
1.6 包含有未知数的SQL增删改查操作
package JDBC;
/*** @Description* @Author zpd* @Date 2023/3/17*/
public class JdbcDemo04 {public static void main(String[] args) {// 1. 准备数据库连接必要的参数String jdbcUrl = "jdbc:mysql://localhost:3306/gp_01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";String password = "root";Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(jdbcUrl, username, password);/*PreparedStatement 操作流程1. 准备 SQL 语句,可以使用 ? 占位参数2. 通过数据库连接对象 预处理 SQL 语句,得到 PreparedStatement 对象3. PreparedStatement 对象 赋值参数操作4. 执行 SQL 语句得到对应结果*/String sql = "select * from gp_01.student where id = ?";statement = connection.prepareStatement(sql);//给sql第一个未知数据赋值为1statement.setString(1, "1");resultSet = statement.executeQuery();if (resultSet.next()) {System.out.println("PreparedStatement 操作登陆成功");} else {System.err.println("PreparedStatement 操作登陆失败");}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}