所谓的
JDBC
,就是使用Java代码来操作所有的关系型数据库。JDBC
本质,是一组操作数据库的接口。各厂商实现的jar包就是驱动。
一、步骤
- 创建工程,倒入驱动jar包
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
- 获取执行
SQL
对象Statement stmt = conn.createStatement();
- 获取普通执行SQL的对象
Statement createStatement()
- 预编译SQL的执行SQL对象
PreparedStatement prepareStatement(sql)
- 获取存储过程的对象
CalableStatement prepareCall(sql)
- 获取普通执行SQL的对象
- 执行SQL
stmt.executeUpdate(sql);
- 处理返回结果
- 释放资源
Connection
事务管理
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1 = stmt.executeUpdate(sql1);
//处理结果
System.out.println(count1);
//执行sql
int count2 = stmt.executeUpdate(sql2);
//处理结果
System.out.println(coutn2);
//提交事务
conn.commit();
} catch(Exception throwables) {
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
Statement
Statement
的作用- 执行
SQL
语句int executeUpdate(sql)
- 执行
DML、DDL
语句 - 返回值
- (1)
DML
语句的行数 - (2)
DLL
语句执行完毕后,执行成功返回0
- (1)
- 执行
ResultSet executeQuery(sql)
- 执行
DQL
语句 - 返回值
ResultSet
结果集对象
- 执行
- 执行
ResultSet
ResultSet stmt.executeQuery(sql)
- 执行
DQL
语句,返回ResultSet
对象
- 执行
boolean next()
- 将光标位置向前移动一行
- 判断当前行是否有效
- 返回值
true
有效行,当前行有数据false
无效行,当前行没有数据
xxx getXxx(参数)
- 获取数据
- 参数
int
列的编号,从1开始String
列的名字
//获取执行sql的对象
StatementStatement stetement = connection.createStatement();
//执行sql
ResultSet resultSet = stetement.executeQuery(sql);
List<User> list = new ArrayList<>();
//处理结果
while(resultSet.next()){
User user = new User();
//获取数据 getXxx(参数);
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int money = resultSet.getInt("money");
user.setId(id);
user.setName(name);
user.setMoney(money);
//存入集合
list.add(user);
}
System.out.println(list);
PreparedStatement
PreparedStatement
- 预编译SQL并执行(预防SQL注入问题)
SQL注入
- 通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
SQL注入
通过输入来修改事先定义好的SQL语句
需求:完成用户登陆
select * from tb_user where username='zhangsan' and password = '123';
PreparedStatement
本质上是字符转义
一、获取PreparedStatement
对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password=?";
//通过Connection对象获取,并传入对于的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
二、设置参数值
PreparedStatement对象.setXxx(参数1, 参数2) 给?赋值
Xxx: 数据类型
参数:
1. ?的位置编号,从1开始
2. ?的值
三、执行SQL
executeUpdate();
or:
executeQuery();
不需要再传递sql语句
,因为创建PreparedStatement
对象时就已经传入了
预编译
/**
* PreparedStatement原理
* 预编译SQL,性能更高,需要手动开启预编译
* useServerPrepStmts=true
* 这样,检查SQL和编译SQL只会执行一次
*/
数据库连接池
创建一个conn池,当用户访问完成数据库后,不是关闭,而是放回到池子里面,当下一个用户访问时,不需要重新建立一个