JDBC是使用java语言操作关系型数据库的一套API
官方订一起的一套操作所有关系型数据库的规则,即接口.
0 . 创建工程,导入驱动jar包
1 . 注册驱动
2 . 获取连接
3 . 定义sql语句
4 . 获取执行SQL语句
5 . 执行SQL
6 . 处理返回结果
7 . 释放资源
项目语言级别必须与所使用的jdk版本一致,不然会出现什么无效的源发行版
JDBC API 详解 DriverManager(驱动管理类)1 . 注册驱动
Class.forName("com.mysql.jdbc.Driver");
2 . 获取数据库连接
//获取连接
String url = "jdbc:mysql://localhost:3306/db1";
String username = "root";
String password = "qinshu123";
Connection conn = DriverManager.getConnection(url, username, password);
url:连接路径 jdbc:mysql://ip地址:端口号/数据库?参数键值对1&参数键值对2Connection(数据库连接对象)
1 . 获取执行SQL的对象
普通执行SQL对象
Statement createStatement()
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
2 . 管理事务
MySQL事务管理
MySQL默认自动提交事务
JDBC事务管理:Connection接口定义了3个对应的方法
//开启事务 : setAutoCommit(boolean autoCommit): //true为自动提交事务 FALSE为手动提交事务,即为开启事务 //提交事务 : commit() //回滚事务 : rollback() 利用try_catch进行回滚
package com.jackqin.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo_1connection {
public static void main(String[] args) throws Exception {
//注册驱动
//java5后可以省略
// Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
String username = "root";
String password = "qinshu123";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql
String sql1 = "update user set money = 3000 where id = 1";
String sql2 = "update user set money = 3000 where id = 2";
//获取执行sql对象
Statement stmt = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1 = stmt.executeUpdate(sql1);//受影响的行数
//处理结果
System.out.println(count1);
//执行sql
int count2 = stmt.executeUpdate(sql2);//受影响的行数
//处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
e.printStackTrace();
}
//提交事务
//释放资源
stmt.close();
conn.close();
}
}
Statement
1 . 执行SQL语句
Statement stmt = conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);//执行DML语句,受影响的行数
//处理结果
if(count > 0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
ResultSet(结果集对象)
1 . 封装了DQL查询语句的结果
//用循环判断游标是否最后一行末尾
while(rs.next()){
//获取数据
//获取列号从1开始*****
rs.getxxx()
}
代码如下:
package com.jackqin.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo_2ResultSet {
public static void main(String[] args) throws Exception {
//注册驱动
//java5后可以省略
// Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
String username = "root";
String password = "qinshu123";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql
String sql = "select * from user";
//获取执行sql对象
Statement stmt = conn.createStatement();
//执行
ResultSet rs = stmt.executeQuery(sql);
//处理结果
//光标向下移动一行,并且盘管当前行是否有数据
while(rs.next()){
int id =rs.getInt(1);
String name = rs.getString(2);
int money = rs.getInt(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-----------------------");
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
}
ResultSet案例
需求:查询account账户数据,封装Account对象中,并且存储到ArrayList集合中
step1 : 创建Account类
package com.jackqin.pojo;
public class Account {
private int id;
private String name;
private int money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + ''' +
", money=" + money +
'}';
}
}
step2 : 查询数据,封装到Account对象中
step3 : 将Account对象存入ArrayList集合中(2和3步做查询系统常用*********)
package com.jackqin.jdbc;
import com.jackqin.pojo.Account;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo_2ResultSet {
public static void main(String[] args) throws Exception {
//注册驱动
//java5后可以省略
// Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/db1?useSSL = false";
String username = "root";
String password = "qinshu123";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql
String sql = "select * from user";
//获取执行sql对象
Statement stmt = conn.createStatement();
//执行
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List list = new ArrayList<>();
//处理结果
//光标向下移动一行,并且盘管当前行是否有数据
while(rs.next()){
Account account = new Account();
int id =rs.getInt("id");
String name = rs.getString("name");
int money = rs.getInt("money");
//赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
}
System.out.println(list);
//释放资源
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement
继承Statement
1 . 预编译SQL语句并执行:预防SQL注入问题
step1 : 获取PreparedStatement对象,传入sql
eg: SQL语句中的参数值,使用?占位符代替单引号
step2 : 设置参数值
eg:就是设置?的值 setxxx(参数1,参数2)
参数1 : ?的位置编号,从1开始
参数2 : ?的值
step3 : 执行SQL
executeQuery(); //不需要传递sql
PreparedStatement原理:
1 . 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译
2 . 执行时不再执行这些步骤,速度更快
3 . 如果sql末班一样,只需要进行一次检查,编译



