使用servlet与jdbc进行的小demo

文章目录

  • demo实例
  • 首先三层架构
    • servlet层 也可以叫web层
    • service层 ,用于处理业务逻辑
  • dao层 用于写sql语句,与数据库进行交互
    • 这三层一次调用
  • 进行环境初始化
  • utils的书写
  • jdbcUtils
  • 先写web层,需要进行参数校验
  • service书写
  • dao层使用jdbc进行操作就可以


demo实例

在这里插入图片描述
使用三层架构进行查询,当查询到数据后,那么就进行重定向掉main.jsp
如果没有查询到数据就重定向到login.jsp

首先三层架构

servlet层 也可以叫web层

主要用于接收请求与响应数据

service层 ,用于处理业务逻辑

在service层写业务逻辑,这里我们只是进行了查询逻辑

dao层 用于写sql语句,与数据库进行交互

这里只写了登录逻辑,所以只是查询逻辑

这三层一次调用

web -> service -> dao

进行环境初始化

首先要先写配置文件

jdbc.properties

#mysql8驱动
driverClass=com.mysql.cj.jdbc.Driver
#用户名
username=root
#数据库密码
password=123456
#数据库url
url=jdbc:mysql://8.130.111.157:3306/by_demo?characterEncoding=UTF-8

配置好数据库配置后,那么就可以进行jdbcutil的书写

utils的书写

使用jdbcutil 需要配置config需要进行加载properties文件

package com.by.utils;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class Config {private static String username;private static String password;private static String url;private static String driverClass;static {Properties prop = new Properties();try {InputStream in = Config.class.getClassLoader().getResourceAsStream("jdbc.properties");//读取配置文件// InputStream in = new FileInputStream("D:\\Java黑马课程\\北游\\后端\\JavaWeb阶段\\源码\\javaweb\\servlet_pro\\src\\main\\resources\\jdbc.properties");//加载配置文件内容prop.load(in);// acquire the properties from fileusername = prop.getProperty("username");password = prop.getProperty("password");url = prop.getProperty("url");driverClass = prop.getProperty("driverClass");// register the driverif (driverClass != null && url != null && username != null && password != null) {//加载驱动Class.forName(driverClass);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}/*** @param* @description: 获取连接* @return: java.sql.Connection*/public static Connection getConnection() throws SQLException {Connection con = null;try {con = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return con;}/*** @param con* @param stat* @param res* @description: 释放资源*/public static void close(Connection con, Statement stat, ResultSet res) throws SQLException {if (con != null) {con.close();}if (stat != null) {stat.close();}if (res != null) {res.close();}}
}

这是jdbc的config配置类

可以直接使用

InputStream in = Config.class.getClassLoader().getResourceAsStream("jdbc.properties");

讲一下这个代码
这个是先使用放射获得了 Config的class字节码
因为编译后的properties文件是存在在classses的根目录中

在这里插入图片描述
使用了之后就可以使用getClassLoader() 获得类加载器,然后再获取getResourceAsStream(),输入properties文件后,就可以直接获取到inputStream流
然后就可以获取in文件

jdbcUtils

config书写后就可以书写jdbcUtils

package com.by.utils;import java.sql.*;/*** @Description: jdbc封装工具类* @Version: 1.0*/
public class JdbcUtils {private static Connection con = null;private static Statement st = null;private static ResultSet rs = null;private static PreparedStatement ps = null;/*** @param sql    sql语句* @param params 传入多参,也可以以数组形式传入* @description: 通用更新封装* @return: java.sql.ResultSet*/public static int update(String sql, Object... params) throws SQLException {int flag = 0;try {con = Config.getConnection();ps = con.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}flag = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {Config.close(con, ps, null);}return flag;}/*** @param sql* @param params* @description: 通用查询* @return: java.sql.ResultSet*/public static ResultSet query(String sql, Object... params) throws SQLException {try {con = Config.getConnection();ps = con.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}System.out.println(ps.toString());rs = ps.executeQuery();} catch (Exception e) {e.printStackTrace();}return rs;}
}

那么就可以直接使用jdbc进行操作了

先写web层,需要进行参数校验

web层调用service
service直接引入就可以了

package com.by.servlet;import com.by.pojo.User;
import com.by.service.UserService;
import com.by.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author healer* @Description LoginServlet* @data 2024-05-31 17:00*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {UserService userService = new UserServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {req.setCharacterEncoding("UTF-8");String username = req.getParameter("username");String password = req.getParameter("password");User user = userService.login(username, password);if (user != null) {
//登陆成功进行跳转resp.sendRedirect("admin.jsp");} else {resp.sendRedirect("login.jsp");}} catch (Exception e) {e.printStackTrace();}}
}

service书写

service直接调用dao层就可以

package com.by.service.impl;import com.by.dao.UserDao;
import com.by.dao.impl.UserDaoImpl;
import com.by.pojo.User;
import com.by.service.UserService;import java.util.function.UnaryOperator;/*** @author healer* @Description UserServiceImpl* @data 2024-05-31 17:01*/
public class UserServiceImpl implements UserService {UserDao userDao = new UserDaoImpl();@Overridepublic User login(String username, String password) throws Exception {return userDao.login(username, password);}
}

dao层使用jdbc进行操作就可以

package com.by.dao.impl;import com.by.dao.UserDao;
import com.by.pojo.User;
import com.by.utils.JdbcUtils;
import com.mysql.cj.jdbc.JdbcConnection;import java.sql.ResultSet;/*** @author healer* @Description UserDaoImpl* @data 2024-05-31 17:03*/
public class UserDaoImpl implements UserDao {@Overridepublic User login(String username, String password) throws Exception {String loginSql = "select * from user  where username =? and password =?";ResultSet query = JdbcUtils.query(loginSql, username, password);if (query.next()) {Long id = Long.valueOf(query.getInt("id"));String username1 = query.getString("username");String password1 = query.getString("password");User user = new User(id, username1, password1);return user;}return null;}
}

操作后如果有数据就进行封装到User对象中,
如果查询到了就封装到User ,查询不到就直接返回为空

那么在web层进行判断如果有数据,那么就直接进行重定向到main.jsp
如果没有数据,那么就还是重定向到login.jsp

至此小案例完成了

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

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

相关文章

计算机毕业设计hadoop+spark知识图谱课程推荐系统 课程预测系统 课程大数据 课程数据分析 课程大屏 mooc慕课推荐系统 大数据毕业设计

本科毕业设计&#xff08;论文&#xff09; 题目&#xff1a;基于 Hadoop和Spark的课程推荐系统的设计与实现 烟台南山学院教务处 二〇二四年六月 院 系&#xff1a;科技与数据学院数据科学与软件工程系 专 业&#xff1a;数据科学与大数据技术 班 级&#xff1a;数…

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法&#xff08;Greedy&#xff09;是一种在每一步都采取当前状态下最好的或者最优的选择&#xff0c;从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…

【spring】Spring Boot3.3.0发布啦

spring最新版本 springboot官网&#xff1a;Spring Boot :: Spring Boot Spring Boot 3.3 发行说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.3-Release-Notes 开发环境的要求对比表 Spring BootJDKSpringMavenGradle3.3.017 ~ 226.1…

WalleWeb简化你的DevOps部署流程

walle-web&#xff1a;简化部署流程&#xff0c;提升开发效率&#xff0c;Walle Web让DevOps触手可及 - 精选真开源&#xff0c;释放新价值。 概览 Walle Web是一个功能强大且免费开源的DevOps平台&#xff0c;旨在简化和自动化代码部署流程。它支持多种编程语言&#xff0c;包…

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码&#x1f4c0; 文章目录 Qt-qrencode开发-生成二维码&#x1f4c0;[toc]1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、编译qrencode&#x1f50d;4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…

004 仿muduo实现高性能服务器组件_Buffer模块与Socket模块的实现

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言Buffer模块Socket模块 小结 前言 这章将会向你介绍仿muduo高性能服务器组件的buffer模块与socket模块的实…

每日一题——Python实现PAT甲级1041 Be Unique(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 方法1&#x…

写大型C工程makefile构建~

正文 最开始学习linux应用开发编写的时候&#xff0c;估计大部分伙伴们都是在一个目录里面编译整个工程&#xff0c;主要是linux通常没有非常合适的集成开发环境。 以前单目录的方式实在太过捡漏&#xff0c;在linux环境中进行C代码工程开发很多时候需要编写一个相对比较通用的…

业务实战————Uibot6.0 .1多页面商品信息抓取RPA机器人

前言 【案例描述】 鲜果记水果店计划在淘宝电商平台上开设一家新店&#xff0c;小微是该企业运营部分的运营专员&#xff0c;主要负责公司商品上架和管理的工作。 公司计划在开店的新品促销活动中增加水果品类红富士苹果。小微需在商品上架前了解目前平台中销量前列的红富士苹…

预编码算法(个人总结)

引言 预编码算法是现代无线通信系统中的关键技术&#xff0c;特别是在多输入多输出&#xff08;MIMO&#xff09;系统中。它们通过在发送端对信号进行处理&#xff0c;减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中&#xff0c;遇到数据库 crash 的缺陷&#xff0c;原因如下&#xff1a;在数据库启动时候生成的一组临时文件中&#xff0c;有 owner 为 root 的文件&#xff0c; 文件权限默认为 640&#xff0c; 当数据库需要使用的时…

基于VGG16使用图像特征进行迁移学习的时装推荐系统

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件&#xff0c;它允许用户在多台计算机之间共享同一组键盘和鼠标&#xff0c;实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统&#xff0c;并且支持多种连接方式&#xff0c;包括局域网连接和无线连接。 使用 ShareMouse&…

Blueprints - Collision Presets相关

一些以前的学习笔记归档&#xff1b; 在Static Mesh或SkeletalMesh等的属性中&#xff0c;都有Collision Presets&#xff1a; 其中Oject Type只是一个枚举参数&#xff0c;代表设置该Actor为什么类型&#xff0c;Collision Responses代表该Actor对各种类型的Actor有什么反应&a…

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后&#xff0c; 运行会报错&#xff0c;见下图。 原因分析 查了下…

解决docker容器: bash: ping: command not found, 并制作镜像

一. 出现原因 从 dockerhub 拉下来的镜像都是最轻量级的, 不会安装各种工具, 所以使用 ping, vim 等命令, 会出现 command not found 二. 解决方式 2.1 安装工具包 进入到一个正在运行的容器内部, 执行命令: apt-get update 之后会发现, 容器正在更新软件包, 不过最终会由…

apache大数据各组件部署搭建(超级详细)

apache大数据数仓各组件部署搭建 第一章 环境准备 1. 机器规划 准备3台服务器用于集群部署,系统建议CentOS7+,2核8G内存 172.19.195.228 hadoop101 172.19.195.229 hadoop102 172.19.195.230 hadoop103 [root@hadoop101 ~]# cat /etc/redhat-release CentOS Linux rele…

aws emr启动standalone的flink集群

关键组件 Client&#xff0c;代码由客户端获取并做转换&#xff0c;之后提交给JobMangerJobManager&#xff0c;对作业进行中央调度管理&#xff0c;获取到要执行的作业后&#xff0c;会进一步处理转换&#xff0c;然后分发任务给众多的TaskManager。TaskManager&#xff0c;数…

【设计模式】创建型-建造者模式

前言 在面向对象的软件开发中&#xff0c;构建复杂对象时经常会遇到许多挑战。一种常见的解决方案是使用设计模式&#xff0c;其中建造者模式是一个强大而灵活的选择。本文将深入探讨建造者模式的原理、结构、优点以及如何在实际项目中应用它。 一、复杂的对象 public class…

vue3学习使用笔记

1.学习参考资料 vue3菜鸟教程&#xff1a;https://www.runoob.com/vue3/vue3-tutorial.html 官方网站&#xff1a;https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程&#xff1a;https://www.runoob.com/w3cnote/webpack-tutor…