高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤(下)

简介: 高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤

2、事务及JDBCUtils最终版

回顾事务概念:将多个操作步骤归为同一个原子操作,要么同时成功,要么同时失败


开启事务


执行操作


结束事务:commit rollback


通常需要添加在Service层,Service层的所有功能方法都应该配套事务


2.1、事务基本操作与问题解决

开启事务:Connection对象.setAutoCommit(false)

结束事务:

提交:Connection对象.commit();

回滚:Connection对象.rollback();

2.1.1、存在问题

操作事务和操作数据库数据的数据库连接不是同一个,或导致事务回滚不会影响数据库内容


2.1.2、解决方案:ThreadLocal

思路: 放入线程的存储空间中,Service和DAO不再自行创建conn,如有需要,直接从线程存储空间中取出


实现:


1.确保工具类只会创建一个conn对象


2.使用ThreadLocal将工具类创建的conn对象放入存储空间


ThreadLocal:可以操作线程存储空间的工具,可以对空间的数据进行添加、获取、删除


添加:ThreadLocal对象.set(数据)


获取:ThreadLocal对象.get()


删除:ThreadLocal对象.remove()


使用:


由于DAO和Service共用同一个conn,并且Service一定晚于DAO执行结束,所以为了确保Service的执行,DAO中不能关闭conn,该操作应由Service完成

2.2、JDBCUtils-最终版

package com.bz.util;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
 * 工具类:方便方法调用,所有方法都应为静态方法
 */
public class JDBCUtils {
    //提升集合的作用范围,确保getConnection方法中也能使用
    private static Properties p=null;
    //创建操作线程存储空间的工具对象
    private static ThreadLocal<Connection> tl=new ThreadLocal<>();
    //把流对象的创建放入静态初始代码块,确保在工具类类加载时执行
    static{
        try(
                //通过类对象.getResourseAsStream()获取一个字节输入流对象
                //当前配置文件在src之下
                InputStream is=JDBCUtils.class.getResourceAsStream("/jdbc.properties");
        ){
            //创建用来接收的Properties集合
            p=new Properties();
            //调用方法加载配置文件的内容至集合中
            p.load(is);
            //1. 加载驱动
            Class.forName(p.getProperty("driverClassName"));
        }catch (ClassNotFoundException e) {
            System.out.println("驱动路径不正确");
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 获取Connection连接
     * @return
     */
    public static Connection getConnection(){
        Connection conn =tl.get();
        try {
            if (conn==null) {//这里如果线程存储空间里没有conn就创建conn并存入线程空间
                //2. 获取连接
                //连接的url
                String url = p.getProperty("url");
                //用户名
                String username = p.getProperty("username");
                //密码
                String pwd = p.getProperty("password");
                conn = DriverManager.getConnection(url, username, pwd);
                //将新创建的conn放入线程的存储空间
                tl.set(conn);
            }
        } catch (SQLException e) {
            System.out.println("获取连接失败");
        } catch (Exception e) {
            System.out.println("未知异常");
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 关闭资源连接  非空判断:防止空指针
     * @param rs
     * @param ps
     * @param conn
     */
    public static void close(ResultSet rs, PreparedStatement ps,Connection conn){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                System.out.println("关闭rs失败");
            }
        }
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                System.out.println("关闭ps失败");
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                System.out.println("关闭conn失败");
            }
        }
    }
}

3、JUnit测试框架

作用:DAO层和Service层中的方法通常需要经过测试,JUnit可以通过@Test注解完成执行测试,大大减少测试成本

3.1、使用步骤

1.导入jar包:


hamcrest-core-1.3.jar


junit-4.12.jar


2.创建测试类


命名:被测试的类/接口+Test

包:须放在test包下

3.使用


@Test注解必须写在方法上方

方法必须为公开、非静态、无参、无返回值的最普通的普通方法

一个测试方法中只能测试一个方法

通常情况下,测试方法名应与被测试方法一致,目的更为清晰

3.2、使用示例

package com.bz.test;
import com.bz.dao.AccountDao;
import com.bz.dao.impl.AccountDaoImpl;
import com.bz.entity.Account;
import org.junit.Test;
public class AccountDaoImplTest {
    //创建被测试的对象
    AccountDao ad=new AccountDaoImpl();
    @Test
    public void selectAccountByName(){
        Account a = ad.selectAccountByName("张三");
        System.out.println(a);
    }
    @Test
    public void updateAccountByName(){
        int n = ad.updateAccountByName("张三", 100);
        System.out.println(n);
    }
}

4、JDBC项目开发步骤总结

首先要根据要求来建库建表(数据库的内部操作)


1.导入jar包:


hamcrest-core-1.3.jar

junit-4.12.jar

mysql-connector-java-8.0.23.jar


2.添加工具类(JDBCUtils最终版)


3.在src下添加工具类所需的jdbc.properties


4.书写实体类


5.搭建DAO


必须测试

6.搭建Service


最好也进行测试

7.书写view(不需要过多关注,实际开发中该层对接的应该是浏览器页面)


项目结构图示:



36df1c76bf66439b88052009559f3e9a.png

高效掌握JDBC的分享到此结束,希望对大家有所帮助,如有疑问欢迎大家交流指正。


目录
相关文章
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
340 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
6月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
205 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
19天前
|
机器学习/深度学习 人工智能 并行计算
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
|
1月前
|
关系型数据库 测试技术 分布式数据库
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
|
2月前
|
JavaScript 前端开发 Java
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
Jeesite5 是一个基于 Spring Boot 3.3 和 Vue3 的企业级快速开发平台,集成了众多优秀开源项目,如 MyBatis Plus、Bootstrap、JQuery 等。它提供了模块化设计、权限管理、多数据库支持、代码生成器和国际化等功能,极大地提高了企业级项目的开发效率。Jeesite5 广泛应用于企业管理系统、电商平台、客户关系管理和知识管理等领域。通过其强大的功能和灵活性,Jeesite5 成为了企业级开发的首选框架之一。访问 [Gitee 页面](https://gitee.com/thinkgem/jeesite5) 获取更多信息。
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
|
3月前
|
监控 架构师 安全
企业架构(EA)项目开发综合指南
企业架构(EA)是一种全面的方法,用于对齐企业的业务目标与其 IT 战略和资源。EA 涵盖了企业的各个层面,包括业务流程、信息流、应用系统和技术基础设施。本指南将详细探讨 EA 项目开发的关键步骤、[EA](https://www.visual-paradigm.com/features/enterprise-architecture-diagram-tool/) 与 TOGAF、ArchiMate 以及其他建模图(如 BPMN 和 UML)之间的关系,以及推荐 Visual Paradigm 作为 EA 团队的最佳解决方案。
149 3
|
5月前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
121 6
|
5月前
|
敏捷开发 安全 测试技术
掌握单元测试:确保代码质量的关键步骤
单元测试是确保代码质量、提升可维护性和可靠性的重要手段。本文介绍了单元测试的基本概念、重要性及最佳实践,包括测试驱动开发(TDD)、保持测试独立性、使用断言库和模拟依赖等,旨在帮助开发者掌握单元测试技巧,提高开发效率。
|
6月前
|
PyTorch 算法框架/工具 计算机视觉
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
本文介绍了使用YOLOv4-Tiny进行目标检测的完整流程,包括模型介绍、代码下载、数据集处理、网络训练、预测和评估。
447 2
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
|
6月前
|
存储 消息中间件 运维
架构升级的救星!流量回放自动化测试的必备指南
大家好,我是小米,一名29岁的技术宅。今天分享一个物联网领域的实用技能——流量回放自动化测试。系统重构后,测试工作量巨大,本文介绍如何通过日志收集和数据回放进行自动化测试,包括离线、实时和并行回放模式,帮助快速定位Bug,提升测试效率和系统稳定性。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
158 3

热门文章

最新文章

下一篇
oss创建bucket