目录
DriverManager 驱动管理类
作用
注册驱动
获取数据库连接
Connection 数据库连接对象
作用
获取执行SQL的对象
管理事务
Statement
作用
执行SQL语句
ResultSet 结果集对象
作用
封装了DQL查询语句的结果
获取查询结果
PreparedStatement
作用
预编译SQL语句并执行:预防SQL注入问题
使用
好处
原理
DriverManager 驱动管理类
作用
注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看源码
TIP:
MySQL 5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
获取数据库连接
DriverManager.getConnection( String url,String username,String password);
1. url:连接路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例: jdbc:mysql://127.0.0.1:3306/test1
细节:
- 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur可以简写为: jdbc:mysql:///数据库名称?参数键值对
- 配置useSSL=false参数,禁用安全连接方式,解决警告提示
2.username:用户名
3.password:密码
Connection 数据库连接对象
作用
获取执行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()
一般情况配合try/catch来使用
//3.定义SQL
String sql = "update a set score=100 where id = 4";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
e.printStackTrace();
}
Statement
作用
执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
返回值:
(1) DML语句影响的行数
(2) DDL语句执行后,执行成功也可能返回0(删除数据库后,虽然删除成功也返回0)
//3.定义SQL
// String sql = "update a set score=100 where id = 4";
// String sql = "create database abc";
String sql = "drop database abc";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
// System.out.println(count);
if (count>0){
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
ResultSet 结果集对象
作用
封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
返回值:
true:有效行,当前行有数据.
false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx:数据类型;如:int getlnt(参数) ; String getString(参数)
参数:
- int:列的编号,从1开始.
- String:列的名称
//3.定义SQL
String sql = "select * from a";
//4.获取Statement对象
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果,遍历rs中的所有数据
//6.1光标向下移动一行,并且判断当前行是否有效数据
while (rs.next()) {
//6.2 获取数据
// int id =rs.getInt(1);
// String score = rs.getString(2);
int id = rs.getInt("id");
String score = rs.getString("score");
System.out.println(id);
System.out.println(score);
System.out.println("--------");
}
输出结果
PreparedStatement
作用
预编译SQL语句并执行:预防SQL注入问题
SQL注入:通过操作输入来修改事先定义的SQL语句,用以表达执行代码对服务器进行攻击的方法
sql注入示例
String pwd = "' or '1' = '1";
//接收用户输入的用户名密码
String name ="zhangsan";
// String pwd = "123";
String pwd = "' or '1' = '1";
//定义sql
String sql = "select * from user where name ='"+name+"' and pwd ='"+pwd+"'";
//获取stmt对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
使用
①获取 PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
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(); / executeQueryo(); :不需要再传递sql
//接收用户输入的用户名密码
String name ="zhangsan";
// String pwd = "123";
String pwd = "' or '1' = '1";
//定义sql
String sql = "select * from user where name = ? and pwd = ?";
//获取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("登录失败");
}
好处
1.预编译SQL,性能更高
2.防止SQL注入:将敏感字符进行转义
原理
1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
2执行时就不用再进行这些步骤了,速度更快
3.如果sql模板一样,则只需要进行一次检查、编译