package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
String url="jdbc:mysql://127.0.0.1:3306/itheima";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3. 定义sql
String sql="update account set money=2000 where id=1";
// 4. 获取执行sql的对象
Statement stmt=conn.createStatement();
// 5. 执行sql
int count=stmt.executeUpdate(sql); // 受影响的行数返回值
// 6. 处理结果
System.out.println(count);
// 7. 释放资源
stmt.close();
conn.close();
}
}
DriverManager(驱动管理类)作用:
- 注册驱动
- 获取数据库连接
① 注册驱动
Class.forName("com.mysql.jdbc.Driver");
注意:Mysql 5之后的驱动包,可以省略注册驱动的步骤;
自动加载jar包中META-INF/services/java.sql.Driver 文件中的驱动类
② 获取连接
static Connection getConnection(String url,String user,String password)
Connection(数据库连接对象)作用:
- 获取执行 SQL 的对象
- 管理事务
① 获取执行 SQL 的对象
普通执行 SQL 对象
Statement createStatement();
预编译 SQL 的执行 SQL 对象:防止 SQL 注入
PreparedStatement prepareStatement(sql);
执行存储过程的对象
CallableStatement prepareCall(sql)
② 事务管理
MySQL 事务管理
开启事务:BEGIN; /START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL 默认会自动提交事务
JDBC 事务管理:Connection 接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):
true 为自动提交事务;false 为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
// 1. 注册驱动
// Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
String url="jdbc:mysql:///itheima?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3. 定义sql
String sql1="update account set money=3000 where id=1";
String sql2="update account set money=4000 where id=2";
// 4. 获取执行sql的对象
Statement stmt=conn.createStatement();
// 异常处理
try {
// 开启事务
conn.setAutoCommit(false);
// 5.1 执行sql
int count1=stmt.executeUpdate(sql1); // 受影响的行数返回值
// 6.1 处理结果
System.out.println(count1);
// 5.2 执行sql
int count2=stmt.executeUpdate(sql2); // 受影响的行数返回值
// 6.2 处理结果
System.out.println(count2);
// 提交事务
conn.commit();
} catch (Exception e) {
// 回滚事务
conn.rollback();
e.printStackTrace();
}
// 7. 释放资源
stmt.close();
conn.close();
}
}
Statement 作用:
- 执行 SQL 语句
int executeUpdate(sql):执行 DML、DDL 语句
返回值:(1)DML 语句影响的行数
(2)DDL 语句执行后,执行成功也可能返回 0
ResultSet executeQuery(sql):执行 DQL 语句
返回值:ResultSet 结果集对象
ResultSet(结果集对象)作用:
- 封装了 DQL 查询语句的结果
ResultSet stmt.executeQuery(sql):执行 DQL 语句,返回 ResultSet 对象
boolean next()
(1) 将光标从当前位置向前移动一位
(2) 判断当前行是否为有效行
返回值:
true:有效行,当前行有数据
false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx:数据类型;如:int getInt(参数);String getString(参数)
参数:
// 循环判断游标是否是最后一行末尾
while(rs.next()){
// 获取数据
rs.getXxx(参数);
}
package com.itheima.jdbc;
import javax.swing.plaf.nimbus.State;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
// 1. 注册驱动
// Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
String url="jdbc:mysql:///itheima?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3. 定义sql
String sql="select * from account";
// 4. 获取 Statement 对象
Statement stmt=conn.createStatement();
// 5. 执行sql
ResultSet rs=stmt.executeQuery(sql);
// 6. 处理结果,遍历 rs 中的所有数据
// 6.1 光标向下移动一行,并且判断当前行是否有数据
while(rs.next()){
// 6.2 获取数据 getXxx()
int id=rs.getInt(1); // 1 表示第1列
String name=rs.getString(2);
double money=rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("--------------------------------");
}
// 7. 释放资源
rs.close();
stmt.close();
conn.close();
}
}
步骤:
- 定义实体类 Account
- 查询数据库,封装到 Account 对象中
- 将 Account 对象存入 ArrayList 集合中
实体类 Account
package com.itheima.pojo;
public class Account {
private int id;
private String name;
private double 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 double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
主函数
package com.itheima.jdbc;
import com.itheima.pojo.Account;
import javax.swing.plaf.nimbus.State;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
// 1. 注册驱动
// Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
String url="jdbc:mysql:///itheima?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3. 定义sql
String sql="select * from account";
// 4. 获取 Statement 对象
Statement stmt=conn.createStatement();
// 5. 执行sql
ResultSet rs=stmt.executeQuery(sql);
// 创建集合 ArrayList
List<Account> list=new ArrayList<>();
// 6. 处理结果,遍历 rs 中的所有数据
// 6.1 光标向下移动一行,并且判断当前行是否有数据
while(rs.next()){
// 创建对象
Account account=new Account();
// 6.2 获取数据 getXxx()
int id=rs.getInt("id"); // 1 表示第1列
String name=rs.getString("name");
double money=rs.getDouble("money");
// 赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
// 存入集合
list.add(account);
}
System.out.println(list);
// 7. 释放资源
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement 作用:
- 预编译 SQL 语句并执行:预防 SQL 注入问题
SQL 注入:
SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法
① 获取 PreparedStatement 对象
// SQL 语句中的参数值,使用 ? 占位符替代
String sql="select * from user where username=? and password=?"
// 通过 Connection 对象获取,并传入对应的 sql 语句
PreparedStatement pstmt=conn.preparedStatement(sql);
② 设置参数值
PreparedStatement 对象:setXxx(参数1,参数2):给 ? 赋值
Xxx:数据类型;如 setInt(参数1,参数2)
参数:
- 参数1:? 的位置编号,从1开始
- 参数2:?的值
③ 执行 SQL
executeUpdate(); / executeQuery(); :不需要再传递 sql
SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法
① 获取 PreparedStatement 对象
// SQL 语句中的参数值,使用 ? 占位符替代
String sql="select * from user where username=? and password=?"
// 通过 Connection 对象获取,并传入对应的 sql 语句
PreparedStatement pstmt=conn.preparedStatement(sql);
② 设置参数值
PreparedStatement 对象:setXxx(参数1,参数2):给 ? 赋值
Xxx:数据类型;如 setInt(参数1,参数2)
参数:
- 参数1:? 的位置编号,从1开始
- 参数2:?的值
③ 执行 SQL
executeUpdate(); / executeQuery(); :不需要再传递 sql