jdbc
jdbc
- jdbc就是用java操作关系型数据库的一套API
jdbc快速入门
-
注册驱动
//mysql8 Class.forName("com.mysql.cj.jdbc.Driver"); //mysql5 Class.forName("com.mysql.jdbc.Driver");
-
获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/test"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password);
-
定义sql
String sql = "";
-
获取执行sql的对象
Statement statement = connection.createStatement();
-
执行sql
int count = statement.executeUpdate(sql);
-
处理结果
System.out.println(count);
-
释放资源
statement.close(); connection.close();
jdbc API详解
-
DriverManager
-
注册驱动
//mysql8 Class.forName("com.mysql.cj.jdbc.Driver"); //mysql5 Class.forName("com.mysql.jdbc.Driver"); //forName()方法将类加载到内存 //而java的机制决定了一个类第一次加载到内存中会自动执行静态代码块 //Driver的静态代码块中完成了驱动的注册 //mysql5之后的驱动,可以省略此行代码,自动加载
Driver
类源码static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
-
获取连接
public static Connection getConnection(String url, String username, String password)
参数
-
url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2... 示例:jdbc:mysql://127.0.0.1:3306/test 如果连接的是本机mysql服务,并且是默认端口3306,则url可简写为:jdbc:mysql:///数据库名称 可以配置useSSL=false参数,禁用安全连接方式
-
username:用户名
-
password:连接密码
-
-
-
Connection
-
获取执行SQL的对象
-
普通的执行SQL的对象
Statement createStatement()
-
预编译SQL的执行SQL的对象——防止SQL注入
PreparedStatement prepareStatement(String sql)
-
执行存储过程的对象
CallableStatement prepareCall(String sql)
-
-
事务管理
-
MySQL事务管理
开启事务: BEGIN;/START TRANSACTION; 提交事务: COMMIT; 回滚事务: ROLLBACK; MySQL默认自动提交事务
-
JDBC事务管理:
Connection
中定义了3个对应的方法//开启事务 true为自动提交事务 void setAutoCommit(boolean autoCommit) //提交事务 void commit() //回滚事务 void rollback()
-
示例
try { // 开启事务 connection.setAutoCommit(false); // 执行sql // 处理结果 //提交事务 connection.commit(); } catch (Exception e) { // 回滚事务 connection.rollback(); e.printStackTrace(); }
-
-
-
Statement
执行sql语句
-
执行DML、DDL语句
int executeUpdate(String sql) //返回值: //DML语句影响的行数 //DDL语句执行后,也可能返回0,一般不出现异常即认为正常完成了执行
-
执行DQL语句
ResultSet executeQuery(String sql) //返回值:Resultset 结果集对象
-
-
ResultSet
-
封装了DQL查询的结果
-
获取查询结果
boolean next() //将游标从当前位置向后移动一行,并判断当前行是否有效 //返回值:true:有效行,当前行有数据;false:无效行,当前行无数据
xxx getXxx(参数) //获取数据 //xxx:数据类型 //参数:int:列的编号(从1开始);String:列的名称
while (resultSet.next()) { //获取数据 }
-
-
PreparedStatement
预编译SQL语句并执行:预防SQL注入问题
SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码攻击服务器的目的
-
获取
PreparedStatement
对象//SQL语句中的参数,用?占位符替代 PreparedStatement preparedStatement = connection.prepareStatement(sql); //通过Connection对象获取,并传人对应的sql语句 ResultSet resultSet = preparedStatement.executeQuery(sql);
-
设置参数值
PreparedStatement对象:setXxx(参数1, 参数2) 给?赋值 Xxx:数据类型 参数1:?的位置编号,从1开始 参数2:?的值
-
执行SQL
//不需要再传入sql preparedStatement.executeQuery() preparedStatement.executeUpdate()
PreparedStatement
优点:-
预编译SQL,性能更好
在获取连接对象的url中加入参数:useServerPrepStmts=true
-
防止SQL注入:将敏感字符进行转义
PreparedStatement
原理:- 在获取
PreparedStatement
对象时,将sql语句发送给mysql服务器进行检查,编译 - 执行时就不用再执行这些步骤了
- 如果sql模板一样,则只需要进行一次检查、编译
-
数据库连接池
-
数据库连接池简介
数据库连接池是个容器,负责分配、管理数据库连接
他允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放一个空闲时间超过最大空闲时间的数据库连接,从而避免因为没有释放数据库连接引起的数据库连接遗漏
优点:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
-
数据库连接池实现
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口
常见的数据库连接池:
- DBCP
- C3P0
- Druid
-
Druid使用步骤
-
定义配置文件
driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useServerPrepStmts=true username: root password: 123456 # 初始化连接数量 initialSize: 5 # 最大连接数 maxActive: 10 # 最大等待时间(ms) maxWait: 3000
-
导入配置文件
-
获取数据库连接池对象
-
获取连接
// 定义配置文件、加载配置文件 Properties properties = new Properties(); properties.load(new FileInputStream("src/main/resources/druid.yml")); //获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); //获取数据库连接 Connection connection = dataSource.getConnection();
-
详细配置
配置 缺省值 说明 name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this) jdbcUrl 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto username 连接数据库的用户名 password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/使用ConfigFilter driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下) initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 maxActive 8 最大连接池数量 maxIdle 8 已经不再使用,配置了也没效果 minIdle 最小连接池数量 maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 timeBetweenEvictionRunsMillis 有两个含义: 1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun minEvictableIdleTimeMillis connectionInitSqls 物理连接初始化的时候执行的sql exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接 filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义