JavaWeb--JDBC与事务
前言
- Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件。
- 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会在案例中根据不同的需求引入。
- 首先了解javaWeb的整个技术体系,掌握常用的技术知识点。
我会将JavaWeb分为8篇左右的文章来记录自己的学习过程,也方便大家逐级递增难度的学习,如有错误或遗漏欢迎大家指出。
注:本篇文章承接上一篇JavaWeb文章JavaWeb--过滤器与监听器
下面我们进入正题!
14、JDBC
什么是JDBC:Java DataBase Connection (Java连接数据库)
连接数据库需要jar包的支持:
- java.sql
- javax.sql
- mysql-connector-java(连接驱动)
JDBC 固定步骤:
1.加载驱动
2.连接数据库,代表数据库
3.向数据库发送SQL的对象Statement : CRUD
4.编写SQL (根据业务,不同的SQL)
5.执行SQL
6.关闭连接(先开的后关)
实验环境搭建:
-
数据库信息
-
导入数据库依赖
<!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency>
-
IDEA中连接数据库
-
JDBC六步
public class TestJDBC { public static void main(String[] args) throws ClassNotFoundException, SQLException { //配置信息 //解决中文乱码问题useUnicode=true&characterEncoding=utf-8 String url = "jdbc:mysql://localhost:3306/jdbc? useUnicode=true&characterEncoding=utf-8&useSSL=true"; String username = "root"; String password = "qjd011212"; //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.连接数据库,代表数据库 Connection connection = DriverManager.getConnection(url, username, password); //3.向数据库发送SQL的对象 Statement:CRUD Statement statement = connection.createStatement(); // PreparedStatement安全,可以防止sql注入(预编译) //4.编写sql String sql = "select *from jdbc.users"; //5.执行查询sql,返回一个ResultSet结果集 ResultSet rs = statement.executeQuery(sql); while (rs.next()){ System.out.println("id="+rs.getObject("id")); System.out.println("name="+rs.getObject("name")); System.out.println("password="+rs.getObject("password")); System.out.println("email="+rs.getObject("email")); System.out.println("birthday="+rs.getObject("birthday")); } //6.关闭连接,释放资源(先创建的后关闭) rs.close(); statement.close(); connection.close(); } }
- 结果:
-
使用预编译防止sql注入
public class TestJDBC2 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //配置信息 //解决中文乱码问题useUnicode=true&characterEncoding=utf-8 String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=true"; String username = "root"; String password = "qjd011212"; //1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.连接数据库,代表数据库 Connection connection = DriverManager.getConnection(url, username, password); //3.编写sql String sql = "insert into jdbc.users(id, name, password, email, birthday) VALUES (?,?,?,?,?);"; //4.预编译 PreparedStatement安全,可以防止sql注入(预编译) PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1,4);//第一个占位符?的值为1 preparedStatement.setString(2,"赵六");//第二个占位符?的值为赵六 preparedStatement.setString(3,"523456");//第三个占位符?的值为123456 preparedStatement.setString(4,"zl@qq.com");//第四个占位符?的值为1503349647@qq.com preparedStatement.setDate(5,new Date(System.currentTimeMillis()));//第五个占位符?的值为当前年月日 //5.执行查询sql int i = preparedStatement.executeUpdate(); System.out.println(i); //6.关闭连接,释放资源(先创建的后关闭) preparedStatement.close(); connection.close(); } }
- 结果:
15、事务
要么都成功,要么都失败!
ACID原则:保证数据的安全
- 原子性
- 隔离性
- 持久性
- 一致性
开启事务
事务提交commit
事务回滚rollback
关闭事务
junit单元测试
-
依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
-
简单使用:
@Test注解只有在方法上有效,只要加了这个注解的方法就可以直接运行
搭建测试事务环境:
count表:
public class TestJDBC3 {
@Test
public void test() {
//配置信息
//解决中文乱码问题useUnicode=true&characterEncoding=utf-8
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=true";
String username = "root";
String password = "qjd011212";
Connection connection = null;
//1.加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//2.连接数据库,代表数据库
connection = DriverManager.getConnection(url, username, password);
//3.通知数据库开启事务(false是开启)
connection.setAutoCommit(false);
String sql = "update jdbc.account set money = money-100 where name = 'a';";
connection.prepareStatement(sql).executeUpdate();
//制造错误
int i=1/0;
String sql2 = "update jdbc.account set money = money+100 where name = 'b';";
connection.prepareStatement(sql2).executeUpdate();
connection.commit();//以上两条sql都提交成功了就提交事务
System.out.println("提交成功!");
} catch (Exception e) {
try {
//如果出现异常,就通知数据库回滚事务
connection.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
-
出现错误就会回滚账户余额不变
-
没有错误就会正常提交事务