JDBC 概念:
- JDBC就是使用JAVA操作关系型数据库的一套API
- Java DataBase Connectivity(JAVA数据库链接)
- JDBC 是一套标准的接口
- 每个关系型数据库都有自己的实现类(驱动),使用哪个数据库导入哪个数据库的jar包。
JDBC快速入门
步骤
- 注册驱动
- Class.froName(“驱动jar包”) —反射代码 反射该类的名将类加载进内存
- 获取链接
- 使用Connection
- 定义SQL语句
- String sql =’xxx’
获取执行SQL对象
DriverManager
- Connection
- Statement
- ResultSet
-
DriverManager
管理一组JDBC驱动的工具类,里面的方法都是工具类
- 两个方法很重要
- getConnection(url, user , password) 获取数据库链接
- registerDriver(Driver driver) 注册给定的数据库驱动程序
- 注册驱动 mysql驱动5版本以上可以忽略
- 获取链接
- getConnection(url, user , password) 获取数据库链接
- 参数
- url : 数据库路径
- 语法:jdbc:mysql:// ip地址:端口号/数据库名称?参数键值对1&参数键值对2…
- 例如:jdbc:mysql://127.0.0.1:3306/test
- 链接本地数据库可以忽略地址以及端口号直接写数据库名称
- jdbc:mysql:///数据库名称?参数键值对1&参数键值对2…
- user: 数据库用户名
-
Connection
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个对应的方法
Statement作用
- 执行SQL语句— 增删改查
执行SQL语句
- int executeUpdate 执行DDL(数据库表的增删改查),DML(对数据的增删改操作)
- 返回值:
- DML语句影响的行数
- // 获取执行DML的sql的对象类Statement
Statement stmt = conn.createStatement();
int executeUpdate = stmt.executeUpdate(update);
- // 获取执行DML的sql的对象类Statement
- DML语句影响的行数
- DDL 语句执行后,执行成功也可能返回0
- // 获取执行DDL的sql的对象类Statement
Statement stmt = conn.createStatement();
int executeUpdate = stmt.executeUpdate(delete);
- // 获取执行DDL的sql的对象类Statement
- DDL 语句执行后,执行成功也可能返回0
- ResultSet executeQuery(sql): 执行DQL(查询数据操作)
- int executeUpdate 执行DDL(数据库表的增删改查),DML(对数据的增删改操作)
ResultSet
- 封装了DQL查询语句的结果
- executeQuery(sql) : 执行DQL语句查询,返回ResultSet对象
- 同样调用statement方法,不同的是增删改查调用excuteUpdate()查询调用excuteQuery()
- 查询结果获取:
- boolean next()
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
- 返回值:
- true: 有效行,当前行有数据
- false: 无效行,当前行没有数据
- xxx getXxx(参数) 获取数据
- xxx: 数据类型;
- 获取id就是getInt(),获取姓名就是getString()
- 如: int getInt(参数); String getString(参数)
- getXxx的参数:
- int: 列的编号,从1开始
- String: 列的名称
- 使用步骤:
- 游标向下移动,判断该行是否有数据:next()
- 获取数据:getXxx(参数) 参数可以是列的编号从1开始,也可以是列名
- // 创建获取SQL的对象类Statement
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
// 处理结果,遍历ResultSet的结果集,参数为列的编号
while (resultSet.next()) {
// 获取结果
int id = resultSet.getInt(1);
String name = resultSet.getString(2); } - // 处理结果,遍历ResultSet的结果集,参数为列的名称
while (resultSet.next()) {
// 获取结果
int id = resultSet.getInt(id);
String name = resultSet.getString(name); }
- ResultSet 案例
- 页面查询全部数据的来源是来自数据库
- 将每一行的数据封装成一个java对象,将这个对象存储到ArrayList集合中
- 操作步骤
- 创建一个需要查询的实体类对应数据库的字段才能将数据封装到java对象中
- 使用Statement执行ResultSet的查询数据库sql语句
- 将查询的数据放入创建的集合中
// 定义SQL查询DQL语句
String sql = “select from sell_demo”;
// 创建获取SQL的对象类Statement
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
// 创建集合
List<Sell> list = new ArrayList<>();
// 处理结果,便利ResultSet的结果集
while (resultSet.next()) {
// 创建对象
Sell sell = new Sell();
// 获取结果
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
String password1 = resultSet.getString(3);
String gender = resultSet.getString(4);
// 将查询的数据给对象赋值
sell.setId(id);
sell.setName(name);
sell.setPassword(password1);
sell.setGender(gender);
// 添加到创建的list对象中
list.add(sell); }
System.out.println(list*);
PreparedStatement
- 预编译SQL语句对象: 预防SQL注入问题
- SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
- PreparedStatement预编译功能是默认关闭的
- 开启:useServerPrepStmts=true 将该语句添加在url链接数据库路径的后面
- String url = “jdbc:mysql://127.0.0.1:3306/xxx?userSSL=false?useServerPrepStmts=true”;
- SQL注入的操作步骤
- // 接收用户输入 用户名和密码
String name = “lc”;
String pwd = “‘ or ‘1’ = ‘1”; // 关键万能sql注入语句
// 拼接sql语句字符串将java对象放入语句中使用‘“+xx+”’
String sql = “select from dept where name = ‘“+name+”‘ and password = ‘“+pwd+”‘“;
// 获取Statement对象
Statement stmt = conn.createStatement();
// 执行sql
final ResultSet resultSet = stmt.executeQuery(sql);
if (resultSet.next()) {
System.out.println(“登录成功”);
}else {
System.out.println(“error”);
*} - 普通用户登录操作步骤
- 创建用户名和密码的java对象
- 拼接sql以及java对象语句
- select * from xx where name = ‘“+name+”‘ and password = ‘“+pwd+”‘;
- // 接收用户输入 用户名和密码
String name = “test”;
String pwd = “test”;
// 拼接sql语句字符串将java对象放入语句中使用‘“+xx+”’
String sql = “select from dept where name = ‘“+name+”‘ and password = ‘“+pwd+”‘“;
// 获取Statement对象
Statement stmt = conn.createStatement();
// 执行sql
final ResultSet resultSet = stmt.executeQuery(sql);
if (resultSet.next()) {
System.out.println(“登录成功”);
}else {
System.out.println(“error”);
*} - PreparedStatemet作用
- 预编译SQL并执行SQL语句
- 获取PreparedStatement对象
- // SQL语句中的参数值使用? 代替原有的java对象占位符
- String sql = “select * from user where username = ? and password = ?”;
- // 通过Connection对象获取,并传入对应的sql语句
- PreparedStatement pstmt = conn.prepareStatement(sql);
- 设置占位符 ?的参数值
- PreparedStatement 对象: 调用setXxx(参数1,参数2):给?赋值
- Xxx: 数据类型; 如setInt(参数1 , 参数2)
- 参数:
- 参数1: ?的位置编号,从1开始 (对应的数据列)
- 参数2: ?的值 (对应的数据列名称)
- 执行SQL
- executeUpdate();executeQuery(); 不用传递sql参数
- 执行预编译SQL语句
- // 接收用户输入 用户名和密码
String name = “test”;
String pwd = “test”;
// 定义预编译sql语句
String sql = “select from dept where name = ? and password = ?”;
// 使用PreparedStatement对象注入预编译sql
PreparedStatement psstmt = conn.prepareStatement(sql);
// 设置?占位符的值
psstmt.setString(1,name);
psstmt.setString(2,pwd);
// 执行sql,预编译sql不传递参数
final ResultSet resultSet = psstmt.executeQuery();
if (resultSet.next()) {
System.out.println(“登录成功”);
}else {
System.out.println(“error”); *}
- // 接收用户输入 用户名和密码