web基础6-JDBC复习
web基础6-JDBC复习
一、什么是JDBC
驱动:声卡、显卡、数据库
没有驱动,应用程序无法直达数据库。
我们的程序会通过数据库驱动,和数据库打交道!
但即使有了数据库驱动了,不同的数据库有不同的数据库驱动,那我们有10套数据库,岂不是要10套程序?JDBC就应运诞生了。
架构上:没有什么是加一层不能做的。
oracle公司为了简化 开发人员的操作,提供了一个(java操作数据库的)规范,实际上一套接口,俗称JDBC,这些规范的实现由具体的厂商去做~
对开发人员来说,只用掌握jdbc接口的操作即可,和JDBC打交道。
二、JDBC操作
2.1 导入依赖
需要导入3个包:
java.jar
javax.jar
还需要导入一个数据库驱动包:mysql-connecter-java.jar
或者通过maven导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.happy</groupId> <artifactId>javaweb-jdbc</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> </dependencies> </project>
2.2 实验环境搭建
INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`) VALUES(NULL,'张三','123456','zs@qq.com','1987-02-18'), (NULL,'李四','123456','zs@qq.com','1987-02-18'), (NULL,'王五','123456','ww@qq.com','1987-02-18'), (NULL,'赵六','123456','zl@qq.com','1987-02-18')
2.3 JDBC固定步骤
-
数据库配置4大属性
driver,url,username,password
-
加载驱动
-
连接数据库,代表数据库
-
向数据库发送SQL对象statement:CRUD
-
编写SQL(根据业务,不同sql)
-
关闭连接
2.4 代码
CRUD
package com.happy.jdbc; import com.happy.utils.JDBCUtils; import jdk.nashorn.internal.scripts.JD; import org.junit.Test; import java.sql.*; public class JDBCtest { public static void main(String[] args) throws ClassNotFoundException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { // 2.utils获取connection connection = JDBCUtils.getConnection(); // 3.向数据库发送sql的对象statement statement = connection.createStatement(); // 4.编写sql String sql = "select * from users;"; // 5.执行查询sql,返回一个ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { String name = resultSet.getString("name"); String password = resultSet.getString("password"); System.out.println(name + ":" + password); } } catch (SQLException e) { e.printStackTrace(); } finally { // 6.关闭连接 JDBCUtils.release(connection, statement, resultSet); } } @Test public void delete() { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCUtils.getConnection(); preparedStatement = connection.prepareStatement("delete from users where id=?"); preparedStatement.setInt(1, 3); // result 为受影响的行数 int result = preparedStatement.executeUpdate(); if (result > 0) { System.out.println("删除成功行数:" + result); } else { System.out.println("删除失败"); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.release(connection, preparedStatement, null); } } @Test public void insert() { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCUtils.getConnection(); preparedStatement = connection.prepareStatement("insert into users(`id`,`name`,`password`,`email`,`birthday`) values(null,?,?,?,?)"); preparedStatement.setString(1, "happy"); preparedStatement.setString(2, "666666"); preparedStatement.setString(3, "happy@qq.com"); long l = System.currentTimeMillis(); preparedStatement.setDate(4, new Date(l)); int result = preparedStatement.executeUpdate(); if (result > 0) { System.out.println("插入成功行数:" + result); } else { System.out.println("插入失败"); } } catch (SQLException e) { e.printStackTrace(); System.out.println("插入失败"); } finally { JDBCUtils.release(connection, preparedStatement, null); } } @Test public void update() { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCUtils.getConnection(); preparedStatement = connection.prepareStatement("update users set email=? where name=?"); preparedStatement.setString(1, "happy1234@qq.com"); preparedStatement.setString(2, "happy"); int result = preparedStatement.executeUpdate(); if (result > 0) { System.out.println("更新成功行数:" + result); } else { System.out.println("更新失败"); } } catch (SQLException e) { e.printStackTrace(); System.out.println("更新失败"); } finally { JDBCUtils.release(connection, preparedStatement, null); } } }
JDBCUtils.java
package com.happy.utils; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.sql.*; import java.util.Properties; public class JDBCUtils { static String driver; static String url; static String username; static String pwd; static { Properties properties = new Properties(); InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); // properties.load(in); try { properties.load(new InputStreamReader(in, "UTF-8")); // 解决中文乱码问题 } catch (IOException e) { e.printStackTrace(); } driver = properties.get("driver").toString(); url = properties.get("url").toString(); username = properties.get("username").toString(); pwd = properties.get("password").toString(); // driver = "com.mysql.cj.jdbc.Driver"; //// 后面请求参数解决中文乱码 // url = "jdbc:mysql://l ocalhost:3306/jdbc?userUnicode=true&characterEncoding=utf-8"; // username = "root"; // pwd = "1987518g"; try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { Connection connection = DriverManager.getConnection(url, username, pwd); return connection; } public static void release(Connection connection, Statement statement, ResultSet resultSet) { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
JDBC.properties
driver =com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/jdbc?userUnicode=true&characterEncoding=utf-8 username = root password = 1987518g
三、JDBC事务
事务:要么都成功,要么都失败!
3.1 事务的ACID原则
ACID原则:保证数据安全
A: 原子性。不可分割,一起失败要么一起成功
C: 一致性。前后逻辑一致,如转账前后总额不变
I: 隔离性。一个事务和另外一个事务隔离
D: 持久性(durability)一旦提交,不可回退。
Junit单元测试
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
开启事务 setAutocommit(false) 事务提交 commit() 事务回滚 rollback() 事务关闭 转账: A:1000 B:1000
3.2 JDBC事务的操作
模拟事务:转账
package com.happy.jdbc; import com.happy.utils.JDBCUtils; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; public class TxTest { @Test public void test(){ transfer(11,22,200); } public void transfer(int accountA,int accountB,int amount){ Connection connection=null; PreparedStatement preparedStatement=null; try{ connection = JDBCUtils.getConnection(); String sql="update account set money=money+? where accountId=?"; preparedStatement= connection.prepareStatement(sql); // start transaction,相当于开启事务 connection.setAutoCommit(false); update(accountA,amount,preparedStatement); // int i=1/0; update(accountB,-amount,preparedStatement); connection.commit(); } catch (SQLException e) { // 失败则都失败,进行回滚 try { connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } }finally { JDBCUtils.release(connection,preparedStatement,null); } } public void update(int accountId,int amount,PreparedStatement preparedStatement){ try { preparedStatement.setInt(2,accountId); preparedStatement.setInt(1,amount); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?