jdbc的工具类和三层架构模型

jdbc工具类

由于JDBC的注册驱动,连接数据库,关闭资源的步骤是相同的,所以我们可以写一个JDBC工具类。

/*
工具类:
私有化构造方法
提供静态方法*/
public class jdbcUtil {private final static String DRIVER = "com.mysql.cj.jdbc.Driver";private final static String URL = "jdbc:mysql://127.0.0.1:3306/mysql_day2";private final static String NAME = "root";private final static String PASSWORD = "123456";//注册驱动static//静态代码块,类加载的时候执行,且只执行一次{try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//与数据库连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, NAME, PASSWORD);}//释放资源public static void Close(Statement s, Connection c, ResultSet r) {if (r != null) {try {r.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (s != null) {try {s.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (c != null) {try {c.close();} catch (SQLException e) {throw new RuntimeException(e);}}}public static void Close(Statement s, Connection c){Close(s,c,null);}}

测试: 

public class testUtil {@Testpublic void testUpdate() {Connection con = null;PreparedStatement pstat = null;try {//获取连接con = jdbcUtil.getConnection();con.setAutoCommit(false);//开启事务//编写sql语句String sql = "update user set password=? where name=?";//获取数据库对象pstat = con.prepareStatement(sql);pstat.setInt(1, 23456);pstat.setString(2, "hhh");int i = pstat.executeUpdate();if (i > 0) {System.out.println("数据修改成功");con.commit();//提交}} catch (Exception e) {//有异常终止就回滚try {con.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}} finally {//不管有没有异常,都要关闭资源jdbcUtil.Close(pstat, con);}}
}

开发中常用的三层架构模型

  1. web层:接收客户端发送的数据->把接收的数据封装成对象->调用services层的方法(并传递数据对象)->根据services层方法执行结果,给客户端回馈结果
  2. service层:处理业务逻辑(会调用dao的方法)
  3. dao层:和数据库交互(底层利用jdbc技术)

在开发中三层架构通常的命名

web层 com.hhh.web

service层 com.hhh.service

dao层 com.hhh.dao

分层的目的

解耦:降低代码之间的依赖关系

可维护性:哪一层出问题,就去维护哪一层

可扩展性:哪一层需要数据,就在某一层添加数据

下面我们使用三层架构模式实现用户登录

先创建一个对象,保存用户的名字和密码

public class User {private String name;private String password;public User() {}public User(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

web层:

public class web {@Testpublic void login() {String name = "hhh";//获取客户端发来的数据String password = "23456";//封装成对象User user = new User();user.setName(name);user.setPassword(password);//调用service层的方法,把对象发送给serviceservice s=new service();boolean b = s.userLogin(user);if(b){System.out.println("有当前用户");}else {System.out.println("没有此用户");}}
}

service层

public class service {public boolean userLogin(User loginUser){//校验:传递的数据是否合法if(loginUser==null){throw new RuntimeException("传递的参数为null");}//调用dao层的方法dao d=new dao();User login = d.login(loginUser);if(login!=null){return true;}return false;}
}

Dao层

public class dao {public User login(User loginUser){User u=null;Connection con=null;PreparedStatement pstat=null;ResultSet rs=null;try{con=jdbcUtil.getConnection();  //获取连接String sql="select name,password from user where name=? and password=?";pstat = con.prepareStatement(sql);pstat.setString(1,loginUser.getName());pstat.setString(2,loginUser.getPassword());rs = pstat.executeQuery();if(rs!=null&&rs.next()){String name=rs.getString("name");String password=rs.getString("password");u=new User(name,password);}}catch (Exception e){e.printStackTrace();}finally {jdbcUtil.Close(pstat,con,rs);}return u;//如果没有数据返回的是null}
}

数据库连接池

数据库连接池是一个容器,负责分配,管理数据库连接

它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

好处:

资源重用

提升系统响应速度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式 _创建型模式_建造者模式(Builder)

一、建造者模式 1、建造者模式(Builder Pattern)是一种创建对象的设计模式。它允许你使用不同的构建策略来创建复杂对象。通常是在复杂类中通过静态内部类(Builder)来进行构建。 2、实现思路: (1&#xf…

异地组网、网络部署、无线覆盖,贝锐蒲公英一步到位

面对网络架构复杂的企业总部,分散在各地的分支机构,以及出差的远程办公人员,如何才能高效异地组网? 为了确保总部、分部网络实现远程稳定、高速互访,以及远程人员安全访问总部业务系统,基于自研SD-WAN的贝…

C++ 小游戏:战斗之旅

一、游戏名称:战斗之旅 游戏规则 角色选择:玩家可以选择不同的角色,每个角色都有不同的属性和技能。商城:玩家可以访问商城购买不同的装备,包括武器和回复物品。战斗:玩家可以与其他角色进行战斗。在战斗…

极语言在全屏游戏中,按住D同时按X键,松开X键,再松开D键的程序

程序段 模拟按键(布尔 按住D, 布尔 按住X); 定义按键常量整数 VK_D 0x44整数 VK_X 0x58; 检测D和X键是否同时按住如果(按住D 和 按住X){; 模拟松开X键按键消息(VK_X, 0, 0, "keyup"); 模拟松开D键(稍后一些执行,以确保X键先松开)…

使用Docker搭建Nacos集群

本次是在Mac的M1版本上使用Docker搭建Nacos集群的详细步骤,并记录了一些遇到的问题及解决方案。 搭建涉及:1个Nginx 3个Nacos 1个MySQL 使用版本:Nginx为1.22.0,Nacos为2.0.3,MySQL为8.0.30 一、创建虚拟网络 因为M…

数据结构(01)——链表OJ

目录 移除链表元素 思路1 不创建虚拟头节点 思路2 创建虚拟头节点 反转链表 寻找链表中间节点 判断链表是否相交 回文链表 环形链表 环形链表|| 移除链表元素 . - 力扣(LeetCode) 要想移除链表的元素,那么只需要将目标节点的前一…

XMind轮播图banner测试点

banner测试点 显示1到5张banner图片 [1,5] 6 1 一张不轮播 5 3 0可选 自动轮播,3秒切换一张 鼠标悬停,不轮播 实心为当前图 点击可以跳转 点击左,切换一张图片 点击右, 切换一张图片…

Arch Linux安装macOS

安装需要的包 sudo pacman -S qemu-full libvirt virt-manager p7zip yay -S dmg2img安装步骤 cd ~ git clone --depth 1 --recursive https://github.com/kholia/OSX-KVM.git cd OSX-KVM # 选择iOS版本 ./fetch-macOS.py #将上一步下载的BaseSystem.dmg转换格式 dmg2img -…

【Git】如何在.gitignore忽略已经被上传到git上的文件,并且同步到线上

【Git】如何在.gitignore忽略已经被上传到git上的文件,并且同步到线上 如果你想要 .gitignore 忽略已经上传到 Git 仓库的文件,但是希望在远程仓库上也排除这些文件,你需要执行以下步骤: 更新 .gitignore 文件: 首先,…

【中级软件设计师】上午题12-软件工程(3):项目活动图、软件风险、软件评审、软件项目估算

【中级软件设计师】上午题12-软件工程(3) 1 软件项目估算1.1 COCOMO估算模型1.2 COCOMOⅡ模型 2 进度管理2.1 gantt甘特图2.2 pert图2.3 项目活动图2.3.1 画项目图 3 软件配置管理4 软件风险4.1 风险管理4.2 风险识别4.3 风险预测4.4 风险评估4.5 风险控…

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者:知孤云出岫 目录 一. 关于comate产品 二. 关于comate产品体验 三. 关于实际案例. 四. 关于baidu comate编程助手的实测体验感悟 五. …

Java包装类,128陷阱

包装类 基本数据类型都有自己对应的包装类,因为Java本质是面向对象编程的,一切的内容在Java看来都是对象 但是基本数据类型没有类,也没有对象,这样就有了矛盾 所以诞生了基本类型的包装类 基本数据类型: byte,short,…

014、Python+fastapi,第一个后台管理项目走向第14步:建立python+fastapi项目,创建common通用模块

一、说明 通用模块主要是完成文件的上传下载,抄吧,要不然怎么叫通用模块呢? 我把RuoYi-Vue3-FastAPI中的验证码模块放在这里了,我觉得验证也比较通用吧, 二、添加common通用模块 1、通用模块没有数据表&#xff0c…

冯喜运:4.30现货黄金涨跌互现,最新黄金原油趋势分析

【黄金消息面分析】:上周五公布的数据,美国3月核心PCE年率维持前值不变,美国4月一年期通胀率预期上升,显示通胀顽固并有所回升,但其经济数据美国3月个人支出月率和美国4月密歇根大学消费者信心指数终值则低于预期和前值…

WEB攻防-PHP特性-metinfoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境&#xff1a;MetInfo CMS 函数缺陷导致的任意文件读取 漏洞URL&#xff1a;/include/thumb.php?dir 漏洞文件位置&#xff1a;MetInfo6.0.0\app\system\include\module\old_thumb.class.php <?phpdefined(IN_MET) or exit(No…

深度学习 --- stanford cs231学习笔记(一)

stanford cs231学习笔记(一) 1&#xff0c;先是讲到了机器学习中的kNN算法&#xff0c;然后因为kNN分类器的一些弊端&#xff0c;引入了线性分类器。 kNN算法的三大弊端&#xff1a; (1)&#xff0c;计算量大&#xff0c;当特征比较多时表示性差 (2)&#xff0c;训练时耗时少…

慢SQL问题全解析:原因诊断与性能优化策略

慢SQL的定义&#xff1a; 执行时间长的 慢SQL的筛选&#xff1a; 1.使用MySQL自带的日志 查看慢查询日志是否开启&#xff1a; SHOW VARIABLES LIKE %slow_query_log%; 开启慢查询日志&#xff1a;使用该方法开启MySQL的慢查询日志只对当前数据库生效&#xff0c;如果MySQ…

HF区块链链码基础

链码生命周期 一 . 链码准备 准备文件 . 在测试目录下创建chaincode,拷贝测试链码进 chaincode目录,拷贝 set-env.sh 脚本进 scripts 目录 二. 打包链码 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.…

Centos7使用Nginx配置HTTPS正向代理

Centos7使用Nginx配置HTTPS正向代理 Nginx默认安装只支持代理HTTP, 不支持代理 HTTPS, 如果需要支持HTTPS需要在Nginx编译时加入 ngx_http_proxy_connect_module. 文件准备 从 ngx_http_proxy_connect_module 模块仓库下载源代码压缩包, 并确定支持的 Nginx 版本 仓库地址: …

每周一算法:单源次短路

题目描述 “您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。 比荷卢经济联盟有很多公交线路。每天公共汽车都会从一座城市开往另一座城市。沿途汽车可能会在一些城市&#xff08;零或更多&#xff09;停靠。 旅行社计划旅途从 S S S 城市出发&#xff0c;到 F …