JDBC
简介
使用Java语言操作关系型数据库的一套API
同一套Java代码,操作不同的关系型数据库
快速入门
- 创建工程,导入驱动jar包:mysql-connector-java-5.1.48.jar
- 注册驱动:
Class.forName("com.mysql.jdbc.Driver");
- 获取连接:
Connection conn = DriverManager.getConnection(url, username, password);
- 定义sql语句
- 获取执行sql对象:
Statement stmt = conn.createStatement();
- 执行sql:
stmt.executeUpdata(sql);
- 处理返回结果
- 释放资源
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/learn";
String username = "root";
String password = "Angel22";
Connection conn = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql = "update user set salary = 2000 where id = 1";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6. 处理结果
System.out.println(count);
//7. 释放资源
stmt.close();
conn.close();
API
DriverManager
驱动管理类:
- 注册驱动
JDBC 4.0规范要求驱动程序在META-INF/services目录中提供特定的文件,这样JDBC可以自动检测和加载可用的驱动程序。因此,在现代的JDBC实现中,当使用JDBC连接数据库时,JVM会自动检测并加载驱动程序,而不再需要显式地调用Class.forName("com.mysql.jdbc.Driver")
。 - 获得数据库连接:
static Connection getConnection (String url, String user, String password)
- url语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
- 如果连接的是本机mysql服务器,并且mysq服务默认端口是3306,则ur可以简写为: jdbc:mysq/😕/数据库 名称?参数键值对
jdbc: mysqL:///db1?useSSL=faLse
禁用安全连接方式,解决警告
Connection
数据库连接对象:
-
获取执行sql的对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement (sq|)
- 执行存储过程的对象
CallableStatement prepareClall (sq|)
- 普通执行SQL对象
-
管理事务
- 开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务; false为手动提交事务,即为开启事务
- 提交事务: commit()
- 回滚事务: rollback()
try { // 开启事务 conn.setAutoCommit(false); //5. 执行sql int count1 = stmt.executeUpdate(sql1);//受影响的行数 //6. 处理结果 System.out.println(count1); int i = 3/0; //5. 执行sql int count2 = stmt.executeUpdate(sql2);//受影响的行数 //6. 处理结果 System.out.println(count2); // 提交事务 conn.commit(); } catch (Exception throwables) { // 回滚事务 conn.rollback(); throwables.printStackTrace(); }
Statement
作用:执行sql语句
int executeUpdate(sql)
: 执行DML、DDL语句
-
返回值: (1) DML语句影响的行数(2) DDL语句执行后,如果返回值是0,这通常表示执行了SQL语句,但没有影响任何记录。
-
可判断执行是否成功 (DDL成功返回值可能是0就不能这么判断)
int count = stmt. executeUpdate(sqU);//执行完DML语句,受影响的行数 if(count > 0){ System. out. println("修改成功~"); }else{ System. out . printLn("修改失败~"); }
ResultSet
ResultSet executeQuery(sql)
: 执行DQL语句
-
返回值: ResultSet 结果集对象,封装了DQL查询语句的结果
-
获取查询结果
- boolean next():
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
返回值:
true:有效行,当前行有数据
false:无效行,当前行没有数据
- xxx表示方法名 getXxx(参数):获取指定列的数据
XXX: 数据类型;如: int getInt(参数) ; String getString(参数)
参数:- int:列的编号,从1开始
- String:列的名称
- boolean next():
-
使用步骤:
- 游标向下移动一-行,并判断该行否有数据: next()
- 获取数据: getXxx(参数)
//循环判断游标是否是最后一行末尾 while(rs.next(){ //获取数据 int id = rs. getInt(1); String name = rs. getString(2) ; double money = rs. getDoubLe(3) ; }
PreparedStatement
继承自statement
-
作用:预编译SQL语句并执行:预防SQL注入问题
- SQL注入:当应用程序接受用户输入并将其直接嵌入到SQL查询中,而没有适当的转义或过滤,攻击者可以在用户输入中注入恶意的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:?的值
pstmt.setString(1, name); pstmt.setString(2, pwd);
-
执行SQL
executeUpdate(); / executeQuery();
:不需要再传递sql
-
-
原理:
- 预编译功能开启:
String urL = "jdbc:mysqL:///db1?useSSL=false&useServerPrepstmts=true";
- 预编译可以提高性能,防止sql注入
- 预编译功能开启:
数据库连接池
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个; - 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引 |起的数据库连接遗漏
- 好处:
- 资源复用
- 提升系统响应速度
- 避免数据库连接遗漏
接口DataSource
- 获取连接:
Connection getConnection())
使用步骤
-
导入jar包druid-1.1.12.jar
-
定义配置文件
driverClassName=com.mysqL.jdbc.Driver urL=jdbc :mysqL:///db1?useSSL=faLse&useServerPrepStmts=true username=root password=1234 #初始化连接数量 initialSize=5 #最大连接数 maxActive=10 #最大等待时间 maxWait=3000
-
加载配置文件
Properties prop = new Properties();
prop. Load(new FiLeInputStream( name: "src/druid. properties")) ;
-
获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
获取连接
Connection connection = dataSource.getconnection() ;
实例
-
环境准备,导入driud 和 jdbc的包
-
准备数据库,创建表
-
创建实体类Brand.java
用ctrl+r替换
池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
获取连接
Connection connection = dataSource.getconnection() ;
实例
- 环境准备,导入driud 和 jdbc的包
- 准备数据库,创建表
- 创建实体类Brand.java
用ctrl+r替换 - 写测试用例BrandTest.java