目录
♫什么是JDBC
我们前面操作数据库都是使用数据库自带的客户端通过网络访问数据库服务器,而要想通过代码来访问数据库服务器就需要自己实现一个数据库客户端(各种数据库都提供了一系列API可以使我们较为方便地实现一个客户端),而由于不同数据库提供的API不同,在Java领域就有大佬出来将这些API统一成一套:JDBC,每个数据库也都提供了能够适应JDBC的"驱动包"(API的具体实现)。JDBC这套API已经成为Java标准库的一部分,它屏蔽了不同数据库原生API之间的差异,使用一套API规范了不同数据库的编程操作。
♫JDBC常用接口和类
♪Connection接口
Connection 接口用于和数据库服务器建立连接,它的实现类由数据库提供,获取 Connection 对象通常有两种方式:
♩通过DriverManager(驱动管理类)的静态方法获取:
java// 加载JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 创建数据库连接 Connection connection = DriverManager.getConnection(url);
♩通过DataSource(数据源)对象获取:
java//1.创建数据源,描述数据库服务器在哪 //创建实例 DataSource dataSource = new MysqlDataSource(); //设置数据库所在的位置 ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); //设置数据库的用户名 ((MysqlDataSource)dataSource).setUser("root"); //设置数据库的密码 ((MysqlDataSource)dataSource).setPassword("123456"); //2.和数据库服务器建立连接 //记录哪个和哪个要进行通信了 Connection connection = dataSource.getConnection();
注:DriverManager类来获取的Connection连接,需要用到反射且是无法重复利用的;而DataSource提供连接池的支持,使用完会被线程池回收。
♪Statement对象
Statement 对象主要将 SQL语句发送到数据库中,每个Statement对象都通过Connection对象创建。Statement对象可以是普通的Statement(用于执行静态SQL语句)、PreparedStatement(是预编译的Statement对象,用于执行预编译的SQL语句)和CallableStatement(用于调用存储过程的Statement对象)。Statement对象中还有有两种执行SQL的方法:
♩executeQuery(): 执行后返回单个结果集,常用于select语句♩executeUpdate(): 执行后返回受影响行数,常用于update、insert、delete语句
♪ResultSet对象
使用JDBC时,执行SQL查询会返回一个结果集。ResultSet是一个包含查询结果的表格,包括行和列。可以使用ResultSet接口检索和处理这些行和列,以便在Java应用程序中使用这些数据。
♫JDBC的使用
♪添加"驱动包"
要想使用JDBC需要到数据库的官网或者是"中央仓库"去下载对应数据库版本的"驱动包",然后在idea项目下创建一个新目录,将"驱动包"拷贝到目录里,再右键选择Add as Library...键将"驱动包"作为库添加到当前项目中即可。
添加好"驱动包"后就可以开始JDBC编程了~
♪创建数据源,描述数据库服务器在哪
创建数据源可以使用DriverManger和DataSource两种,由于反射不属于常规编程手段,故这里采用DataSource的方法:
java//1.创建数据源,描述数据库服务器在哪 //创建实例 DataSource dataSource = new MysqlDataSource(); //设置数据库所在的位置 ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false"); //设置数据库的用户名 ((MysqlDataSource)dataSource).setUser("root"); //设置数据库的密码 ((MysqlDataSource)dataSource).setPassword("1234");
注:MySQL数据连接的URL参数格式为: jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
♪和数据库服务器建立连接
描述数据库服务器在哪后就可以和服务器建立连接了,通过dataSource的getConnection获取连接对象:
java//2.和数据库服务器建立连接 //记录哪个和哪个要进行通信了 Connection connection = dataSource.getConnection();
♪构建SQL语句
连接好服务器就可以构建要执行的SQL语句了,可以直接通过字符串常量构建SQL语句:
java//3.构造sql语句 //描述sql是什么样子的 String sql = "insert into student values(1,'张三')"; //jdbc中还需要搭配一个特点的对象,来描述这里的sql的情况 PreparedStatement statement = connection.prepareStatement(sql);
还可以通过输入的方式动态构建SQL语句:
javaScanner scanner = new Scanner(System.in); int id = scanner.nextInt(); String name = scanner.next(); //?为占位符,下标从1开始 String sql = "insert into student values(?,?)"; PreparedStatement statement = connection.prepareStatement(sql); //将id填充到第一个占位符 statement.setInt(1,id); //将name填充到第二个占位符 statement.setString(2,name);
注:一般不介意采用字符串拼接的方式构建SQL语句,不仅代码的可读性低,而且容易遭受SQL注入攻击
♪执行SQL语句
构建完SQL语句就可以让服务器执行对应的SQL语句了,增删改通过executeQuery()放回变更的行数,查询通过executeUpdate()放回查询的结果集:
♩增删改
javaString sql = "insert into student values(1,'张三')"; PreparedStatement statement = connection.prepareStatement(sql); //4.执行sql //给服务器发送网络请求 int len = statement.executeUpdate();
♩查询
javaString sql = "select * from student"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet resultSet = statement.executeQuery(); //遍历结果集 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println(id + ":" + name); }
♪释放资源
操作完之后需要断开连接,释放资源:
javatry { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("数据库错误"); }