一、实体层(po层)

//UserInfo
package com.hugeyurt.po;import java.sql.ResultSet;
import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;public UserInfo() {}public String getUserID() {return userID;}public void setUserID(String userID) {this.userID = userID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public Long getErrorTime() {return errorTime;}public void setErrorTime(Long errorTime) {this.errorTime = errorTime;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}

二、database持久层

//ORMUtil
//持久层中的关系映射
package com.hugeyurt.database;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;public class ORMUtil {private ORMUtil() {}
//clz映射对象属性//填写sql语句//将对象属性值填入params//从客户端存入服务端public static Object[] toInsert(StringBuffer sql, Object obj) {// 获取对象字节码Class clz = obj.getClass();// 生成sql语句String tableName = clz.getSimpleName();sql.append("insert into ").append(tableName).append(" (");// 获取用户输入的属性名Field[] fields = clz.getDeclaredFields();// 创建object数组存放用户插入的信息Object[] params = new Object[fields.length];int k = 0;for (int i = 0; i < fields.length; i++) {Object value = null;// 如果用户插入信息中没有该属性的值就略过String fieldName = fields[i].getName();try {fields[i].setAccessible(true);value = fields[i].get(obj);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (value == null)continue;sql.append(fieldName).append(",");// 并存储新增记录的值params[k] = value;k++;}// 找到末尾的逗号int index = sql.lastIndexOf(",");sql.replace(index, index + 1, ")");sql.append("values(");for (int i = 0; i < k; i++)sql.append("?,");index = sql.lastIndexOf(",");sql.replace(index, index + 1, ")");if (k == fields.length)return params;Object[] temp = new Object[k];for (int i = 0; i < k; i++) {temp[i] = params[i];}return temp;}//从服务端访问结果集//将结果集返回给客户端//clz获取客户端po类的属性//通过映射的方法或属性将结果集里的东西存入对象并返回public static Object toObject2(ResultSet rs, Class clz) {Object obj = new Object();try {obj = clz.newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 获取属性Field[] fields = clz.getDeclaredFields();
//		System.out.println(fields.length);for (int i = 0; i < fields.length; i++) {Object value = null;String columnLabel = fields[i].getName();try {value = rs.getObject(columnLabel);} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if (value == null)continue;// 存储时按属性存储Field f = fields[i];try {f.setAccessible(true);if (f.getType() == Integer.TYPE || f.getType() == Integer.class)f.set(obj, Integer.parseInt(value.toString()));else if (f.getType() == Byte.TYPE || f.getType() == Byte.class)f.set(obj, Byte.parseByte(value.toString()));else if (f.getType() == Long.TYPE || f.getType() == Long.class)f.set(obj, Long.parseLong(value.toString()));else if (f.getType() == Double.TYPE || f.getType() == Double.class)f.set(obj, Double.parseDouble(value.toString()));else if (f.getType() == Float.TYPE || f.getType() == Float.class)f.set(obj, Float.parseFloat(value.toString()));else if (f.getType() == Boolean.TYPE || f.getType() == Boolean.class)f.set(obj, Boolean.parseBoolean(value.toString()));else if (f.getType() == Short.TYPE || f.getType() == Short.class)f.set(obj, Short.parseShort(value.toString()));//剩下的else f.set(obj, value);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return obj;}
public static String getMethod(String columnLabel) {char[] str = columnLabel.toCharArray();if (str[0] > 'a' && str[0] < 'z')str[0] = (char) (str[0] - 32);return "set" + new String(str);}public static Object[] toQuery(Object obj, StringBuffer sql) {// 获取字节码Class clz = obj.getClass();// 获取各个属性Field[] fields = clz.getDeclaredFields();// 获取字段名String columnName = fields[0].getName();// 获取字段名下的值Object value = null;try {fields[0].setAccessible(true);value = fields[0].get(columnName);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}sql.append("select userID from userinfo where userID=?");if (value == null)return null;Object[] params = new Object[] { value };return params;}}
//DBConnection
//持久层中的数据访问层
package com.hugeyurt.database;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;public class DBConnection {String url="jdbc:mysql://127.0.0.1:3306/db20250715?characterEncoding=UTF-8";String user="root";String pwd="";Connection conn=null;//加载驱动static {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//与数据库创立连接public DBConnection() {try {this.conn=DriverManager.getConnection(url,user,pwd);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//更新操作public int executeUpdate(String sql,Object[] params) {//创建SQL执行器PreparedStatement ps=null;try {ps=this.conn.prepareStatement(sql);//预编译if(params!=null)for(int i=0;i<params.length;i++)ps.setObject(i+1, params[i]);//预编译完成后,执行更新工作return ps.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {if(ps!=null)ps.close();}catch(SQLException e) {e.printStackTrace();}}return 0;}public ArrayList<Object> executeQuery(Class clz,String sql,Object[] params){PreparedStatement ps=null;ResultSet rs=null;ArrayList<Object> list=new ArrayList<Object>();try {ps=this.conn.prepareStatement(sql);if(params!=null)for(int i=0;i<params.length;i++)ps.setObject(i+1, params[i]);rs=ps.executeQuery();while(rs.next()) {Object obj=ORMUtil.toObject2(rs, clz);list.add(obj);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {if(rs!=null)rs.close();if(ps!=null)ps.close();}catch(SQLException e) {e.printStackTrace();}}return list;}public boolean save(Object obj) {StringBuffer sql=new StringBuffer();Object[] params=ORMUtil.toInsert(sql, obj);return executeUpdate(sql.toString(), params)>0;}}

三、服务层

//LogService
//封装业务逻辑
package com.hugeyurt.service;import java.util.ArrayList;import com.hugeyurt.database.DBConnection;
import com.hugeyurt.po.UserInfo;
import com.hugeyurt.vo.ResultVO;public class LogService {private DBConnection conn=new DBConnection();private static final int MAX_COUNT=3;public ResultVO login(String userID,String pwd) {UserInfo user=new UserInfo();//查询是否存在该用户IDString sql="select * from userinfo where userID=?";Object[] params=new Object[] {userID};Class clz=user.getClass();//创建存储用户信息的list,用于后续判断,还有存储和更新ArrayList<Object> list=new ArrayList<Object>();list=conn.executeQuery(clz, sql, params);System.out.println();//创建反馈对象ResultVO vo=new ResultVO();//不存在用户IDif(list.size()==0) {vo.setCode(100);vo.setMessage("no such userID");return vo;}user=(UserInfo)list.get(0);//限制已过Long currentTime=System.currentTimeMillis();if((currentTime-user.getErrorTime())>30*1000) {//更新信息this.update(userID, currentTime, 0);}//期限没有过,并且还错了三次if(user.getCount()==3) {vo.setCode(200);vo.setMessage("you have to wait "+(30-(currentTime-user.getErrorTime())/1000)+" hours");return vo;}//密码正确if(pwd.equals(user.getPwd()) ){vo.setCode(300);vo.setMessage("success!");vo.setUser(user);this.update(userID, 0L, 0);return vo;}//密码不正确user.setCount(user.getCount()+1);if(user.getCount()==3) {vo.setCode(400);vo.setMessage("you have been locked for 24 hours!");this.update(userID, currentTime, user.getCount());return vo;}vo.setCode(500);vo.setMessage("password is error!");this.update(userID, currentTime, user.getCount());return vo;}public void update(String userID,Long currentTime,Integer count) {String sql="update userinfo set errorTime=?,count=? where userID=?";Object[] params=new Object[] {currentTime,count,userID};conn.executeUpdate(sql, params);}}

四、数据传输对象

//ResultVO
//封装响应对象
package com.hugeyurt.vo;import com.hugeyurt.po.UserInfo;public class ResultVO {private Integer code;private String message;private UserInfo user;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public UserInfo getUser() {return user;}public void setUser(UserInfo user) {this.user = user;}}

五、表示层

//view
//接收请求和发送响应
package com.hugeyurt.view;import java.util.Scanner;import com.hugeyurt.service.LogService;
import com.hugeyurt.vo.ResultVO;
//对登录系统的后端练习
//纯粹的PO类
//数据库public class View {public static void menu() {System.out.println("1.login");System.out.println("0.exit");}public static void main(String[] args) {// TODO Auto-generated method stubLogService log=new LogService();ResultVO vo=new ResultVO();while(true) {menu();Scanner sc=new Scanner(System.in);int op=sc.nextInt();if(op==1) {System.out.println("input your userID:");String userID=sc.next();System.out.println("input your password:");String pwd=sc.next();vo=log.login(userID, pwd);if(vo.getCode()==300) {System.out.println("welcome!");System.out.println("userID:"+vo.getUser().getUserID()+"  name:"+vo.getUser().getName());}else {System.out.println(vo.getMessage());}}else if(op==0)break;}}
}

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

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

相关文章

装饰器模式及优化

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰器类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前提下&#xff…

共指消解技术全解析:从语言学规则到深度学习(附论文精读)

精读威斯康星大学综述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"实体链接"的核心技术一、什么是共指消解&#xff1f;为什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在识别文本中指向同一实体的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid为11,22“

文章目录前言一、报错提示二、实现1.commitlint.config.js规范配置2. **修改正则表达式**&#xff1a;3. **移除 scope-case 规则**&#xff1a;4. **增强自定义规则逻辑**&#xff1a;测试结果&#xff1a;正则表达式详解&#xff1a;前言 提示&#xff1a;正常的配置git规范…

nastools继任者?极空间部署影视自动化订阅系统『MediaMaster』

nastools继任者&#xff1f;极空间部署影视自动化订阅系统『MediaMaster』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS玩家来说&#xff0c;观影总是大家绕不开的一个执念&#xff0c;并且为观影的折腾大家也都是乐此不疲~ 曾经有一个非常绝绝子的观影神器摆在我们…

题解:CF1690G Count the Trains

思路&#xff1a; 首先我们可以理清一下各种情况&#xff1a;1&#xff09;m可能为02&#xff09;一次操作时&#xff0c;只需要考虑每节火车的车头。3&#xff09;当一节火车的速度降低时&#xff0c;只会影响它及它后面的车厢当m0时&#xff0c;我们可以记录上一节车头的速度…

CCF编程能力等级认证GESP—C++3级—20250628

CCF编程能力等级认证GESP—C3级—20250628单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)奇偶校验分糖果单选题&#xff08;每题 2 分&#xff0c;共 30 分…

2G和3G网络关闭/退网状态(截止2025年7月)

从能打语音电话的2G&#xff0c;到能发彩信、聊QQ的3G&#xff0c;这两项陪伴了我们数十年的通信技术&#xff0c;正在悄然退出历史舞台。近日&#xff0c;全球移动供应商协会&#xff08;GSA&#xff09;发布的《2025年7月2G和3G网络关闭报告》显示&#xff0c;全球已有超百个…

Day06_C语言网络编程20250718mobus重点

01.思维导图1 什么是 modbus他是一个在工控领域非常好用的通信写 modbus协议本质上是一个 基于 tcp 协议二次封装的一个协议 什么叫做基于tcp二次封装的协议&#xff1a;我们自己写的pack_t(无论静态还是动态)&#xff0c;都是属于二次封装的协议modbus协议是一种 “主从问答式…

比亚迪古德伍德亮相:从技术突破到文化对话

近日&#xff0c;比亚迪携腾势Z9GT、方程豹豹5、腾势D9亮相英国古德伍德速度节——全球最具声望的汽车文化盛典。方程豹豹5搭载全球首个 DMO电驱越野平台&#xff0c;在爬山赛道上展现出媲美性能跑车的动力响应与精准控制&#xff0c;彻底打破“越野必靠大排量燃油机”的西方传…

UniApp TabBar 用户头像方案:绕过原生限制的实践

需求场景&#xff1a; 在 UniApp 项目中&#xff0c;需要将 TabBar 首页项 (index) 的图标替换为当前用户的网络图片&#xff0c;并实现&#xff1a; 放大且圆形显示。点击该图标时&#xff0c;页面滚动回顶部。切换到其他分类时&#xff0c;首页 Tab 项恢复为普通首页图标。 尝…

如何阅读Spring源码

如何阅读Spring源码 简介 最近有许多人问我如何阅读Spring源码&#xff0c;那我便在这给出阅读源码的方法&#xff0c;能够保证本地能够让源码能够运行起来。 Spring 源码环境本地编译 Gradle下载地址 通过网盘分享的文件&#xff1a;gradle-6.4.1-all.zip 链接: https://pan.b…

Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南

文章目录Excel导出实战&#xff1a;从入门到精通 - 构建专业级数据报表的完整指南引言&#xff1a;ExcelJSFileSaver如何映射到Excel操作一、ExcelJS核心架构解析 - 从文件结构理解1. 工作簿(Workbook)模型 - 相当于整个Excel文件2. 工作表(Worksheet)配置 - 相当于单个工作表设…

PyTorch图像预处理全解析(transforms)

1. 引言在深度学习计算机视觉任务中&#xff0c;数据预处理和数据增强是模型训练的关键步骤&#xff0c;直接影响模型的泛化能力和最终性能表现。PyTorch 提供的 torchvision.transforms 模块&#xff0c;封装了丰富的图像变换方法&#xff0c;能够高效地完成图像标准化、裁剪、…

slam中的eskf观测矩阵推导

在之前的《slam中的eskf推导》一文中&#xff0c;没有写观测矩阵 H 矩阵的过程&#xff0c;现在补上这部分。前置列举几个等下推导需要用到的一些点&#xff1a;平面特征点构造观测矩阵例如在 fastlio 中&#xff0c;是利用平面特征点到拟合平面的距离来构造观测方程&#xff0…

Python_2

逻辑判断 首先得首先&#xff0c;我们想判断一个逻辑的正确与否&#xff0c;一定是需要一个能够表现出逻辑的词 如果我只说一个1 2&#xff0c;那么大家都不知道我在说什么但是如果我说1<2,那么大家就能判断这个语句的正确与否了 下面是几个常用的逻辑词 < 小于>大于&…

Liunx-Lvs配置项目练习

1.实验环境配置Lvs调度器有两块网卡 一块仅主机和一块nat网卡&#xff0c;客户端nat模式&#xff0c;两台服务器为仅主机模式2.集群和分布式简介集群与分布式系统简介集群 (Cluster)集群是指将多台计算机(通常为同构的)通过高速网络连接起来&#xff0c;作为一个整体对外提供服…

T5(Text-to-Text Transfer Transformer) 模型

下面是对 T5&#xff08;Text-to-Text Transfer Transformer&#xff09; 模型的详细介绍&#xff0c;包括其原理、架构、训练方式、优势与局限&#xff0c;以及与其他模型&#xff08;如 BERT、GPT&#xff09;的对比。一、T5 是什么&#xff1f;T5&#xff08;Text-to-Text T…

PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑

PostgreSQL从入门到精通系列课程&#xff0c;近100节PG技术讲解&#xff0c;让你从小白一步步成长为独当一面的PG专业人员&#xff0c;点击这里查看章节内容。 PostgreSQL从入门到精通课程&#xff0c;持续更新&#xff0c;欢迎加入。第97讲&#xff1a;PostgreSQL 数据库编码…

【IEEE独立出版 】第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)

第六届机器学习与计算机应用国际学术会议&#xff08;ICMLCA 2025&#xff09; 大会简介 第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)定于2025年10月17-19日在中国深圳隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向&#xff0c;着力…

对于编码电机-520直流减速电机

编码电机的介绍 编码器是一种将角位移或者直线位移转换成一连串电数字脉冲的一种传感器。我们可以通过编码器测量电机转动的位移或者速度信息。 编码器按照工作原理&#xff0c;可以分为增量式编码器和绝对式编码器&#xff0c;绝对式编码器的每一个位置对应一个确定的数字码&a…