本文上接用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可以去掉。

用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)(二)相关推荐

  1. sql server php删除,使用 SQL Server 添加删除修改查询储存过程

    --添加 create procedure usp_add ( @table nvarchar(255), @values nvarchar(max)=null ) as declare @sql n ...

  2. 用Mysql写一个图书管理系统并且可视化

    要用MySQL写一个图书管理系统需要先创建数据库和表,然后编写Java代码进行连接,查询,插入等操作.同时,为了方便用户操作,可以通过可视化工具将数据以表格或者图形的形式展示出来.以下是一个简单的My ...

  3. 用Spring+jdbc 写一个数据库增删改查

    用Spring+Jdbc写一个数据库增删改查 先展示项目结构 ClassBiz.java package com.gxj.biz;import java.util.List;import com.gx ...

  4. 用C语言写一个可以选择关卡添加关卡的小游戏,推箱子

    目录 关于用C语言写一个可以选择关卡的小游戏 代码部分 所有代码 Tui_Xiang_Zi.h Tui_Xiang_Zi.cpp 关卡数据 关卡数据规则 思路和建议 建议 警告 关于用C语言写一个可以 ...

  5. MongoDB 教程二: 添加, 删除,查询 shell命令

    视频:MongoDB 教程二: 添加, 删除,查询 shell命令 MongoDB Shell 常用操作命令 MonoDB   shell命令操作语法和JavaScript很类似,其实控制台底层的查询 ...

  6. SQL语句添加删除修改字段

    用SQL语句添加删除修改字段 1.增加字段      alter table docdsp    add dspcode char(200) 2.删除字段      ALTER TABLE table ...

  7. 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...

  8. 用SQL语句添加删除修改字段及一些表与字段的基本操作 .

    用SQL语句添加删除修改字段及一些表与字段的基本操作 分类: MS SQL 2009-07-02 14:41 222人阅读 评论(0) 收藏 举报 用SQL语句添加删除修改字段 1.增加字段      ...

  9. c语言学生管理系统常见问题,关于C语言学生管理系统问题

    关于C语言学生管理系统问题 我弄了两天啦~就快疯掉啦~本来那个txt文件还可以储存的~但现在又不能啦~还有那个输出所有学生的信息~我不会弄啊~~望各位达人伸出援手啊~~小弟感激不尽 #include ...

最新文章

  1. Redis大集群扩容性能优化实践
  2. Java任何一个元素都可以转换成String类型
  3. ubuntu查看cudnn是否安装成功_深度学习之目标检测系列(0) -ubuntu18.04+RTX2080Ti+cuda+cudnn安装...
  4. 荣耀手环5没有篮球鸿蒙,荣耀手环5和篮球版区别
  5. python 中用什么键缩进 —— tab 还是空格?
  6. python pandas.DataFrame选取、修改数据
  7. centos6 mysql密码_CentOS6.5下修改MySQL密码
  8. 为什么用python缩进来划分代码_Python 为什么抛弃累赘的花括号,使用缩进来划分代码块?...
  9. mysql数值类型总结及常用函数
  10. 使用HTMLParser模块解析HTML页面
  11. 修改TOMCAT的JVM虚拟机内存大小几种方式
  12. 王道机试指南读后总结-2
  13. 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
  14. SWFTools (pdf2swf) to properly work with Flex (精彩转载)
  15. Matlab矢量图导出PDF格式方式及LaTex图片排版技巧
  16. 将指定 Word 的页眉页脚复制到其他文件中
  17. 极客日报:虎牙被抬员工当事人再发声;Android 12 DP1 带来新隐私功能;IBM 考虑出售Watson Health业务...
  18. linux系统scsi硬盘,Linux系统SCSI磁盘管理全攻略(一)
  19. 洛谷 P4883 mzf的考验 解题报告
  20. 64位系统的Detours

热门文章

  1. Find Large Files in Linux
  2. SSL证书可以给多个域名使用吗?
  3. untitled与前端——初学
  4. Codeforces Round #370 (Div. 2)
  5. UML:概要设计,用什么画我的类图?
  6. 控件的实际大小与呈现大小
  7. vs2005 打sp1补丁失败的解决办法
  8. android资料整理
  9. EXT iconCls说明
  10. 内存转换Image到Icon