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

今日推荐语

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

日期 学习内容 打卡编号
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博客

相关推荐
kiiila21 分钟前
【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)
开发语言·qt
江木1231 小时前
Python Numba多流和共享内存CUDA优化技术学习记录
开发语言·python·学习
千里马学框架1 小时前
安卓java端service如何在native进程进行访问-跨进程通讯高端知识
android·java·开发语言·安卓framework开发·车机·跨进程·安卓窗口系统
程序研1 小时前
适配器模式
java·设计模式
NULL->NEXT1 小时前
Java(面向对象进阶——接口)
android·java·开发语言
雨 子1 小时前
Spring Boot 日志
java·spring boot·后端·log4j
技术的探险家2 小时前
R语言的文件操作
开发语言·后端·golang
violin-wang2 小时前
SpringBoot的Bean-高级-第三方Bean以及Bean管理
java·spring boot·后端·bean
梅羽落2 小时前
ideal jdk报错如何解决
java·经验分享·jdk·intellij-idea
珹洺2 小时前
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
开发语言·前端·javascript·css·gitee·bootstrap·html