JDBC
一. 概念:
通过java数据库的连接,是一种用于执行SQL语句的api,可以为多种关系型数据库的链接提供统一访问,是有一组用java语言编写的类和接口组成
二.本质:
就是java 官方提供的一套规范(接口)用于帮助开发人员快速实现不同关系型数据库(MYsql, sqlserver,Oracle,)的连接.
三. 快速入门 :
1.导包
2 . 注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取数据库的连接
//三个参数: url : jdbc:mysql://ip地址:端口号/数据库名;username : 用户名 password : 密码 Connetion con = DriverMannager.getConnetion(url,username,password)
4.获取执行者对象
Statement sta = con.createStatement();//普通执行者对象
prepareStatment preparStatrment(String sql);// 预编译执行者对象
5.执行 sql 语句
resultSet res = sta.executuQuery(String sql); //操作DQL语句(查询)
int i = sta.executeUpdata(String sql); //操作DML语句(增删改)
6.解析处理结果
int i // 修改语句中,返回的int 类型的值,表示操作的哪一行数据
resultSet // 把查询的数据封装到resultSet 对象中返回,
boolean b = resultSet.next();
// next( ) 方法返回boolean值,表示指向的行是否还有数据,有返回true, 没有返回false;
resultSet.getxxx(参数) // 获取实际数据
7.释放资源
四. 功能类详解
DriverMannger 驱动管理对象(Driver-驱动,)
1. //注册驱动: (告诉程序该使用哪一个数据库驱动)
static void registerDriver(Driver driver)
//在底层源码中,有个静态代码块,已经执行了该条语句, 所以只需要加载这个类就可以.所以可以用反射的方式执行,在mysql5后,还可以省略加载的步骤,因为有个配置文件(java.aql.Driver).文件中指定了加载
//源码
public class Driver implements java.sql.Driver {
public Driver() throws SQLException {
//构造方法
}
static {
try {
DriverManager.registerDriver(new Driver()); //注册数据库驱动
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
// 2. 获取数据库连接
static Connection getConnection(三个参数)
//. 第一个参数 : URL, 指定的路径, jdbc:sql//ip地址:端口号/数据库名称(ping 查看是否连接 ,netstat -ant|grep 端口号, 查询是否监听)
//第二个参数 :数据库用户名, 第三个参数: 数据库密码
Connection 对象 – 数据库连接对象
/*
1.获取执行者对象
*/
statement createStatement();//普通
prepareStatment preparStatrment(String sql);// 预编译执行者对象
/*
2.管理实务
*/
setAutoCommit(boolean auto )
//..
/*
3.释放资源
*/
Statement --执行者对象(执行sql语句)
// 执行DML语句
int executeUpdate(String aql);
//返回值: 结果为int类型,管理的哪一行
//执行DQL 语句
ResultSer executeQuery(String sql);
//返回值: 封装了查询的结果信息
// 释放资源
close ..
ResultSet – 结果集对象(封装查询信息)
//1.判断结果集中是否还有数据:
boolean next ();
// 有数据返回ture,并将索引向下移动一行,没有返回false;
//2. 获取结果集中的数据,
XXX getXxx('列名');
// 3. 释放资源
ResultSet 的储存结构–??
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lR8GDhtQ-1592196190480)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200613145323397.png)]
//next 方法:(模拟源码(帮助理解))--以学生表为例
public ResultSet{
//定义一个集合,用来保存数据
public List<map<String s ,Objict o>> list;
//定义一个变量,当做指针
int p=0;
map<String s ,Student> map = list.get(p);
publid boolean next(){
if(p>list.size()){
ruturn false;
}else{
p++;
map = list.get(p);
return true;
}
}
}
五. JDBC 入门案例
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取链接
Connetction con = DriverManager.getConnection(url, username, pwd);
// 3. 获取Statement
Statement sta = con.createStatement();
// 4. 执行sql语句
ResultSet rs = sta.executeQuery("select * from student");
// 5. 通过ResultSet解析结果集(List<Map<String, Object>>)
while(rs.next()) {
sout(rs.getString("name"));
}
// 6. 释放资源
rs.close();
sta.close();
con.close();
六. 编写配置文件的好处
1. 不用修改java代码
2.配置文件不会常驻内存中,在使用时重新加载文件(可以再程序运行是动态修改配置文件)
七.JDBC 工具类
目的: 提取冗余代码,读取配置文件的信息,读取src 文件的数据,需要用类加载器动态获取输入/出流.
类加载器的作用: 将我们编写的class文件,加载到jvm文件中(永久代).
八. sql 注入
实现方式就是拼接字符串在密码错误的情况下实现sql能够正常查询数据(利用sql 语句的漏洞来对系统进行攻击)
sql注入攻击的原理:
Statement 对象在执行sql语句时,将密码的一部分内容当做查询条件来执行,如果查询条件判断成立,就会查询到数据,进行操作.
SELECT * FROM user WHERE loginname= '' or 1 = 1 -- AND password='" + password + "'
解决:
preparedStatement 预编译执行者对象
作用: 预编译aql语句,又来解决sql注入问题
//创建
String sql = "select * from 表名 where name = ? ";
preparedStatement ps = connection.preparedStatement( sql);
//这是sql语句中参数占位符
ps.setxxx();
//方法跟statement一样
...
九 . JDBC事务
使用对象: connection对象
如何管理事务:
开启: setAutoCommit(booleab b ) false 表示开启
提交: Commit();
回滚: roolback();
onnection.preparedStatement( sql);
//这是sql语句中参数占位符
ps.setxxx();
//方法跟statement一样
…
##### 九 . JDBC事务
使用对象: connection对象
如何管理事务:
开启: setAutoCommit(booleab b ) false 表示开启
提交: Commit();
回滚: roolback();