1、JDBC
我们先了解JDBC是什么,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC 可帮助我我们编写管理以下三种编程活动的 Java 应用程序:
我们可以通过JDBC进行简单增删查改。但是JDBC使用的前提,下载jdbc各数据库的驱动包 ,我这里用Mysql为例子,我们找到对应版本的驱动包。
下载完成之后,我们可以新建一个包把它放在里面,然后再进行找到File中的Project Structure进行下面操作,将包加载完毕
或者在pom.xml的dependencies节点中添加mysql驱动依赖:
我们在使用之前先要去了解JDBC的常用方法。
2、JDBC的常用接口
1.Driver接口
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:
- 装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
- 装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
2.Connection接口
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
使用DriverManager建立连接,需要三个参数
1)url:数据库连接的url(mysql端口号为3306)
格式如下: jdbc:mysql://数据库的ip地址:数据库的端口/数据库?参数名=参数值
注意:一般有多个参数名=参数值,如果使用8.x数据库,则需要额外加一个参数:allowPublicKeyRetrieval=true
2)user:数据库的用户名
3)password:数据库的密码
连接MySql数据库:
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名/参数名=参数值", "user", "password");
常用方法:
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务。
3.Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
- Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
- PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法(2,3方法特别重要):
execute(String sql):运行语句,返回是否有结果集
executeQuery(String sql):运行select语句,返回ResultSet结果集。
executeUpdate(String sql):运行insert/update/delete操作,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作
addBatch(String sql) :把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
4.ResultSet接口
ResultSet提供检索不同类型字段的方法,常用的有:
getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
使用后依次关闭对象及连接:ResultSet → Statement → Connection。这是因为在程序用完后要及时关闭数据库连接资源,以释放内存,避免资源耗尽。
3、JDBC的基本使用
1)、简单的增删查改
Ⅰ、查
package com.hk.sky; import java.sql.*; public class Jdbc { public static void main(String[] args) throws SQLException { // 1、使用DriverManager建立连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true", "root", "123456" ); PreparedStatement pSta = conn.prepareStatement("select * from student"); // 3、执行查询,返回结果集 ResultSet rs = pSta.executeQuery(); // 4、遍历结果集,获取查询结果 //在获取查询结果之前,你需要了解表中各列的数据类型,以便用不同的数据类型的变量来进行接收 // 通过字段名称去获取各字段对应的值,格式为: 值 = rs.get数据类型("字段名称") while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("id = " + id + ",name = " + name ); } // 5、关闭连接,释放资源 pSta.close(); conn.close(); } }
结果:
id = 1,name = 李四 id = 2,name = 王五 id = 3,name = 张三 id = 4,name = 小明
Ⅱ、增
package com.hk.sky; import java.sql.*; public class Main { public static void main(String[] args) throws SQLException { Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true", "root", "123456" ); PreparedStatement pSta=conn.prepareStatement("insert into student(id,name) values(?,?)"); pSta.setInt(1,5); pSta.setString(2,"小三"); int result=pSta.executeUpdate(); if (result>0) System.out.println("添加成功"); pSta.close(); conn.close(); } }
结果:添加成功
Ⅲ、改
package com.hk.sky; import java.sql.*; public class Main { public static void main(String[] args) throws SQLException { Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true", "root", "123456" ); PreparedStatement pSta=conn.prepareStatement("update student set id=?,name=?where id=?"); //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。 pSta.setInt(1,6); pSta.setString(2,"齐天大圣"); pSta.setInt(3,5); int result=pSta.executeUpdate(); if (result>0) System.out.println("修改成功"); pSta.close(); conn.close(); } }
结果:修改成功
Ⅳ、删
package com.hk.sky; import java.sql.*; public class Main { public static void main(String[] args) throws SQLException { Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true", "root", "123456" ); PreparedStatement pSta= conn.prepareStatement("delete from student where id = ?"); //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。 pSta.setInt(1,6); int result=pSta.executeUpdate(); if (result>0) System.out.println("删除成功"); pSta.close(); conn.close(); } }
结果:删除成功
2)简单封装
我们可以发现上面的增删查改中的代码只有中间需要去变化,因此为避免代码的冗余,我们就需要去封装起来开头连接和结尾的关闭,这样每次写代码我们只需要去写中间的部分代码
我们先把url,用户名和密码放在一个resources文件夹,并设置为资源文件夹,创建db.properties;
资源文件夹如下图所示:
jdbc.url=jdbc:mysql://localhost:3306/ku2022?useSSL=false&characterEncoding=utf8&serverTimezone=UTC&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=123456
然后再建一个utils包进行封装开头和结尾
package utils; import java.io.IOException; import java.sql.*; import java.util.Properties; /** * 封装 */ public class DBUtils { private static String url; private static String username; private static String password; // 读取配置文件 static { Properties prop = new Properties(); try { // DBUtils.class.getClassLoader().getResourceAsStream()方法可以从类路径中读取资源文件 prop.load(DBUtils.class.getClassLoader().getResourceAsStream("db.properties")); // 通过key获取value url = prop.getProperty("jdbc.url"); username = prop.getProperty("jdbc.username"); password = prop.getProperty("jdbc.password"); } catch (IOException e) { throw new RuntimeException(e); } } // 将创建连接的方法封装成静态方法,方便调用 // 将url、username、password放到配置文件当中,然后读取出来 public static Connection getConnection() { Connection conn = null; try { conn = DriverManager.getConnection( url, username, password ); } catch (SQLException e) { e.printStackTrace(); } return conn; } // 将关闭连接的方法封装成静态方法,方便调用 public static void close(ResultSet rs, PreparedStatement pStmt, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pStmt != null) { try { pStmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
下面我们来看看封装之后的如何去更新吧!
package com.hk.sky; import utils.DBUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) throws SQLException { Connection conn = DBUtils.getConnection(); PreparedStatement pstmt = conn.prepareStatement("update student set id = ?, name = ? where id = ?"); //?为占位符,这是用来设置参数值,其中?的开始位置从1开始。 pstmt.setInt(1, 1); pstmt.setString(2, "小四"); pstmt.setInt(3, 1); //提醒: // pstmt.executeQuery()实现查询,返回查询的结果(结果集) // pstmt.executeUpdate()实现增、删、改,返回的是int类型的结果,代表受影响的行数,如果为0,表示没有任何操作 int result = pstmt.executeUpdate(); if (result > 0) { System.out.println("更新成功"); } // 查询才会有ResultSet,因此此处第一个参数为null DBUtils.close(null, pstmt, conn); } }
结果:小四
还有剩下的查找,删除,更新也是类似的去修改之间部分,这就交给你们去实现。博主知识有限,望有错误请大佬指出!谢谢😀