当前位置: 首页 > news >正文

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述:

  1. JDBC:是一种执行sql语句的Java APL,可以为多种关系类型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。有了JDBC,Java人员只需要编写一次程序就可以访问不同的数据库。

  2. JDBC APL:供程序员调用的接口与类,集成在Java.sql包中

    1. DriverManager类:管理不同的JDBC驱动

    2. Connection接口:与特定数据库连接

    3. Statement接口:执行sql

    4. PreparedStatement接口:执行sql

二、JDBC的搭建:(有总结例子)

  1. 注册JDBC驱动程序:

    初始化驱动程序,这人样就可以打开与数据库的通信信道

    Class.forName("com.mysql.cj.jdbc.Driver");

    或者

    DriverManager.registerDriver(new Driver());

  2. 建立与数据库的连接:

    这需要使用DriverManager.getConnection()方法创造一个Connection对象,他代表一个物理连接的数据库

    Connection connection=DriverManager.getConnection(url,user,password);
    • URL:

      jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Sanghai

    • USER:用户名(root)

    • PASSWORD:密码

  3. 获得Stament执行sql语句
    Statement st =connection.createStatement(); 

    Statement中的方法:

    • 【int类型】 excuteUpdate(String sql) 用于执行ddl语句和dml(增删改)语句 返回操作的行数

      用于执行ddl语句返回0

      用于执行dml语句返回操作的行数

    • 【ResultSet类型】 excuteQuery(String sql)用于执行查询语句返回一个ResuSet集合

  4. 获得PrepareStatement执行sql语句

    在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数

    PrepareStatement ps = connection.prepareStatement(sql);

    PrepreStatement中的方法:

    • 【int类型】 executeUPdate(): 用于执行ddl语句和dml(增删改)语句,返回操作的行数

      用于执行ddl语句返回0

      用于执行dml语句返回操作行数

    • 【ResultSet类型】executeQuery():用于执行查询语句返回一个ResultSet集合

  5. 关闭与数据库的连接通道

    每次操作完成后关闭与数据库交互的通道

    1. connection.close();

    2. st.close();

    3. ps.close();

接下来就写一个例子来作为JDBC搭建的总结:

public class day1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2.驱动注册//方法一:都是为了创造一个对象//Class.forName("com.mysql.cj.jdbc.Driver");//放射方式加载驱动//方式二:DriverManager.registerDriver(new Driver());
​//3.建立与数据库的连接String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user="root";String password="root";//这是我的密码qwqConnection connection = DriverManager.getConnection(url,user,password);System.out.println(connection);
​//4.发送sqlStatement statement= connection.createStatement();statement.executeUpdate("insert into major(name)value('数学')");
​//或者利用PreparedStatement发送/*PreparedStatement preparedStatement = connection.prepareStatement("insert into major(name)value(?)");preparedStatement.setObject(1, "数学");preparedStatement.executeUpdate();*///5.关闭连接statement.close();connection.close();}
}

结果:

三、PreparedStatement和Statement的区别

  1. 代码的可读性和可维护性

    虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次

  2. 安全性

    防止外来代码sql注入。PreparedStatement的预占位符只能插入一个值,而会过滤其他语句;但是Statement可以插入其他语句比如or 1=1之类的和原数据库不符的条件。

举例方便直观感受:

Statement:

Statement statement= connection.createStatement();statement.executeUpdate("insert into major(name)value('数学')");

PrearedStatement:

PreparedStatement preparedStatement = connection.prepareStatement("insert into major(name)value(?)");preparedStatement.setObject(1, "数学");preparedStatement.executeUpdate();

四、结果集处理:(查询学生的姓名,性别等举例)

PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSe对象,查询结果就封装在此对象中

  • 可以使用ResultSet中的next()方法获得下一行数据

  • 使用getXXX(String name)方法获得值

举例:

有如下表:

有如下类保存学生数据:

public class Student {int number;String name;String gender;float height;Date regTime;
​public void setNumber(int number) {this.number = number;}
​public void setName(String name) {this.name = name;}
​public void setGender(String gender) {this.gender = gender;}
​public void setHeight(float height) {this.height = height;}
​public void setRegTime(Date regTime) {this.regTime = regTime;}
​
}

查询一个学生:

public class day2demo2 {public static void main(String[] args) throws SQLException {//查询学号为1的学生Student student=findStudentByNumber(1);System.out.println(student);}
​public static Student findStudentByNumber (int number) throws SQLException {DriverManager.registerDriver(new Driver());String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user="root";String password="root";//建立钰数据库的连接Connection connection= DriverManager.getConnection(url, user, password);//执行查询PreparedStatement ps = connection.prepareStatement("select number,name,gender,height,reg_time from student where number=?");ps.setObject(1, number);//执行查询后,mysql将数据分装到一个ResultSet中ResultSet re=ps.executeQuery();//将result中的数据重新包装到自己的对象中,使用起来更加方便Student student =new Student();while(re.next()){student.setNumber(re.getInt("number"));student.setGender(re.getNString("gender"));student.setName(re.getString("name"));student.setHeight(re.getFloat("height"));student.setRegTime(re.getTimestamp("reg_time"));}return student;}
}
​

结果:(显示地址)想要显示数据还要重写toString方法

查询全部学生:用Student类型的集合包装每个学生

public class day2demo {
​
/*获取数据库中的信息
*/public static void main(String[] args) throws SQLException {ArrayList<Student> students=  findStudentByNumber();System.out.println(students);}
​public static ArrayList<Student> findStudentByNumber () throws SQLException {DriverManager.registerDriver(new Driver());String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user="root";String password="root";//建立钰数据库的连接Connection connection= DriverManager.getConnection(url, user, password);//执行查询PreparedStatement ps = connection.prepareStatement("select number,name,gender,height,reg_time from student");//执行查询后,mysql将数据分装到一个resultset中ResultSet re=ps.executeQuery();//用arraylist保存student数据ArrayList<Student> students = new ArrayList<>();while(re.next()){Student student =new Student();student.setNumber(re.getInt("number"));student.setGender(re.getNString("gender"));student.setName(re.getString("name"));student.setHeight(re.getFloat("height"));student.setRegTime(re.getTimestamp("reg_time"));students.add(student);}return students;}
}

结果:

相关文章:

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述&#xff1a; JDBC&#xff1a;是一种执行sql语句的Java APL&#xff0c;可以为多种关系类型数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。有了JDBC&#xff0c;Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL&#xf…...

Nginx 负载均衡集群 节点健康检查

前言 正常情况下&#xff0c;nginx 做反向代理负载均衡的话&#xff0c;如果后端节点服务器宕掉的话&#xff0c;nginx 默认是不能把这台服务器踢出 upstream 负载集群的&#xff0c;所以还会有请求转发到后端的这台服务器上面&#xff0c;这样势必造成网站访问故障 注&#x…...

uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示

这里使用的在这里导入&#xff0c; 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 这里我封装成一个组件&#xff0c;自适应的&#xff0c;可以直接复制到自己的项目中 <template><qiun-data-charts type"mix":opts"opts":cha…...

Kotlin 协程 supervisorScope {} 运行崩溃解决

前言 简单介绍supervisorScope函数&#xff0c;它用于创建一个使用了 SupervisorJob 的 coroutineScope&#xff0c; 该作用域的特点&#xff1a;抛出的异常&#xff0c;不会 连锁取消 同级协程和父协程。 看过很多 supervisorScope {} 文档的使用&#xff0c;我照抄一摸一样…...

【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界&#xff0c;在这里&#xff0c;我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具&#xff0c;它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用&#xff0…...

Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)

开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习2.1 注解2.1.1 SpringBoot的核心注解2.1.2 配置导入注解(简化Spring配置写XML的痛苦)Configuration和Bean(人为注册Spring 的 Bean)Import(补)ImportResource(补)AutowiredQua…...

微服务下的SpringSecurity认证端

从三板斧开始微服务下的SpringSecurity开始 一、引入组件包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 二、创建适配器 AuthorizationServerConfig…...

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…...

笙默考试管理系统-MyExamTest----codemirror(65)

笙默考试管理系统-MyExamTest----codemirror&#xff08;65&#xff09; 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...

git在本地创建dev分支并和远程的dev分支关联起来

文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…...

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…...

差分--差分数组快速计算L到R值相加后的数组

目录 差分&#xff1a;思路代码&#xff1a; 原题链接 差分&#xff1a; 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...

《NLP入门到精通》栏目导读(01/2)

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...

DHSP和DNS

一、服务程序 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组…...

Python冒号的解释

1. “没什么首次没有为第二个&#xff0c;跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始&#xff1a;结束&#xff1a;一步]和任何启动&#xff0c;停止或结束可以被丢弃。a[::3]是每第三个序列。…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

固乔快递查询助手:批量、快速、全面的快递信息查询软件

在快递行业飞速发展的今天&#xff0c;如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件&#xff0c;支持多家主流快递公司查询。用户只需输入单号&#xff0c;即可快速查询到实时…...

C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

归并排序 归并算法采用非常经典的分治策略&#xff0c;每次把序列分成n/2的长度&#xff0c;将问题分解成小问题&#xff0c;由复杂变简单。 因为使用了递归算法&#xff0c;不能用于大数据的排序。 核心代码&#xff1a; using System; using System.Text; using System.Co…...

Linux的网络服务DHCP

一.了解DHCP服务 1.1 DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服…...

告别答辩夜战!Paperxie AI PPT:10 分钟把论文变「导师满分」学术演示稿

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 又到毕业季&#xff0c;当实验室的灯光熬到凌晨&#xff0c;当电脑里的论文终稿定格在最后一页&#xff0c;无数毕业生却陷入…...

3步掌控数字记忆:WeChatMsg工具让你的聊天记录不再流浪

3步掌控数字记忆&#xff1a;WeChatMsg工具让你的聊天记录不再流浪 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...

Nunchaku FLUX.1-dev 提示词工程入门:编写高质量Prompt的实用技巧与范例

Nunchaku FLUX.1-dev 提示词工程入门&#xff1a;编写高质量Prompt的实用技巧与范例 你是不是也遇到过这种情况&#xff1a;用同一个开源大模型&#xff0c;别人生成的图片精美绝伦&#xff0c;自己生成的却总差点意思&#xff0c;要么主体不对&#xff0c;要么风格跑偏&#…...

TouchGal:一站式Galgame社区解决方案终极指南

TouchGal&#xff1a;一站式Galgame社区解决方案终极指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 还在为寻找Galgame资源而四…...

OpenClaw调试技巧:百川2-13B任务失败时的日志分析与修复

OpenClaw调试技巧&#xff1a;百川2-13B任务失败时的日志分析与修复 1. 当自动化任务突然罢工时 上周三凌晨2点&#xff0c;我的OpenClaw突然停止了工作——这个本该在深夜自动整理会议纪要并归档的助手&#xff0c;悄无声息地宕机了。监控屏幕显示它卡在"正在调用百川2…...

MediaPipeUnityPlugin技术解构与实战指南:Unity AI视觉开发进阶之路

MediaPipeUnityPlugin技术解构与实战指南&#xff1a;Unity AI视觉开发进阶之路 【免费下载链接】MediaPipeUnityPlugin Unity plugin to run MediaPipe 项目地址: https://gitcode.com/gh_mirrors/me/MediaPipeUnityPlugin 问题发现&#xff1a;Unity AI视觉开发的现实…...

别再手动切换收发!用SP3485芯片实现RS485自动收发电路的保姆级教程

用SP3485芯片实现RS485自动收发电路的完整设计指南 在工业控制、楼宇自动化等长距离通信场景中&#xff0c;RS485接口因其抗干扰能力强、传输距离远等优势成为首选。然而传统RS485设计需要手动控制收发使能信号&#xff0c;不仅增加软件复杂度&#xff0c;还容易因时序错误导致…...

职场新人必看:用豆包+WPS AI+Canva免费版1小时搞定专业述职PPT(附真实案例)

职场新人1小时速成专业述职PPT&#xff1a;豆包WPS AICanva黄金组合实战指南 刚结束试用期的你&#xff0c;是否正为述职报告焦头烂额&#xff1f;看着同事那些排版精美、数据可视化的PPT&#xff0c;再对比自己Word转PPT的简陋作品&#xff0c;这种落差感我太懂了。三年前我刚…...

DeepFace模型预下载全攻略:从根源解决首次运行痛点

DeepFace模型预下载全攻略&#xff1a;从根源解决首次运行痛点 【免费下载链接】deepface A Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python 项目地址: https://gitcode.com/GitHub_Trending/de/deepface …...

告别广告侵扰:AdGuard广告拦截扩展全平台部署指南

告别广告侵扰&#xff1a;AdGuard广告拦截扩展全平台部署指南 【免费下载链接】AdguardBrowserExtension AdGuard browser extension 项目地址: https://gitcode.com/gh_mirrors/ad/AdguardBrowserExtension 副标题&#xff1a;从新手到高手的一站式配置方案 一、价值定…...