1.概述: 用java 语言操作关系型数据库的API
优点:各个数据库厂商使用相同的接口,可以随时替换数据库底层数据库而不改变访问的Java代码
2.流程:创建工程导入驱动jar 包(放在lib目录下), 注册驱动(mysql5之后的驱动包可以省略注册驱动的步骤), 获取连接,获取数据库,定义sql,获取sql 的对象,执行sql,打印,关闭资源
案例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* @author77918
* @namejcbc
* @date20232023/1/2517:19
*/
public class JDBCDEMO {
public static void main(String[] args) throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//mysql5之后不用写了
//2.获取连接
String url="jdbc:mysql://127.0.01:3306/itheima?serverTimezone=GMT%2B8";
String username ="root";
String password ="123456";
Connection conn = DriverManager.getConnection(url,username,password);
//定义sql
String sql="update account set money =money+10 where id =1";
//获取执行sql的对象statement
Statement stmt= conn.createStatement();
//执行sql
int count =stmt.executeUpdate(sql); //受影响的行数
//处理结果
System.out.println(count);
//关闭资源
stmt.close();
conn.close();
}
}
![](https://img-blog.csdnimg.cn/img_convert/286760166d84ec4cf71e7012a100ffae.png)
![](https://img-blog.csdnimg.cn/img_convert/c79a06e9c306ae6d682dd147c1b83c46.png)
3.JDBC API 详解
DriverManager:
驱动管理类 :注册驱动(classforname()) ,获取数据库连接(getConnection(url,username,password);)。工具类,有很多静态方法。
Connection:
获取执行sql 的对象:
普通执行sql 对象 Statement stmt= conn.createStatement();
预编译sql的执行sql对象 防止sql注入 :preparedStatement prepareStatement(sql)
执行存储过程的对象:CallableStatement prepareCall(sql)执行存储过程,不用于Mysql
管理事务:
Statement:
对象的作用就是用来执行sql语句
执行DDL,DML语句: int executeUpdate(String sql)
执行 DQL 语句: ResultSet executeQuery (String sql)
ResultSet:
结果集对象的作用是封装sql 查询语句的结果
提供一些方法如 Boolean next():将光标从当前位置向前移动一行,判断当前行为是否有效,有效即有数据,无效则没有数据
xxx getXxx(参数):获取数据 如 int getInt(参数)这类型的参数是列的编号 从1 开始,String getString(参数)这类参数是列的名称
PrepareStatement: 预编译sql语句并执行,预防sql注入的问题
sql注入是通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器进行攻击的方法
sql注入比如用一个拼接的sql or 1=1,这样无论怎样都会成立
用法: 获取preparedStatement 对象
设置参数值 在sql语句中使用?进行占位 setXxx (参数1, 参数2):给? 赋值,参数1 是?的位置编号,参数2 是? 的值
执行sql语句
executeUpdate():执行DDL 语句和DML 语句
executeQuery ():执行DQL语句
import java.sql.*;
/**
* @author77918
* @namejcbc
* @date20232023/1/2613:06
*/
public class testPrepared {
public static void main(String[] args) throws SQLException {
String url="jdbc:mysql://127.0.01:3306/itheima?serverTimezone=GMT%2B8";
String username ="root";
String password ="123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 接受用户输入 用户和密码
String name ="张三";
String pwd ="' or '1'='1'";
//定义sql
String sql ="select * from tb_user where username=? and password= ?";
//获取ptmt对象
PreparedStatement ptmt= conn.prepareStatement(sql);
// 设置 ?? 的值
ptmt.setString(1,name);
ptmt.setString(2,pwd);
// 执行sql
ResultSet rs = ptmt.executeQuery();
// 判断是否登录成功
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
rs.close();
ptmt.close();
conn.close();
}
}
原理: 预编译sql 性能更高,防止sql注入 将敏感字符进行转义'\'
java 代码操作数据库流程:
将sql语句发送到mysq 服务器端
mysql 服务端会对sql 语句进行如下操作 检查sql 语句 编译sql语句,将sql语句编译成可执行的函数,执行sql语句
4.数据库连接池
数据库连接池是一个容器,负责分配,管理数据库连接
允许应用程序重复使用一个现有的数据库连接,不用重新建一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处: 资源重用 提升系统响应速度 避免数据库连接遗漏
数据库连接池实现:
标准接口:DataSource
提供了获取连接的功能 Connection getConnection()
不需要再通过DriveManager 来获取Connection对象,而是通过连接池(datasource)获取connection对象
常见的数据库连接池: DBCP C3P0 Druid(最常用,性能好)
Druid 的使用
导入jar 包
定义配置文件
加载配置文件
获取数据库连接池对象
获取连接
public class DruidDemo {
public static void main(String[] args) throws IOException {
// 3.加载配置文件
Properties prop = new Properties();
prop.load (new FileInputStream("jdbc-demo/src/druid.properties"));
//4. 获取连接池对象
DataSource dataSource =DruidDataSourceFactory.createDataSource (prop);
// 5. 获取数据库连接 Connection
Connection connection=dataSource.getConnection();
System.out.println(connection);
}
}