ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MySQL数据库JDBC编程(一)环境配置,JDBC使用简介

MySQL数据库JDBC编程(一)环境配置,JDBC使用简介 前言❤️❤️hello hello这里是洋不写bug~欢迎大家点赞关注收藏接下来进入mysql入门的最后一个部分数据库JDBC编程这篇博客的知识点比较细从驱动准备到关闭连接大部分都是大家之前没有接触过的概念铁汁们暂时看不懂的概念直接跳过就行最后从头到尾练习下代码基本上就能掌握了个人主页洋不写bug的博客所属专栏数据库mysql8.0和navicate的安装mysql安装教程铁汁们对于MySQL数据库的各种常用核心语法都可以在上面的数据库专栏学习专栏正在持续更新中有问题可以写在评论区或者私信我哦~1简介JDBC就是Java Data Base Connectivity(Java数据库连接)首字母的简写JDBC包含了一套Java定义的用于执行SQL语句的接口只定义方法没有具体的实现使开发者能够编写数据库程序是Java程序和数据库之间的桥梁JDBC的主要作用与数据库建立连接发送SQL语句和处理数据库执行结果直接看概念可能会觉得比较抽象下面就看下过程Java程序去操作数据库的话不同的数据库有不同的协议比如说连接方式不同组织数据的方式不同那能不能定义一个通用规范让Java程序来对不同数据库的操作代码都相同比如 “获取连接” 就都使用getConnection()“执行查询” 都使用executeQuery()这样程序员在Java中操作数据库就会很方便“JDBC” 本身是 Java 定义的通用规范接口JDBC内部的驱动是由各个数据库厂商来开发的因为他们对数据库的协议也比较了解JDBC的使用过程就可以概括为加载数据库厂商的驱动包建立连接创建Statement执行SQL处理结果释放资源关闭连接2下载JDBC驱动我们这里使用的是MySQL数据库既然不同的数据库的JDBC驱动程序不同那在Java中写代码前就要先搞下驱动首先在IDEA中创建项目选择Maven构建系统可能在JavaSE学习的时候使用的都是Intellij构建系统但是实际开发中更多都是使用MavenMaven定义了工程在构建过程中的一些约定让测试打包访问静态资源变得统一例如这里src目录里分为了test目录和main目录main目录中是Java项目开发时的源代码和静态资源文件test目录中是用于测试的代码生成jar包时并不会包含test目录中的内容下面有个pom.xml就是项目中关于Maven的配置文件创建Maven还有个好处那就是Maven 中央仓库中包含了绝大多数主流数据库的 JDBC 驱动我们可以直接在pom.xml配置文件中通过依赖配置引入无需手动下载和管理刚刚提到说不同数据库的JDBC驱动是不同的如果不用Maven就要从数据库官网中找比较麻烦而Maven中央仓库就类似于手机上的应用市场可以快速的配置JDBC驱动打开Maven依赖检索平台在Maven中依赖除了 JDBC 驱动还包括其他工具库、框架链接已经放在下面了Maven依赖检索平台输入Mysql搜索会发现有两个JDBC驱动第一个后面带有J就是当前最新版本第二个就是相对比较老的版本使用比较经典的8.0.33版本第一个和第二个里面都收录了在第一个和第二个里面找都可以点击8.0.33点击后就进入了这样的一个界面复制下面框里的内容在下图中已圈出接着回到IDEA中打开pom.xml配置文件在properties标签后写上一个dependencies标签接着把东西复制到这个标签中这时候点击一下右上角的这个按钮Maven 就会从中央仓库下载对应的 JDBC 驱动 JAR 包并将其引入到项目中让你的 Java 程序能够使用该驱动来操作数据库点击完下载后就会发现这里也不爆红了Maven仓库的地址在国外因此可能有少部分铁汁下载依赖的时候会特别慢甚至卡住这时候就可以把仓库镜像配置成国内的如果能成功下载依赖的铁汁们就不需要改镜像了右键IDEA程序点击打开文件所在位置进入文件位置后找到刚进入IDEA这一层点击上一层即可到达打开plugins目录根据这个路径来找到配置文件settings.xml先拷贝一份防止一会改错接着用记事本打开这个配置文件找到mirrors这部分这里面就是默认仓库镜像配置把这部分用阿里的镜像来替代把mirrors整部分都用下面这个来替代这时候改成了阿里云的镜像配置以后下载依赖走的就是阿里云的路径速度就会比较快mirrorsmirroridaliyunmaven/idmirrorOf*/mirrorOfname阿里云公共仓库/nameurlhttps://maven.aliyun.com/repository/public/url/mirrormirroridcentral/idmirrorOf*/mirrorOfnamealiyun central/nameurlhttps://maven.aliyun.com/repository/central/url/mirrormirroridspring/idmirrorOf*/mirrorOfnamealiyun spring/nameurlhttps://maven.aliyun.com/repository/spring/url/mirror/mirrors3表的准备这里博主在first_database的数据库里创建一个student表在里面加入数据CREATETABLEstudent(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,ageINT,genderVARCHAR(10));INSERTINTOstudent(name,age,gender)VALUES(marrie,18,女),(mark,20,男),(helena,19,女);4JDBC的使用JDBC的使用过程就可以概括为加载数据库厂商的驱动包建立连接创建Statement执行SQL处理结果集处理结果释放资源关闭连接1驱动加载在Java目录下创建个Demo01_DriverManager类在里面写代码在main方法中写上Class.forName()加载mysql驱动然后alt enter键捕获一下异常这段代码的作用就是加载数据库厂商提供的驱动让MySQL的jar包和Java环境建立联系代码就是下面这样try{Class.forName(com.mysql.cj.jdbc.Driver);}catch(ClassNotFoundExceptione){thrownewRuntimeException(e);}Class.forName就是加载指定的类这里加载Driver类经过一系列里面方法的调用执行就加载并注册 MySQL JDBC 驱动点击ctrl键点击一下这个Driver就进入到了数据库实现的Driver类中可以看下这个类的位置在jdbc包下如下所示这个类就是由MySQL数据厂商实现的JDBC驱动类实现了JDBC的Driver接口前面提到过不同的数据库协议不同但是数据库厂商都会基于这些接口规范来实现类确保无论什么数据库程序员写的操作代码都是一样的里面的代码就是完成驱动的注册驱动只有在注册后才能使用2建立数据库连接在前一段代码的基础上加上这段代码这个url直接复制下然后改下端口号和要访问的数据库的名称就可以了具体的信息博主标在下面的图上了大家可以看下这里回环地址大家直接复制就可以就是代表连接本机博主因为之前装过MySQL5.7版本所以端口号是3308大家第一次安装mysql端口号应该是3306实在不确定的话可以写SQL语句查下(如下所示)这里面除了url还有两个参数一个是user一个是passward就是用户和密码这里user这里写root就是数据库的默认超级管理员用户名后面写下密码这里博主的密码是123456这个密码就是打开mysql命令行工具刚开始要输入的那个密码在alt enter 一下语句捕获个异常接着创建个connection变量把连接赋给变量建立数据库的连接这部分就完成了代码如下try{// 1加载数据库厂商提供的驱动让MySQL的jar包和Java环境建立联系Class.forName(com.mysql.cj.jdbc.Driver);// 2建立数据库连接ConnectionconnectionDriverManager.getConnection(jdbc:mysql://127.0.0.1:3308/first_database?characterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse,root,123456);}catch(ClassNotFoundExceptione){thrownewRuntimeException(e);}catch(SQLExceptione){thrownewRuntimeException(e);}这里大家把url复制下来改一下端口号大部分铁汁的端口号还是3306改下数据库名字把这里的first_database改成你的数据库的名字3创建Statement和执行sql这段代码也是在try这个代码块里面写的首先创建一个 Statement 类型的变量statement接着写个字符串里面是查询的SQL语句查询就调用executeQuery方法修改数据就调用executeUpdate方法这里是查询语句就用statement调用executeQuery方法发送 SQL 语句到数据库、执行并返回结果通过resultSet变量来接收ResultSet是一个接口resultset实现类对象的引用,代码如下所示try{// 1加载数据库厂商提供的驱动让MySQL的jar包和Java环境建立联系Class.forName(com.mysql.cj.jdbc.Driver);// 2建立数据库连接ConnectionconnectionDriverManager.getConnection(jdbc:mysql://127.0.0.1:3308/first_database?characterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse,root,123456);//3,创建Statement和执行sqlStatementstatementconnection.createStatement();Stringsqlselect id,name,age,gender from student;//定义SQL语句ResultSetresultSetstatement.executeQuery(sql);//执行SQL}按住ctrl键点击Statement会发现它是一个接口这个变量存储了一个 Statement 接口实现类的对象的引用变量 statement只是这个对象的引用这部分可能有点抽象铁汁们大概看下就行4处理结果集result.next()返回的是一个boolean值true表示有下一条记录这里就使用while循环来打印数据用resultset的方法来获取这些数据不同的数据类型对应着不同的方法里面传入的列的索引根据列在表中的位置来写如下所示最后就是打印使用Messageformat类的format方法按照指定的格式拼接变量值里面的 {0}、{1}、{2}、{3} 是占位符数字表示位置索引从 0 开始后面的 id、name、age、gender 是要替换这些占位符的实际变量值。这样写的话会比直接用字符串拼接简单很多特别是表中的数据有很多列的时候while(resultSet.next()){longidresultSet.getLong(1);StringnameresultSet.getString(2);intageresultSet.getInt(3);StringgenderresultSet.getString(4);System.out.println(MessageFormat.format(学号{0}姓名{1}年龄{2}性别{3},id,name,age,gender));}5释放资源关闭连接在对数据库操作完后一定要释放资源关闭连接主要是以下两个原因数据库服务器能支持的并发连接数是有限的如果使用后不关闭连接这些连接会一直占用数据库资源最终导致新的连接请求无法建立Connection、Statement、ResultSet等对象都属于非 Java 托管的本地资源,Java无法对他们进行垃圾回收长期积累会导致内存溢出程序崩溃释放资源要在finally中完成刚刚创建的顺序是ConnectionStatementResultSet释放资源的时候就要以相反的顺序来释放这是因为Statement和ResultSet是依赖于Connection的如果先去关Connection的话那么Statement和ResultSet失去依赖就会出现异常在finally中写的话刚刚创建的connectionstatementresultSet这些都是局部变量没法使用因此就要把它们改为全局变量如下图在finally中写完close后按下alt enter键生成trycatch方法代码就基本上ok了代码如下finally{if(resultSet!null){try{resultSet.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}if(statement!null){try{statement.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}if(connection!null){try{connection.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}}代码全部写完后运行结果就是这样的6源码importjavax.xml.transform.Result;importjava.sql.*;importjava.text.MessageFormat;publicclassDemo01_DriverManager{publicstaticvoidmain(String[]args){Connectionconnectionnull;Statementstatementnull;ResultSetresultSetnull;try{// 1加载数据库厂商提供的驱动让MySQL的jar包和Java环境建立联系Class.forName(com.mysql.cj.jdbc.Driver);// 2建立数据库连接connectionDriverManager.getConnection(jdbc:mysql://127.0.0.1:3308/first_database?characterEncodingutf8serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse,root,123456);//3,创建Statement和执行sqlstatementconnection.createStatement();Stringsqlselect id,name,age,gender from student;//定义SQL语句resultSetstatement.executeQuery(sql);//执行SQL//4遍历结果集获取数据行,resultSet.next()返回一个boolean值true表示有下一条记录while(resultSet.next()){longidresultSet.getLong(1);StringnameresultSet.getString(2);intageresultSet.getInt(3);StringgenderresultSet.getString(4);System.out.println(MessageFormat.format(学号{0}姓名{1}年龄{2}性别{3},id,name,age,gender));}}catch(ClassNotFoundExceptione){thrownewRuntimeException(e);}catch(SQLExceptione){thrownewRuntimeException(e);}finally{if(resultSet!null){try{resultSet.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}if(statement!null){try{statement.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}if(connection!null){try{connection.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}}}}5扩展使用如果要根据学生的名字来查询这行的数据每次都重新写sql字符串比较麻烦能不能直接在IDEA控制台上输入学生的名字然后在数据库中进行查询将查询到的数据在控制台中打印出来只需要在刚才的代码上进行微调即可主要的修改都在创建Statement和执行sql部分//3,创建Statement和执行sqlstatementconnection.createStatement();System.out.println(请输入您要查询的名字--);Scanner scannernew Scanner(System.in);String inputNamescanner.next();Stringsqlselect id,name,age,gender from student where name inputName;//定义SQL语句resultSetstatement.executeQuery(sql);//执行SQLStringsqlselect id,name,age,gender from student where name inputName;//定义SQL语句这里要注意的是如何把inputName加到sql语句中去直接查询应该是这样的名字加个单引号因此这里也要拼接出一个单引号一般也习惯在这里也改为把while改为if表示一次只查询一条数据6SQL注入那铁汁们看下如果在IDEA控制台上这样输入强行把后面那个单引号给注释掉加上个or语句这个的sql语句就相当于是这样在navicat中运行下会直接把所有数据都查出来并不会报错但是在IDEA中运行下就直接报错了这是为什么呢这是因为官方的依赖中做了对–这些特殊字符的过滤另外检测到使用or语句也会阻止访问特殊字符用特殊语句构造一个合法的SQL语句得到结果就是SQL注入官方依赖中队特殊字符的过滤就是为了抵制SQL注入可以有效的防止数据库遭到恶意入侵在互联网早期数据库厂商的官方依赖并没有内置针对 SQL 注入的特殊字符过滤机制开发者也不注重防御如果攻击者在登录页面进行SQL注入if虽然只查询第一条数据但是第一条数据一般是管理员的账号和密码信息而且很多都是明文没有加密这时候攻击者就能用管理员身份来登入网站对网站进行破坏这也就是SQL注入攻击那么MySQL数据库厂商依赖中的特殊字符过滤就是万能的吗既然SQL会过滤 -- #也可以注释那试下#既然or的使用会被检测到那把or分隔开呢代码就像下面这样接着在IDEA中试一下会发现这样确实绕过了对特殊字符的检测可以访问到第一条数据那如何更强的防御sql注入呢这就是下篇数据库博客要聊的内容了注意SQL 注入属于非法侵入计算机信息系统、窃取数据或破坏系统的行为在全球主要国家和地区的法律中都是明确禁止的因此建议铁汁们也不要去随意尝试结语这部分知识还是很杂很多的初学铁汁们最重要的是把源码练习几遍先把代码写熟了后面再慢慢理解以上就是今天的所有内容啦完结撒花
返回列表