目录
【JDBC】
【JDBC——项目示例】
【JDBC-API】
【DriverManager】——驱动管理类
【Connection】——数据库连接对象
【Statement】——执行
【ResultSet】——结果集对象
【ResultSet——项目示例】
【PreparedStatement】——预编译
【JDBC】
【概述】:
- JDBC 就是使用Java语言操作关系型数据库的一套API
- 全称:( Java DataBase Connectivity ) Java 数据库连接
【本质】:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
【JDBC——项目示例】
调用MySQL数据库修改数据
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql = "UPDATe account SET money = 2000 WHERe id = 1;";
//获取执行sql的对象Statement
Statement stmt =conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);
//处理结果
System.out.println(count);
//释放资源
stmt.close();
conn.close();
【JDBC-API】
【DriverManager】——驱动管理类
【作用】:
1、注册驱动
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
【注意】:
- MySQL 5之后的驱动包,可以省略注册驱动的步骤
- 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2、获取数据库连接
static Connection getConnection(String url, String user, String password)
例:
Connection conn = DriverManager.getConnection(url, username, password);
【参数】
1、url:连接路径
jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2
例:jdbc:mysql://127.0.0.1:3306/db1
【注意】:
- 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
- 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
2、user:用户名
3、password:密码
【Connection】——数据库连接对象
【作用】:
1、获取执行SQL的对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement (sql)
- 执行存储过程的对象
CallableStatement prepareCall (sql)
2、管理事务
- JDBC事务管理:Connection接口中定义了3个对应的方法
//开启事务:true为自动提交事务;false为手动提交事务,即为开启事务 public void setAutoCommit(boolean autoCommit) //提交事务 public void commit() //回滚事务 public void rollback()
例:
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql1 = "UPDATE account SET money = 2000 WHERe id = 1;";
String sql2 = "UPDATE account SET money = 2000 WHERe id = 2;";
//获取执行sql的对象Statement
Statement stmt = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1 = stmt.executeUpdate(sql1);
//处理结果
System.out.println(count1);
int i = 3 / 0;
//执行sql
int count2 = stmt.executeUpdate(sql2);
//处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
}
//释放资源
stmt.close();
conn.close();
【Statement】——执行
【作用】
1、执行SQL语句
//执行DML、DDL语句 public int executeUpdate(sql) //返回值:(1) DML语句影响的行数 // (2) DDL语句执行后,执行成功也可能返回0 //执行DQL 语句 public ResultSet executeQuery(sql) //返回值:ResultSet 结果集对象
例:
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
//DML语句
String sql1 = "create database db2";
//获取执行sql的对象Statement
Statement stmt = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1 = stmt.executeUpdate(sql1);
//处理结果
if (count1>0) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
}
//释放资源
stmt.close();
conn.close();
【ResultSet】——结果集对象
【作用】
1、封装了DQL查询语句的结果
//执行DQL 语句,返回 ResultSet 对象 ResultSet stmt.executeQuery(sql)
- 获取查询结果
//(1) 将光标从当前位置向前移动一行 (2)判断当前行是否为有效行 boolean next(); //返回值: //true:有效行,当前行有数据 false:无效行,当前行没有数据 xxx getXxx(参数):获取数据 //xxx:数据类型;如:int getInt(参数) ; String getString(参数) //参数:int:列的编号,从1开始 String:列的名称
【使用步骤】
- 游标向下移动一行,并判断该行否有数据:next()
- 获取数据:getXxx(参数)
例:
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql = "select * from account";
//获取执行sql的对象Statement
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//数据处理
while (rs.next()){
int id = rs.getInt(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("----------------");
}
//释放资源
rs.close();
stmt.close();
conn.close();
【ResultSet——项目示例】
查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql = "select * from account";
//获取执行sql的对象Statement
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List list=new ArrayList<>();
//数据处理
while (rs.next()){
Account account=new Account();
int id = rs.getInt(1);
String name = rs.getString(2);
double money = rs.getDouble(3);
//赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入数组
list.add(account);
}
System.out.println(list);
//释放资源
rs.close();
stmt.close();
conn.close();
【PreparedStatement】——预编译
【作用】
1、预编译SQL语句并执行:预防SQL注入问题
【注意】:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
【方法】
1、获取PreparedStatement对象
// SQL语句中的参数值,使用?占位符替代 String sql = "select * from user where username = ? and password = ?"; // 通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt = conn.prepareStatement(sql);
2、设置参数值
//给 ? 赋值 PreparedStatement对象:setXxx(参数1,参数2) //Xxx:数据类型 ; 如 setInt (参数1,参数2) //参数: //参数1:?的位置编号,从1 开始 //参数2:?的值
3、执行SQL
//不需要再传递sql executeUpdate();/executeQuery();
例:
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//接收用户名和密码
String name = "ss";
String pwd = "'or'1'='1";
//sql语句
String sql = "select * from tb_user where username = ? and password =? ";
//获取pStmt对象
PreparedStatement pStmt = conn.prepareStatement(sql);
//设置?的值
pStmt.setString(1, name);
pStmt.setString(2, pwd);
//执行sql
ResultSet rs = pStmt.executeQuery();
//判断登陆是否成功
if (rs.next()) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
//释放资源
rs.close();
pStmt.close();
conn.close();
【优点】
- 预编译SQL,提高性能
- 防止SQL注入:将敏感字符转义
【原理】
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
- 执行时就不用再进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查、编译
【启用】
- 在url中加入:useServerPrepStmts=true
- 配置MySQL日志
log-output=FILE general-log=1 general_log_file="G:JAVAmysql.log" slow-query-log=1 slow_query_log_file="G:JAVAmysql_slow.log" long_query_time=2



