所谓的
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);//执行sqlint count1 = stmt.executeUpdate(sql1);//处理结果System.out.println(count1);//执行sqlint 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池,当用户访问完成数据库后,不是关闭,而是放回到池子里面,当下一个用户访问时,不需要重新建立一个