用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)(二)
本文上接用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)
这次主要是对上一文中的查询方法做一下调整,用创建内部类的方法来实现学生信息的查询。
我们先要定义一个接口IRowMapper:
import java.sql.ResultSet;public interface IRowMapper {/*** 定义一个抽象方法* 传入的参数为ResultSet类型*/void rowMapper (ResultSet rs);
}
我们只对DBLink类中的select方法做处理:
/*** 该方法用于查询用户信息* @param sql 要执行的SQL语句* @param rowMapper 接口是无法创建对象的,所以参数rowMapper一定指向接口(IRowMapper)实现类对象*/public void select(String sql,IRowMapper rowMapper) {Connection connection = null;Statement statement = null;ResultSet resultset = null;try {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/test";connection = DriverManager.getConnection(url, "root", "root");statement = connection.createStatement();resultset = statement.executeQuery(sql);rowMapper.rowMapper(resultset);//因为rowMapper参数指向IRowMapper接口实现类对象,//所以此处将调用接口实现类中所实现的rowMapper方法/*这一行的代码其实就是将resultset中所含的学生信息作为实参传入到该接口实现类中,然后通过调用接口实现类来显示出学生的信息*/} catch (Exception e) {e.printStackTrace();} finally {try {if (statement != null) {statement.close();}} catch (SQLException e) {e.printStackTrace();}try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}try {if (resultset!= null) {resultset.close();}} catch (SQLException e) {e.printStackTrace();}}}
然后在Main方法中实现它:
case 4:{System.out.println("请输入要查询学生的学号:");String id = scanner.next();String sql = "select name from user_info where id ='"+id+"'";if(!db.exist(sql)) {System.out.println("学号不存在,查询无果!");return;}sql = "select id,name,mobile,address from user_info where id ='"+id+"'";//定义一个内部类来实现接口中的方法class RowMapper implements IRowMapper{@Overridepublic void rowMapper(ResultSet rs) {//此时的rs就包含了所查询学生的信息try {if(rs.next()) {String id1 = rs.getString("id");String name = rs.getString("name");String mobile = rs.getString("mobile");String address = rs.getString("address");System.out.println("学号:"+id1+",姓名:"+name+",手机号:"+mobile+",家庭地址:"+address);}} catch (SQLException e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();//创建对象db.select(sql, rowMapper);break;}
我们来说一下具体的执行顺序
1.Main方法从上到下依次执行;
2.执行到db.select(sql, rowMapper);
时,进入到DBLink类中的select方法;
3.接着在select方法中从上到下依次执行;
4.执行到resultset = statement.executeQuery(sql);
时,所查询的学生信息就被存储到ResultSet类型的resultset变量中了
5.再接着执行rowMapper.rowMapper(resultset);
,此时进入接口实现类(RowMapper内部类)中
6.并将resultset的值传给形参rs
7.然后通过调用getString方法显示出学生信息
8.接着再回到select中将资源释放
最后再此回到Main方法中执行break;
结束!
拓展:
(可以不用看)
我们看出上面的内部类是有名内部类,我们还可以直接用匿名内部类:
db.select(sql, new IRowMapper() {@Overridepublic void rowMapper(ResultSet rs) {try {if(rs.next()) {String id1 = rs.getString("id");String name = rs.getString("name");String mobile = rs.getString("mobile");String address = rs.getString("address");System.out.println("学号:"+id1+",姓名:"+name+",手机号:"+mobile+",家庭地址:"+address);}} catch (SQLException e) {e.printStackTrace();}}});
这样就省去了创建对象那一步,代码少了一些;
其实我们还可以让代码更简洁,那就是用Lambda表达式(因为此接口只有一个抽象方法,所以可以用Lambda):
此时接口可以使用注解:
import java.sql.ResultSet;@FunctionalInterface
public interface IRowMapper {void rowMapper (ResultSet rs);
}
然后我们用Lambda表达式:
db.select(sql, (ResultSet rs) ->{try {if(rs.next()) {String id1 = rs.getString("id");String name = rs.getString("name");String mobile = rs.getString("mobile");String address = rs.getString("address");System.out.println("学号:"+id1+",姓名:"+name+",手机号:"+mobile+",家庭地址:"+address);}} catch (SQLException e) {e.printStackTrace();}});
我们还知道用Lambda表达式时,参数的类型可以不用写,所以ResultSet可以去掉。
相关文章:

(原)ubuntu中使用conda安装tensorflow-gpu
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9834567.html 参考网址: https://www.anaconda.com/blog/developer-blog/tensorflow-in-anaconda/ 之前的一篇,直接安装tensorflow的: https://www.cnblogs.com/darkknig…
SVO中 Inverse Compositional Image Alignment方法的学习笔记
SVO中 Inverse Compositional Image Alignment方法的学习笔记这篇文章光流法简介逆向光流法结尾这篇文章 在SVO系统中的"Relaxation Through Feature Alignment"部分使用的是一种特别的LK光流法:the inverse compositional Lucas-Kanade algorithm&#x…

Head First设计模式之目录
只有沉淀、积累,才能远航;沉沉浮浮,脚踏实地。 这本书已经闲置了好久,心血来潮,决定写个目录,让自己坚持看完这本书 创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖…

HANA 数据库备份hang住的解决办法
今天遇到 HANA 数据库备份hang住的情况。经过查 SAP NOTE 解决,记录一下过程。两个NOTE如下: 2452735 - HANA Backup failing with "[447]: backup could not be completed: [110122] A data backup cannot be created because another data backu…

简单DP【p2642】双子序列最大和
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和。一个连续子序列的和为该子序列中所有数之和。每个连续子序列的最小长度为1,并且两个连续子序列之…

JDBC工具类
本文主要是将JDBC最基础的增删改查的工具类的代码详细的罗列出来: 一、我们先来看一看项目结构: 二、配置JDBC工具类 1.我们先处理异常 我们知道几乎不可能一次性就写出完美的代码,都是要经过很多次的调试才行,那在调试过程中就难免会出现…

SVO 学习笔记(三)
SVO 学习笔记(三)这篇博客InitializationFrame_Handler_MonoprocessFirstFrameprocessSecondFrameprocessFramerelocalizeFrame结尾这篇博客 这篇博客将介绍SVO源代码中的frame_handler_mono、initialization两个文件的代码流程。前者是SVO系统类&#x…

CMAKE设置INSTALL工程,分别设置头文件、Lib和DLL的输出路径
使用CMAKE管理工程,可以设置工程中的INSTALL项目运行时安装的路径,使用命令:install。 可以简单的设置安装文件的路径和文件夹: set(head_files//要安装的头文件 ) install(TARGETS ${head_files} DESTINATION ${CMAKE_BINARY_DI…

2021年中国工业互联网安全大赛核能行业赛道writeup之hacker
附加题 hacker,题目描述:hacker,附件下载 hackerhttps://download.csdn.net/download/qpeity/33230528解压缩得到一个EXE文件 ARE_YOU_SDPD.exe,在一个文件夹下运行看一下。 用 IDA 反汇编一下,发现找不到程序入口&am…

利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签
当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率。既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别、语义理…

动态环境下的SLAM:DynaSLAM 论文学习笔记
动态环境下的SLAM:DynaSLAM 论文学习笔记这篇文章论文摘要系统流程相关环节的实现方法神经网络检测图中动态物体(Mask R-CNN)Low-Cost Tracking使用多视图几何的方法检测图中动态物体(Multi-view Geometry)跟踪与建图&…

用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?
自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项;若不在,则返回-1 #include <stdio.h> long generate(long n);//函数声…

团队作业8——第二次项目冲刺(Beta阶段)--第六天
会议照片: 燃尽图: 项目进展: 练习模式能够给出正确的答案,部分模块正在正在测试。 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 17% 张志杰 DEV 18% 黄海鸿 TEST 16% 康建灿 TEST 16% 许明涛 DEV…

2021年中国工业互联网安全大赛核能行业赛道writeup之隐写
附件题:隐写 题目描述:隐写 附件下载: 2021-10-12T15_44_19.17491400_00scene.jpg.zip-网络攻防文档类资源-CSDN下载 先用 010Editor 查看这个图片,能直接看到图片的头部是否完整正常,能直接看到是否隐藏了fla…

SVO 学习笔记(深度滤波)
SVO 学习笔记(深度滤波)这篇博客论文中的深度滤波深度滤波的代码流程更新Seed对象初始化Seed对象结尾这篇博客 这篇博客将介绍SVO论文中的Mapping部分,主要介绍深度滤波器在获取新的图像帧后,更新相应地图点深度的过程。ÿ…

寻找孪生素数(当p为素数时,p+2也为素数)
数学家希尔伯特在1900年国际数学家大会的报告上提出一个“孪生素数猜想”,即: 存在无穷多个素数p,使得p 2是素数。p和p2这一对差为2的素数,被称为“孪生素数”。 看起来,这个猜想是成立的,我们总能找到很多…

C++利用cin输入时检测回车的方法
今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环。 但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检…

使用grep过滤make的输出内容
make的输出内容其实分为两种,有些是到标准输出,有些是到标准错误,由于标准输出和标准错误默认都是屏幕,所以平时区分不出来, 实际上一般是error和warning信息到标准错误,其余的到标准输出。 如果要过滤erro…

2021年中国工业互联网安全大赛核能行业赛道writeup之机房密码
附件题:机房密码 题目描述: (具体描述忘记了) 经过黑客人员的不屑努力,在上位机上发现了登录密码的一半信息,剩下的一半要靠你们继续努力辣!!! ZmxhZyU3Qmgwd19hX0M 附件…

ORB-SLAM2系统的实时点云地图构建
ORB-SLAM2系统的实时点云地图构建这篇博客点云地图构建的流程代码介绍点云地图构建类对象小调整获取关键帧点云地图构建与叠加在地图中设置当前相机位置点云地图到Octomap的转换地图效果结尾这篇博客 (PS:修改于2020-9-21,添加了关于System和Tracking类…

使用maven导入jar包
我们都经历过自己写代码时有时就要引用一些第三方的jar包,这个我们都会,但在公司里进行团队开发时,是不允许我们自己导入jar包的,是由项目组长之类的统一导入jar包,我们在这里来了解一下这个过程: a、先创建…

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 19:09:28 浏览:164次0Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活…

关于CSS的长度单位及颜色表示
长度单位 1.q 1/4mm. 2.px 计算机语言中的像素。大多数网页制作常用图片分辨率为72,即每英寸像素为72,1英寸等于2.54cm。那么通过换算可以得出每厘米等于28像素。 3.em 它是描述相对于应用在当前元素的字体尺寸,所以它也是相对长度单位。一班浏览器字体大…

2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏
目录 一、尝试 二、Writeup 附加题 鱿鱼游戏(来自最近一部很火的韩剧) 题目描述: 小王由于操作不规范,误将不明U盘插入到上位机中,导致上位机中的某些关键文件被加密,但攻击者在U盘中还留下了一个可执行…

视觉惯性SLAM: VI ORB-SLAM
视觉惯性SLAM: VI ORB-SLAM这篇博客视觉惯性SLAM预备知识符号说明:相机投影变换矩阵IMU数据更新方程IMU数据的预积分VI ORB-SLAM各环节工作方式InitializationTrackingLocalMappingLoop ClosingFull BAIMU初始化估计bgb_{g}bg估计尺度sss和重力向量gWg_{W}gW&am…

AEC、AGC、ANS在视音频会议中的作用?
AGC是自动增益补偿功能(Automatic Gain Control),AGC可以自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点。ANS是背景噪音抑制功能(…

Java中的拆箱与装箱
我们先来了解一下拆箱与装箱的概念: 装箱:将基本数据类型转换为包装类; 拆箱:将包装类转换为基本数据类型 我们来看两串代码: Integer b1 127;Integer b2 127;System.out.println(b1b2);//trueInteger b3 128;Inte…

WannaCry的UWP版,哈哈哈
转载于:https://www.cnblogs.com/R00R/p/6916731.html

2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录
附件题:数据库登录(一道MISC、流量分析类型题目) 题目描述: 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包,找到flag。流量涉及到 MySQL 数据库了。 附件下载: https://download.csdn.n…

学生管理系统(用maven来导入jar包)
不废话,直接上 先看一下项目列表: 首先创建一个maven工程,然后导入相应的jar包,请参考:使用maven导入jar包 接着在Source Folder创建具体的项目: Main类(客户端) package com.z…