概念:Java DataBase Connectivity,Java数据库连接,也就是用Java语言操作数据库。 JDBC本质:是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。 点击这里下载驱动 jar 包,提取码:r60s 复制 jar 包,可以在你的工程文件新建一个名为 libs 的包,将文件粘贴进去,右键,找到 Add as Library ,如下图:
步骤:
导入驱动 jar 包注册驱动获取数据库连接对象 Connection定义sql获取执行sql语句的对象 Statement执行sql,接收返回结果处理结果释放资源代码实现:
public class JDBCDemo01 { public static void main(String[] args) throws Exception { // 1.导入驱动jar包 // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取数据库连接对象 // localhost:3306 本机端口号为3306的程序,默认为此,可以省略 // companydb 数据库名 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb", "root", "1234"); // 4.定义sql语句 String sql = "update food set foodKind = 'miantiao' where foodId = 1"; // 5.获取执行sql的对象,Statement Statement stmt = conn.createStatement(); // 6.执行sql,返回值count是影响的行数。 int count = stmt.executeUpdate(sql); // 7.处理结果 System.out.println(count); // 8.释放资源 conn.close(); stmt.close(); }注意:这里导入的驱动 jar 包要和安装的 MySQL 的版本一致,否则会报错。 快斗安装的 MySQL 是8 . 多版本的,刚开始导入了5 . 多版本的驱动 jar 包,后来发现需要版本一致,就把驱动 jar 包换成了8 . 多的,但是还是报错,经过一番折腾,发现代码也是需要改的。在这里把能正常运行的代码贴上:
// 2.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 3.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/companydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT+8", "root", "1234");认识这些对象:
DriverManager:驱动管理对象功能:
注册驱动:告诉程序应该使用哪一个数据库驱动 jar static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager。获取数据库连接 static Connection getConnection(String url, String user, String passward) 参数: url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名。如果连接的是本机MySQL服务器,并且MySQL服务默认端口是3306,则url可以简写为jdbc:mysql:///数据库名。 user:用户名 password:密码 Connection:数据库连接对象功能:
获取执行sql的对象 Statement createStatement() PreparedStatement preparedStatement(String sql)管理事务 Statement:执行sql的对象功能:执行sql
boolean execute(String sql):可以执行任意的sqlint executeUpdate(String sql):执行DML(insert,update,delete) 语句、DDL(create,alter,drop)语句。返回值:影响的行数,可以通过这个影响的行数判断DML语句执行是否成功,返回值大于0代表成功,反之,则失败。ResultSet executeQuery(String sql):执行DQL(select)语句。 ResultSet:结果集对象,封装查询结果 next():游标向下移动一行getXxx():获取数据。Xxx 代表数据类型,如:getInt(),getString() 参数:int:代表列的编号,从1开始 String:代表列名称由于每次都要注册驱动,建立连接,释放资源等等,我们可以写一个工具类,以简化代码。对于每次建立连接时都要传入的参数 url,username,password,我们应该使用配置文件的方式,即将这些参数放入另外的一个文件中,在 src 包下新建 jdbc.properties 文件。如果想让改变连接,只用改变配置文件即可,无需改变代码。
public class JDBCUtils { private static String url; private static String user; private static String password; private static String driver; // 文件的读取,只需要读取一次就可以拿到这些值,使用静态代码块 static { try { // 创建Properties集合类 Properties prop = new Properties(); // 动态获取src下的文件路径 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL res = classLoader.getResource("jdbc"); String path = res.getPath(); System.out.println(path); // 加载文件 prop.load(new FileReader(path)); // 获取属性 url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); driver = prop.getProperty("driver"); // 注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 注册驱动 // 建立连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } // 方法重载 public static void close(Statement stmt, Connection conn) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs, Statement stmt, Connection conn) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } }那么我们写好这个工具类之后,再进行之前的update等操作就会很简单了:
public class JDBCDemo11 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { conn = JDBCUtils.getConnection(); String sql = "update `account` set money = 10 where id = 1"; stmt = conn.createStatement(); int count = stmt.executeUpdate(sql); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(stmt, conn); } } }事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
操作:
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。在执行 sql 之前开启事务提交事务:commit()。当所有 sql 都执行完提交事务。回滚事务:rollback()。在 catch() 回滚事务。代码实现:
public class JDBCDemo10 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; try { // 获取连接 conn = JDBCUtils.getConnection(); // 开启事务 conn.setAutoCommit(false); // 定义sql String sql1 = "update account set money = money - ? where id = ?"; String sql2 = "update account set money = money + ? where id = ?"; // 获取执行sql对象 pstmt1 = conn.prepareStatement(sql1); pstmt2 = conn.prepareStatement(sql2); // 给?赋值 pstmt1.setInt(1, 500); pstmt1.setInt(2, 1); pstmt2.setInt(1 ,500); pstmt2.setInt(2 ,2); // 更新数据 pstmt1.executeUpdate(); // 手动制造一个异常 int i = 3 / 0; pstmt2.executeUpdate(); // 以上代码执行都没有问题,提交事务 conn.commit(); } catch (Exception e) { // 不管在上面出现什么异常,都会到catch里面去 // 所以在这里回滚事务 try { if (conn != null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { JDBCUtils.close(pstmt1, conn); JDBCUtils.close(pstmt2, null); } } }我是快斗,请多多指教!😜
