【笔记】JavaWeb-05-JDBC
JDBC
Java数据库连接
需要jar包的支持:
- java.sql
- javax.sql
- mysql-connecter-java...连接驱动
Java连接数据库实例
1. 导入MySQL驱动
mysql
mysql-connector-java
8.0.25
2. 连接MySQL数据库
在IDEA界面操作,初次连接需要下载驱动,下载即可。
注意:如果MySQL未设置时区,会报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone'
解决:IDEA连接mysql又报错!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope_liuqiker的博客-CSDN博客
3. 实例:查询
public class JdbcTest {
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";
String username = "root";
String password = ".gThqUDcl5IX";
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 3.向数据库发送sql对象statement:CRUD
Statement statement = connection.createStatement();
// 4.编写SQL
String sql = "select * from users;";
// 5.执行查询SQL,返回一个ResultSet(结果集)
ResultSet rs = statement.executeQuery(sql);
// 输出结果
while (rs.next()){
System.out.println("id="+rs.getObject("id"));
System.out.println("id="+rs.getObject("name"));
System.out.println("id="+rs.getObject("password"));
System.out.println("id="+rs.getObject("email"));
System.out.println("id="+rs.getObject("birthday"));
}
// 6.关闭连接
rs.close();
statement.close();
connection.close();
}
}
4. 实例:添加
public class JdbcTest02 {
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";
String username = "root";
String password = ".gThqUDcl5IX";
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 3.编写SQL
String sql = "INSERT INTO users(id,name,password,email,birthday) values (?,?,?,?,?)";
// 4.预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,5);
preparedStatement.setString(2,"田七");
preparedStatement.setString(3,"tq123456");
preparedStatement.setString(4,"tq123@jdbc.com");
preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));
// 5.执行查询SQL.executeUpdate返回的是一个int(即多少行受到影响)
int i = preparedStatement.executeUpdate();
if (i>0) {
System.out.println("插入成功!!");
}
// 6.关闭连接
preparedStatement.close();
connection.close();
}
}
JDBC固定步骤
查询操作
- 加载驱动;
- 连接数据库;
- 向数据库发送SQL的对象Statement:CRUD;
- 编写SQL(根据业务而不同);
- 执行SQL:executeQuery();
- 关闭连接。
增删改操作
- 加载驱动;
- 连接数据库;
- 编写SQL(根据业务而不同);
- 预编译:PreparedStatement;
- 执行SQL:executeUpdate();
- 关闭连接。
事务
要么都成功,要么都失败
ACID原则
-
原子性(A)
一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
-
一致性(C)
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
-
隔离性(I)
主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
-
持久性(D)
一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。
Java中事务实例
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
/*实例:转账*/
A:1000
B:1000
A ---100---> B
A:900
B:1100
测试回滚/提交
public class JdbcTest03 {
@Test
public void TTest() {
// 解决中文乱码:?useUnicode=true&characterEncoding=utf-8
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true;characterEncoding=utf-8";
String username = "root";
String password = ".gThqUDcl5IX";
Connection connection = null;
// 1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
// 2.连接数据库
connection = DriverManager.getConnection(url, username, password);
// 3.通知数据库开启事务,false是开启,等价于start transaction;
connection.setAutoCommit(false);
// 4. 编写SQL,执行SQL
String sql = "update account set money = money-100 where name='A';";
connection.prepareStatement(sql).execute();
// 制造错误,测试回滚rollback
int i = 1/0; // 注释掉,即可正常运行
String sql2 = "update account set money = money+100 where name='B';";
connection.prepareStatement(sql2).execute();
// 5.提交事务
connection.commit(); // 以上两条sql执行成功,提交
System.out.println("success!");
} catch (Exception e) {
try {
// 如果出现异常,就通知数据库回滚事务
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
单元测试工具:junit
在pom.xml导入junit包
junit
junit
4.12
使用:在需要测试的类上加入@Test注解
public class JdbcTest03 {
@Test
public void TTest(){
System.out.println("sdfwefwe");
}
}