使用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.mzph.cn/diannao/19766.shtml

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

相关文章

美国RAKsmart海外大带宽服务器的显著特点

美国RAKsmart海外大带宽服务器在当前的互联网服务领域中备受瞩目&#xff0c;其显著特点主要体现在以下几个方面&#xff1a; 高带宽资源&#xff1a;RAKsmart服务器拥有充足的带宽资源&#xff0c;最低提供100M独享带宽&#xff0c;并支持升级至G口、10G口大带宽方案。这种高带…

Mybatis-plus 更新或新增时设置某些字段值为空

方式一 在实体中设置某个字段为的注解中 TableField(updateStrategy FieldStrategy.IGNORED)private Date xxxxxxTime;通过这种方式会指定更新时该字段的策略&#xff0c;通常情况下updateById这种会根据字段更新&#xff0c;通常都会判断null 以及空值 指定 updateStrategy …

java属性重写

介绍 关于&#xff0c;属性没有重写只能是编译类型的 代码 package b;public class main_ {public static void main(String[] args) {//向上转型&#xff0c;父类的引用转向了子类的fathetr fatnew son();System.out.println("编译类型是father时的sum属性是"fat.…

不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?

1.点击设置 2.安全与隐私 3.通用看看允许从以下位置下载的APP是否有任何来源 4.如果没有&#xff0c;mac桌面点击&#x1f50d;输入终端或Terminal 命令行输入下述代码&#xff1a; sudo spctl --master-disable 5.回车&#xff0c;输入mac开机密码。注意&#xff1a;此时密…

java maven selenium12306 爬虫 包含浏览器驱动

前言 5月搞hw&#xff0c;一直没时间弄ctf&#xff0c;刚好java综合实践结课了&#xff0c;用java写了个12306爬虫&#xff0c;今天分享一下吧。 开发:工具idea jdk:11.0.11 maven环境请自己搭建 注意 &#xff1a;GetNetUtil类里的cookie请替换为自己的cookie(请求12306的…

滑动的登录注册页面

前言 在Web开发中&#xff0c;登录和注册页面是网站或应用程序的重要组成部分。为了提高用户体验和安全性&#xff0c;开发人员通常会采用各种方法来改进登录注册页面的设计。滑动式登录注册页面是一种常见的解决方案&#xff0c;它不仅提供了更好的用户友好性。本文将介绍如何…

前端html-docx实现html转word,并导出文件,文字+图片

前端html-docx实现html转word&#xff0c;并导出文件 前端web页面 有文字&#xff0c;有图片&#xff0c;保存web的css效果 使用工具&#xff1a;html-docx 官方网址&#xff1a;http://docs.asprain.cn/html-docx/readme.html 步骤&#xff1a; 1 npm install html-docx-js…

铁塔基站用能监控能效解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

客户文章|难能可贵,非模式生物的功能研究与创新

菜豆&#xff08;Phaseolus vulgaris&#xff09;&#xff0c;又名四季豆、芸豆、油豆角&#xff0c;是全球第一大豆类蔬菜&#xff0c;我国是世界上最主要的菜豆生产国和销售国。在田间生产过程中&#xff0c;菜豆常面临着各种生物和非生物逆境的胁迫&#xff0c;对其产量品质…

校园导航系统C++

制作一个简单的大学城导航系统&#xff0c;根据用户指定的起点和终点&#xff0c;求出最短路径长度以及具体路径。 项目要求&#xff1a; 1&#xff09;程序与数据相分离&#xff0c;地图中的所有数据都是从文件读入&#xff0c;而不是写在代码中 2&#xff09;最短路径算法…

智能家居元宇宙三维互动展示在线创作平台

卫浴行业正迎来一场全新的革命——卫浴元宇宙3D展厅搭建编辑器。它基于互联网信息技术、3D线上展示与VR虚拟现实技术&#xff0c;为您打造一个沉浸式的3D虚拟空间&#xff0c;让您的卫浴产品在线上展示中焕发出前所未有的光彩。 在这个卫浴元宇宙中&#xff0c;您可以随心所欲地…

QT C++ 基于word模板 在书签位置写入文字和图片

如果你有按模版批量自动化操作word文件的需求&#xff0c;那么本文能给你一定的帮助。 它能满足你程序自动化生成报表的需求。常常用于上位机、测试仪器的软件中。 需要你你自己做个word模版文档&#xff0c;添加2个书签。点按钮&#xff0c;会按照你的模板文档生成一个同样的…

【开源】在线考试系统 JAVA+Vue.js+SpringBoot 新手入门项目

目录 一、项目介绍 二、项目截图 三、核心代码 【开源】在线考试系统 JAVAVue.jsSpringBoot 新手入门项目 一、项目介绍 经典老框架SSM打造入门项目《在线考试系统》&#xff0c;包括班级模块、教师学生模块、试卷模块、试题模块、考试模块、考试回顾模块&#xff0c;项目编…

出吉林大学计算机考研资料适用于计专966/计学941/软专967

本人是24上岸吉大计算机专硕的考生&#xff0c;先上成绩&#xff1a; 出专业课备考过程的相关笔记资料&#xff0c;也可以提供经验分享等&#xff1a; 吉林大学计算机数据结构基础算法ADL汇总&#xff0c;适用于计专966/计学941/软专967综合整理小绿书以及期末题上重难点算法…

Linus Torvalds把控着linux内核开发审核,他去世之后linux内核会怎样?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Linus Torvalds 是 Linux…

Docker安装Zookeeper(单机)

Docker安装Zookeeper&#xff08;单机&#xff09; 目录 Docker安装Zookeeper&#xff08;单机&#xff09;拉取镜像创建目录添加配置文件启动容器测试 拉取镜像 docker pull zookeeper创建目录 mkdir -p /data/zookeeper/data # 数据挂载目录 mkdir -p /data/zookeeper/conf…

CSS学习笔记目录

CSS学习笔记之基础教程&#xff08;一&#xff09; CSS学习笔记之基础教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;一&#xff09; CSS学习笔记之中级教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;三&#xff09; CSS学习笔记之高级…

Docker 环境下 3D Guassian Splatting 的编译和配置

Title: Docker 环境下 3D Guassian Splatting 的编译和配置 文章目录 前言I. 宿主系统上的安装配置1. 安装 nvidia driver2. 安装 docker3. 安装 nvidia-container-toolkit II. Docker 容器安装配置1. 拉取 ubuntu 22.042. 创建容器3. 进入容器4. 容器中安装 cuda SDK5. 容器中…

超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)

1. 模型检验 1.1 Holdout交叉验证 1.1.1 算法 在这种交叉验证技术中&#xff0c;整个数据集被随机划分为训练集和验证集。根据经验&#xff0c;整个数据集的近 70% 用作训练集&#xff0c;其余 30% 用作验证集。 优点&#xff1a;可以快速进行区分&#xff0c;仅仅通过一次区…

从零开始:CANDelaStudio之CDD S3 Server时间异常

0 前言 关于CDD制作有疑问的小伙伴可以参考以下文章&#xff1a; 从零开始&#xff1a;CANDelaStudio之CDD制作&#xff08;一&#xff09; 从零开始&#xff1a;CANDelaStudio之CDD制作&#xff08;二&#xff09; 本文主要对日常在CDD中碰到的一些问题做一个补充。 1 …