JDBC 实战项目(增删改查小系统,接近完美!)017

news/2025/1/18 18:30:37/

今日推荐语

一个人如果追求不可能的事,当然就放弃了可能的事——塞万提斯

日期        学习内容        打卡编号
2025年01月15日JDBC 项目实战总结017

前言

哈喽,我是菜鸟阿康。

今天给大家分享,我学完 JDBC 增删改查的实操项目,包含项目介绍以及项目收获两大部分,有干货。(本文已绑定项目源代码)

文末和主页有往期学习笔记,大家感兴趣也可以去看下。

继续加油!铁铁们!


一、项目概述

本项目主要是结合了 javaSE 以及 jdbc 的知识点,连接数据库实现基本的增删改查。

备注:此项目只做了后端功能,前端数据通过控制台手动录入数据。

(一)项目总览

1.启动与使用

找到主程序,运行项目 main 方法 即可启动项目,并根据提示登录账户、操作系统。

2.项目需求

(二)项目亮点

虽然这还仅仅是一个简单的增删改查后端小系统,但我在实战过程中侧重综合利用 javaSE 、jdbc 的知识来完成编码,主要有以下亮点。

1.编码规范,可读性高

在编码过程中,根据“万物皆对象”的思想,对用户、商品抽象成独立的类。编码过程也分层分类创建目录,另外在代码业务逻辑中,在重要处也添加必要注释,便于其他人员查看,讲究可读性。

2.创建通用方法,冗余度低

增删改查场景中,针对获取链接、关闭资源、以及预编译 sql 等重复出现的一些需求,把方法抽离成公共方法或者工具类,极大精简代码,降低代码的冗余度。

比如添加、删除、入库、出库等需求尽管具体业务细节不一样,但是都是 update 操作,所以统一写了一个 update 通用方法去实现,在不同的场景中只需要传入对应的 sql ,调用这个通用方法就可以。

3.融合知识,刻意练习

完成这个小项目过程中,我尽可能联想已经学过的知识点,并加以应用,其中显而易见地有以下几点:

3.1 面向对象三大特征(封装、继承、多态)

对用户、商品类进行封装,获取数据以对象为主;接口的应用(多态);自定义异常(继承)

3.2  反射

在解析数据库的数据集 ResultSet 时,利用泛型和反射来动态解析结果数据。

3.3 JDBC连接池

应用了阿里巴巴的 druid (德鲁伊)连接池,高效地操作数据。

3.4 事务管理

手动、开启关闭事务,提高代码的健壮性。

3.5 数据库字段转驼峰

在 jdbc 学习过程中,学习了数据库字段转驼峰格式的知识,特意运用起来。

备注:定义数据库字段时,两个单词的分隔并非是按照 java 的驼峰格式,有时以“_”的方式来定义,所以在读取到数据后,需要手动转换为 java 代码中的驼峰格式。比如user_name 与userName。

二、项目收获

通过以上项目实操,也遇到一些问题,通过解决这些问题,加深了对以前一些知识点的理解。

1.递归以 return 为不断循环条件

2.数据库字段映射失败

问题描述:

在数据表 product 中 ,我将 product_state(商品状态)设为了tinyint类型,在 java 对应实体类字段中我按规则映射为 byte 类型 ,但是在通过反射映射字段时,出现类型转换异常,java对象将 该字段当作了 boolean 类型,导致转换失败

解决方案:

01.可以修改数据库字段长度,不限制长度;

02.如果使用框架,可以使用注解自定义类型

03.替换数据类型

3.三目运算符

iOperateGoods.queryAllGoods(Goods.class) == null ? iOperateGoods.queryAllGoods(Goods.class).stream().forEach(x-> System.out.println("数据为空")):iOperateGoods.queryAllGoods(Goods.class).stream().forEach(x-> System.out.println(x))

这段代码编译不通过,主要错误在

4.关于唯一索引的理解

问题:

在 product 表中,我对 product_state(商品状态)建立了唯一索引,但是默认值又为1,表示在售商品,但是表里已有一条数据,导致在新增数据的时候报错。

解决方案:

唯一索引表示该字段存储的值全表唯一,不可重复,将该索引字段改为常规索引即可。

5.== 与 equals 区别

==比较的是地址值,equals 没重写之前比较的也是地址值,在项目实战中我使用 == 来比较判断属于哪个系统编码,由于 "0"和 sysOperateCode 地址值不一致没有进入逻辑判断,导致获取的商品信息为空。

6.读取用户输入的商品未实例化

问题:

在本系统中,管理员通过命令行打印流手动录入商品信息,我单独读取输入的信息,这里在方法第一行我只是声明了Goods类,并没有初始化,导致后续在 set 值的时候报空指针异常。

解决方案:

在方法第一行进行初始化。

但是到底该在哪里实例化(方法第一行/每个操作类别内部),我陷入了迷茫,担心在并发事务中可能会影响到其他事务的录入。

通过询问 gpt ,得知可以直接在第一行实例化,因为不同的用户(或线程)调用 inputGoods 方法时,它们会在各自的线程栈中创建独立的 operateGoodInfo 实例。这意味着一个线程中的 operateGoodInfo 实例与另一个线程中的实例是完全隔离的,互不影响。

7.Sanner.nextLine()键盘录入数据失败

在让用户输入是否确认操作时,我使用了nextLine命令,而这个命令会读取空行,也就是说用户可以通过空行来跳过输入,系统读取到的字符串就是一个空字符串。

而在这里,前一行我println进行了空行,可能缓存中还有空行,系统直接默认用户输入了空行,所以跳过键盘输入。

8.类未初始化的初始值

在未初始化时(User user = null ),实体类对象为空,初始化后会是默认值(user = new User() ),比如int 类型字段为0,string 为 null。

9.toString()方法里转义字符含义

重写toString()方法后,java语言对字符串类型的字段添加了‘’标识

10.toString()如何根据状态打印对应文字

在 Goods 类中,我定义了productState 字段(1在售、0下线),我想实现根据状态来打印显示不同的文字,直观显示商品是否在线。

要实现这个需求,我可以在 toString 方法中,加 if 判断。

三、结语

在学完 javaSE  之后,用基础知识点写过一次,当时写得比较费劲,也没有和数据库交互,主要是通过序列化到本地文件来操作数据,当时对对象、封装、抽离公共方法等概念懵懵懂懂,以一个初学者的身份勉强完成了项目;

这次学完 jdbc 重构项目,这次更像是以一个开发者的身份来开发这个小系统,其中也遇到几个实际问题,借助GPT进行解决总结,收获很大,让我对 java 语言有了更深入的理解,总体来讲对自己的进步比较满意。

我觉得我有个重要的收获是:学习一门新语言语言,作为一个初学者遇到问题或者不理解的知识点,我们不用太过于纠结,或许我们可以先了解基本概念、基本使用,随着我们知识和实战的积累,有些问题会迎刃而解,还有就是实战才能对编程产生深刻理解!!!

今天的分享就到这里啦,觉得有帮助的朋友可以点赞关注,一起成长~。

希望大家天天进步,早日涨薪!

往期笔记【文末福利】

SQL优化的7个方向(慢查询从这里排查就好了)-CSDN博客


http://www.ppmy.cn/news/1564216.html

相关文章

laravel10.x 框架中间件实现原理

中间件概念简介 在Laravel 10.x中,中间件是一种在请求到达路由处理程序之前或者之后执行的代码。它就像一个关卡,可以检查、过滤或者修改进入应用程序的HTTP请求。中间件可以用于很多场景,比如身份验证(检查用户是否登录)、日志记录(记录请求信息)、CORS(跨域资源共享)…

CloudberryDB(四)并行执行

要查看CloudberryDB & Greenplum数据库的并行度配置,可以使用以下几种方法: ### 方法一:使用SHOW命令 在Greenplum数据库中,可以使用SHOW命令来查看当前的并行度配置。例如: sql SHOW gp_parallel_degree ; SH…

threejs中的相机与物体

设置物体在17,0,0的位置,相机在10,10,10的位置,物体只能看到一部分或者压根看不见,出现这个原因是 已经超出了相机可见的椎体区域,所以更改相机可见的范围,将相机往后拉,改为20,20,20,此时能看到…

栈和队列(数据结构初阶)

文章目录 栈和队列一:栈1.1概念与结构1.2底层逻辑1.3栈的实现结构定义判空入栈出栈取栈顶元素获取栈中有效数据个数 二:队列2.1概念与结构2.2底层逻辑2.3 队列的实现结构定义初始化入队判空出队取数据有效数据个数 三:结语 欢迎大家来到我的博…

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统,广泛应用于FortiGate下一代防火墙,为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

使用Python爬虫获取1688网站实力档案信息

1. 引言 1688是阿里巴巴旗下的B2B电子商务平台,提供了丰富的商品和供应商信息。为了获取供应商的实力档案信息,我们可以使用1688的API接口item_get_strength。本文将详细介绍如何使用Python爬虫来调用该API并获取所需信息。 2. 环境准备 在开始之前&a…

mybatis延迟加载、缓存

目录 一、所需表 二、延迟加载 1.延迟加载概念 2.立即加载和延迟加载的应用场景 3.多对一延迟加载查询演示 (1)实体类 User Account (2)AccountMapper接口 (3)AccountMapper.xml (4)UserMapper接口 (5)UserMapper.xml (6)在总配置文件(mybatis-config.xml)中开启延…

Swift 专题二 语法速查

一 、变量 let, var 变量是可变的,使用 var 修饰,常量是不可变的,使用 let 修饰。类、结构体和枚举里的变量是属性。 var v1:String "hi" // 标注类型 var v2 "类型推导" let l1 "标题" // 常量class a {…