核心内容摘要
91精业传媒果冻传媒:探索视听新边界,点燃生活新灵感
前言做JavaWeb/后端开发的同学一定深有体会——每次写数据库访问层Dao都要重复编写JDBC的模板代码获取连接、创建预处理语句、处理结果集、关闭资源……不仅繁琐还容易出现资源泄漏、SQL注入等问题。
今天就给大家分享一个实战级别的「BaseDao通用封装类」直接封装了SELECT/INSERT/UPDATE/DELETE所有通用操作通过反射实现结果集自动映射到实体类彻底告别冗余JDBC代码新手也能直接复制复用本文将结合完整可运行代码逐行拆解核心逻辑讲解BaseDao的设计思路和
使用方法看完直接上手项目
BaseDao整体说明先懂设计初衷BaseDao是数据库访问层的「基础通用类」核心职责是封装JDBC的通用操作向上提供标准化的调用接口简化后续具体Dao层如StudentDao、UserDao的开发。
先看类的整体注释和结构快速把握核心定位对应代码头部注释逐句解读关键设计亮点必看✅ 通用化一套代码适配所有实体类Student、User等无需为每个实体类重复编写JDBC模板✅ 安全可靠自动管理JDBC核心资源Connection、PreparedStatement、ResultSetfinally块统一关闭杜绝资源泄漏✅ 防SQL注入全程使用PreparedStatement参数化查询?占位符彻底规避SQL注入风险✅ 反射映射通过Java反射机制自动将ResultSet结果集映射为实体类对象无需手动set赋值✅ 空安全查询无结果时返回空列表非null避免调用方出现空指针异常✅ 易维护所有JDBC通用逻辑集中在BaseDao后续修改如切换连接池、优化资源关闭只需改一处。
核心依赖说明代码中依赖了一个工具类「UtilsTest」核心提供两个功能无需修改直接复用获取数据库连接UtilsTest.getConnection()底层封装了DriverManager加载驱动、获取连接的逻辑关闭JDBC资源UtilsTest.close(资源对象)重载方法支持关闭ResultSet、PreparedStatement、Connection。
提示如果你的项目中使用了德鲁伊、C3P0等连接池只需修改UtilsTest中的getConnection()方法BaseDao无需任何改动——这就是封装的优势
核心方法逐行拆解重点中的重点BaseDao共提供4个核心方法覆盖「查询列表、查询单个对象、增删改」所有常用场景逐个拆解逻辑新手也能看懂。
测试方法main方法验证功能正确性main方法是测试入口模拟了4个实战场景直接运行就能验证所有核心方法的功能代码注释已经非常详细重点看调用方式测试
注意事项
需提前创建student表字段name、age可根据自己的实体类调整
Student实体类需提供「无参构造方法」反射创建对象时需要
实体类属性名需与数据库列名一致否则反射映射会失败后续可优化为别名映射。
通用列表查询queryList核心查询方法作用执行SELECT语句自动将结果集映射为「实体类列表」适用于多数据查询场景如分页查询、条件查询。
核心逻辑获取连接 → 预编译SQL → 赋值占位符 → 执行查询 → 反射映射结果集 → 关闭资源 → 返回列表。
核心细节拆解新手必懂泛型T适配所有实体类调用时指定实体类Class对象如Student.class无需强制转换ResultSetMetaData结果集的“说明书”能获取到列名、列数是反射映射的关键field.setAccessible(true)必须开启否则反射无法访问实体类的私有属性如Student的private String name空安全设计entityList初始化时new ArrayList()即使无结果、抛异常也会返回空列表调用方无需判断null。
通用单对象查询querySingle简化查询单个场景作用执行SELECT语句返回第一条结果无结果返回null适用于根据主键、唯一条件查询单条数据的场景如根据ID查询用户。
设计思路底层直接复用queryList方法避免重复编写JDBC逻辑简化调用。
调用场景示例比如根据学生ID查询单条数据无需编写复杂的JDBC逻辑一行代码搞定
通用增删改executeUpdate统一写操作作用统一处理INSERT、UPDATE、DELETE三类写操作返回受影响的行数适用于所有数据修改场景。
核心逻辑与queryList类似但无需处理结果集执行后返回受影响行数0表示执行失败/无数据变更0表示成功。
关键细节无ResultSet增删改操作无需返回结果集因此只声明Connection和PreparedStatement受影响行数返回值的意义——比如insertRows1表示成功插入1条数据updateRows0表示没有符合条件的修改数据异常处理抛异常时返回0调用方可根据返回值判断操作是否成功如if(insertRows
{ 提示成功 } else { 提示失败 }。
BaseDao实战使用示例直接复制到项目有了BaseDao后续编写具体的Dao层接口如StudentDao只需继承BaseDao无需编写任何JDBC代码直接调用父类方法即可是不是超级简洁原来需要几十行代码的Dao方法现在只需几行开发效率直接翻倍
五、
注意事项优化方向避坑指南
必须遵守的3个规则否则会报错实体类必须提供「无参构造方法」反射创建对象时需要若未提供会报InstantiationException实体类属性名必须与数据库列名「完全一致」大小写敏感如数据库列名是name实体类属性不能是usernameSQL语句中的?占位符数量必须与params参数数组的长度一致否则会报SQL异常。
优化方向进阶拓展当前BaseDao是基础实战版可根据项目需求优化以下几点提升实用性支持分页查询新增queryPage方法封装分页逻辑limit ?, ?返回分页结果总条数、当前页数据支持别名映射解决实体类属性名与数据库列名不一致的问题如实体类userName数据库列名user_name可通过注解或Map配置映射关系日志优化将printStackTrace()替换为Log4j
SLF4J等日志框架便于生产环境排查问题事务支持新增事务管理方法beginTransaction、commit、rollback适配需要事务的场景如新增订单扣减库存连接池整合将UtilsTest中的DriverManager替换为德鲁伊、HikariCP等连接池提升数据库连接效率和稳定性。
六、
总结BaseDao的
核心价值就是「复用、简化、解耦」——将JDBC的通用逻辑封装起来让开发者从繁琐的模板代码中解放出来专注于业务逻辑的实现。
本文提供的BaseDao代码是实战级可复用版本适合中小型Java项目SSM、SSH或原生JavaWeb新手可以直接复制到项目中使用进阶开发者可以在此基础上进行优化拓展。
最后提醒代码复用的前提是规范遵守实体类、SQL的命名规则才能避免反射映射失败、SQL异常等问题。
互动交流你平时开发中是怎么封装BaseDao的有没有更好的优化思路欢迎在评论区留言讨论一起提升开发效率如果这篇文章对你有帮助别忘了点赞收藏关注哦后续会分享更多Java实战技巧和代码封装教程 附完整代码获取直接复制本文中的BaseDao和UtilsTest依赖搭配实体类即可运行