什么是JDBC?
JDBC: Java Database Connect Java连接数据库
需要jar包支持:
-
java.sql
-
javax.sql
-
mysql-connector-java 连接驱动(必须要导入)
导入数据库依赖:
<!--连接数据库包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
idea中连接数据库:
JDBC固定配置:
-
加载驱动
-
连接数据库
-
创建向数据库发送SQL语句的对象 Statement
-
根据业务编写sql
-
执行sql
-
关闭连接
package com.kwok.jdbc;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 配置信息
// useUnicode=true&characterEncoding=utf8 解决中文乱码问题
String url="jdbc:mysql://localhost:3306/practice?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123";
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 3.向数据库发送sql的对象Statement, PreparedStatement : CRUD
Statement statement = connection.createStatement();
// 4.编写SQl
String sql = "select * from teacher";
// 5.执行查询sql,返回ResultSet结果集
ResultSet res = statement.executeQuery(sql);
/*5.补充:如果是增删改数据,都用executeUpdate,返回i受影响的行数
int i = statement.executeUpdate(sql);*/
while (res.next()){
System.out.println("id="+res.getObject("tid"));
System.out.println("name="+res.getObject("tname"));
}
// 6.关闭连接。释放资源(一定要做)先开后关
res.close();
statement.close();
connection.close();
}
}
方法2:使用预编译执行SQL语句:
package com.kwok.jdbc;
import java.sql.*;
public class TestJdbc2 {
public static void main(String[] args) throws Exception {
// 配置信息
// useUnicode=true&characterEncoding=utf8 解决中文乱码问题
String url="jdbc:mysql://localhost:3306/practice?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123";
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 3.编写SQl
String sql = "insert into teacher(tid, tname) values(?,?)";
// 4.预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,5); // 给第一个占位符?的值赋值为5
preparedStatement.setString(2,"小红"); // 给第一个占位符?的值赋值为 小红
// 5.执行SQL
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
// 6.关闭连接。释放资源(一定要做)先开后关
preparedStatement.close();
connection.close();
}
}
JDBC事务:
要么都成功,要么都失败!
ACID原则:保证数据的安全。
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
转账:
A:1000
B:1000
A(900) --100--> B(1100)
import java.sql.*;
public class TestTransaction2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
/* useUnicode=true:设置使用Unicode编码,支持中文
* characterEncoding=utf8:设置字符集为utf-8
* userSSL=true:安全连接
*/
// 设置用户信息和url
String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "zhaoyuyun";
Connection connection = null;
PreparedStatement st = null;
try {
// 连接成功,Connection代表数据库对象
connection = DriverManager.getConnection(url, username, password);
// 关闭数据库的自动提交,自动会开启事务
connection.setAutoCommit(false);
String sql1 = "update `account` set `money` = `money` - 100 where `name` = 'A'";
st = connection.prepareStatement(sql1);
st.executeUpdate();
// 模拟报错
int x = 1/0;
String sql2 = "update `account` set `money` = `money` + 100 where `name` = 'B'";
st = connection.prepareStatement(sql2);
st.executeUpdate();
// 业务完毕,提交事务
connection.commit();
System.out.println("成功");
}catch(Exception e){
// 如果上述事务执行过程中异常,则回滚
// 默认会回滚
System.out.println("失败");
try{
connection.rollback(); // 如果失败则回滚事务
} catch (SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
} finally {
st.close();
connection.close();
}
}
}
补充:单元测试
依赖
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
简单使用:
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行方法测试,测试成功就变成绿色,不用再通过主方法psvm调用。
测试失败为红色: