ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JDBC从入门到连接池小白教程

JDBC从入门到连接池小白教程 一、前言我们之前学习了MySQL可以使用客户端软件手写SQL操作数据库。但在Java后端项目中我们不可能人工打开数据库客户端执行语句。想要让Java程序直接读写MySQL数据库就必须学习JDBC。很多初学者学习JDBC只会复制粘贴代码分不清各个API的作用不理解SQL注入的危害也不知道企业开发为什么要用数据库连接池。本文按照学习路线循序渐进讲解JDBC基础入门、五大核心API、SQL注入与预编译对象PreparedStatement、Druid连接池。学习完成之后你就可以独立编写Java代码实现数据库增删改查同时为后续MyBatis持久层框架打好底层基础。二、JDBC简介与快速入门1、简介JDBC 全称JavaDataBaseConnectivity Java数据库连接。它是Sun公司制定的一套操作数据库的标准接口。• 数据库厂商MySQL、Oracle实现这套接口提供数据库驱动jar包• 我们Java开发人员只需要调用统一的JDBC接口不需要适配不同数据库• 我们可以使用这套接口JDBC编程真正执行的代码是驱动jar包中的实现类• 好处切换数据库时业务代码几乎不用改动2、入门程序步骤0 创建工程导入驱动jar包导入jar包后需要右键点击 add as library 选择 Module library。① 加载驱动class.forName(com.mysql.cj.jdbc.Driver);② 获取连接/** url: MySQL对应的地址 * username: MySQL对应的用户名 * password: 对应的密码 */ Connection conn DriverManager.getConnection(url, username, password);url固定写法jdbc:mysql://MySQL对应的IP端口以及数据库的名称③ 定义SQL语句String sql update...;④ 获取执行SQL对象Statement stmt conn.createStatement();⑤ 执行SQL语句stmt.executeUpdate(sql);⑥ 处理返回结果⑦ 释放资源3、入门示例代码现数据库数据如下通过Java代码把张三的money改为2000如上运行成功且数据库中数据已更新三、JDBC五大核心API详解1、DriverManager1.1 DriverManager驱动管理类作用① 注册/加载驱动② 获取数据库连接尝试建立与给定数据库URL的连接1.2 注册驱动Class.forName(com.mysql.cj.jdbc.Driver);• 查看 Driver 类源码static{ try{ DriverManager.registerDriver(new Driver()); }catch(SQLException var1){ throw new RuntimeException(Cant register driver!); } }提示• MySQL5.1.6之后的驱动包可以省略注册驱动的步骤• 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类1.3 获取连接static ConnectiongetConnection(String url, String user, String password)• 参数① url连接路径语法jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1参数键值对2...示例jdbc:mysql://127.0.0.1:3306/db1细节• 如果连接的是本机mysql服务器并且mysql服务默认端口是3306则url可以简写为jdbc:mysql:///数据库名称?参数键值对• 配置 useSSLfalse 参数禁用安全连接方式解决警告提示② userMySQL对应的用户名③ passwordMySQL对应的密码2、Connection 连接对象2.1 Connection(数据库连接对象)作用① 获取执行SQL语句的对象② 管理事务2.2 获取执行SQL的对象• 普通执行SQL对象Statement createStatement()• 预编译SQL的执行SQL对象防止SQL注入PreparedStatement prepareStatement(sql)• 执行存储过程的对象CallableStatement prepareCall(sql)2.3 事务管理• MySQL事务管理开启事务begin; / start transaction;提交事务commit;回滚事务rollback;MySQL默认自动提交事务• JDBC事务管理Connection接口中定义了3个对应的方法开启事务setAutoCommit(boolean autoCommit)true为自动提交事务false为手动提交事务即为开启事务提交事务commit()回滚事务rollback()3、Statement SQL执行对象3.1 Statement作用① 执行SQL语句3.2 执行SQL语句int executeUpdate(sql)执行DML、DDL语句• 返回值1DML语句影响的行数 2DDL语句执行后执行成功也可能返回0• DML语句影响的行数• 执行DDL语句ResultSet executeQuery(sql)执行DQL语句• 返回值ResultSet 结果集对象4、ResultSet 结果集对象4.1 ResultSet(结果集对象)作用封装了DQL查询语句的结果本质上是一张二维数据表ResultSet stmt.executeQuery(sql)执行DQL语句返回ResultSet对象4.2 获取查询结果• boolean next()将游标从当前位置移动一行判断当前行是否为有效行返回值① true有效行当前行有数据② false无效行当前行没有数据• getInt() / getString()根据列名/下标获取字段值参数int列的编号从1开始String列的名称4.3 使用步骤① 游标向下移动一行并判断该行是否有数据next()② 获取数据getXxx(参数)//循环判断游标是否是最后一行末尾 while(rs.next()){ //获取数据 rs.getXxx(参数); }代码演示4.4 ResultSet案例查询account账户表数据封装为Account对象Java对象中并且存储到ArrayList集合中先准备一个实体类Account再在JDBCDemo_ResultSet中实现5、PreparedStatement ⭐5.1 PreparedStatement作用预编译SQL语句并执行预防SQL注入问题5.2 SQL注入SQL注入是通过操作输入来修改事先定义好的SQL语句用以达到执行代码对服务器进行攻击的方法。简单理解就是当我们需要输入用户名和密码登录时如果在密码处写一段特殊脚本就能登录成功登录成功之后就能进行攻击这样会非常不安全。案例登录场景拼接写法select * from user where usernamename and passwordpwd如果用户密码输入 or 1 1 最终SQL逻辑被篡改不需要正确密码也能登录成功这就是SQL注入• 登录案例演示SQL注入分析sql语句String sql select * from tb_user where username whflbr and password or 1 1 username whflbr and password 结果为false1 1结果为true所以where语句为true那么我们就需要通过PreparedStatement对象来解决SQL注入问题。5.3 PreparedStatement的使用① 获取 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的值③ 执行SQLexecuteUpdate(); / executeQuery(); //不需要再传递sql登录案例演示PreparedStatement会对传入的值进行转义5.4 PreparedStatement 原理• PreparedStatement 好处① 预编译SQL性能更高模板一样执行时跳过“检查语法”和“编译SQL”直接执行SQL② 防止SQL注入将敏感字符进行转义① PreparedStatement 预编译供能开启useServerPrepStmtstrue默认关闭要开启② 配置MySQL执行日志重启mysql服务后生效log-outputFILE general-log1 general_log_fileD:\MySQL\mysql.log slow-query-log1 slow_query_log_fileD:\MySQL\mysql_slow.log long_query_time2在my.ini中编辑重启MySQL就能看到mysql.log文件和mysql_slow.log文件• PreparedStatement 原理① 在获取PreparedStatement对象时将sql语句发送给mysql服务器进行检查编译这些步骤很耗时② 执行时就不用再进行这些步骤了速度更快③ 如果sql模板一样则只需要进行一次检查、编译四、数据库连接池原理与Druid使用1、数据库连接池简介• 数据库连接池是个容器负责分配、管理数据库连接Connection• 它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个• 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏• 好处• 资源重用• 提升系统响应速度• 避免数据库连接遗漏2、数据库连接池实现• 标准接口DataSource• 官方(SUN)提供的数据库连接池标准接口由第三方组织实现此接口。• 功能获取连接Connection getConnection()• 常见的数据库连接池• DBCP• C3P0• Druid• Druid(德鲁伊)• Druid连接池是阿里巴巴开源的数据库连接池项目• 功能强大性能优秀是Java语言最好的数据库连接池之一3、Druid使用步骤① 导入jar包 druid-1.2.9.jar添加为库选择模块库② 定义配置文件 druid.properties③ 加载配置文件④ 获取数据库连接池对象⑤ 获取连接五、结语本篇完整学习了Java操作数据库底层技术JDBC从基础入门代码逐一吃透DriverManager、Connection、Statement、ResultSet五大API理解危险的SQL注入漏洞掌握安全的PreparedStatement预编译方案最后学习数据库连接池Druid解决原生JDBC性能短板贴近企业真实开发规范。JDBC是所有持久层框架的基石MyBatis、MyBatis-Plus底层依然封装JDBC。把本章内容吃透后续学习持久层框架将会事半功倍。
返回列表