一、概念理解
最近在学狂神说javaweb视频,他的JDBC讲的很不错,写成技术博客分享给大家,同时方便自己复习,使用。进入正题:
什么是JDBC(Java DataBase Connectivity):java连接数据库
需要jar包支持:
- java.sql
- javax.sql
- mysql-connector-java 连接驱动,必须导入!
二、写JDBC代码前环境搭建:
- 数据库代码:
CREATE TABLE users(
id INT PRIMARY KEY,
`name` VARCHAR(40),
`password` VARCHAR(40),
email VARCHAR(60),
birthday DATE
);
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'张三','123456','[email protected]','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'李四','123456','[email protected]','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'王五','123456','[email protected]','2000-01-01');
SELECT * FROM users;
- 导入数据库依赖
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- IDEA中连接数据库
三、JDBC代码步骤
- 加载驱动
- 连接数据库,该对象代表数据库
- 向数据库发送sql的对象 statement : CRUD
- 编写sql (根据业务,不同的sql)
- 执行sql
- 关闭连接
代码如下:
package com.xu.test;
import jdk.nashorn.internal.runtime.OptimisticReturnFilters;
import java.sql.*;
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";
String username = "root";
String password = "root";
//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 users";
//5.执行查询sql,返回一个结果集
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println("id = " + rs.getObject("name"));
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();
}
}
上述代码中,查询使用的代码是:
ResultSet rs = statement.executeQuery(sql);
然而,增删改都是用,返回值是受影响的行数:
int i = statement.executeUpdate(sql);
预编译sql代码:
package com.xu.test;
import java.sql.*;
public class TestJdbc2 {
public static void main(String[] args) throws Exception {
//配置信息
//useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "root";
//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,4); //给第一个占位符? 的值赋值为4
preparedStatement.setString(2,"徐志斌"); //给第二个占位符? 的值赋值为徐志斌
preparedStatement.setString(3,"123456"); //给第三个占位符? 的值赋值为123456
preparedStatement.setString(4,"[email protected]"); //给第四个占位符? 的值赋值为4
preparedStatement.setDate(5,new Date(new java.util.Date().getTime())); //给第五个占位符? 的值赋值为5
//5.执行sql
int i = preparedStatement.executeUpdate();
if (i > 0){
System.out.println("插入成功");
}
//6.关闭连接,释放资源,一定要做,先开后关
preparedStatement.close();
connection.close();
}
}
四、事务
要么都成功,要么都失败
ACID原则:保证数据安全 (例如转账问题)
开启事务
关闭事务 commit()
事务回滚 rollback()
关闭事务
假如甲给已转账,万一系统崩溃,甲转出的钱,乙没有收到。为了防止这种情况发生,这时候就提选出事务的作用
代码展示如下:
package com.xu.test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestJdbc3 {
@Test
public void test(){
//配置信息
//useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "root";
Connection connection = null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库,该对象代表数据库
connection = DriverManager.getConnection(url, username, password);
//3.通知数据库开启事务,false代表开启
connection.setAutoCommit(false);
String sql = "update account set money = money - 100 where name = 'A'";
connection.prepareStatement(sql).executeUpdate();
//4.制造错误,体现事务作用
//int i = 1 / 0;
String sql2 = "update account set money = money + 100 where name = 'B'";
connection.prepareStatement(sql2).executeUpdate();
connection.commit(); //以上两条sql都执行成功,就提交事务!
System.out.println("success");
}catch (Exception e){
try {
//如果出现异常,就通知数据库回滚事务
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}