当前位置: 首页 > news >正文

反射机制的登录系统

一、实体层(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.lryc.cn/news/592655.html

相关文章:

  • MyUI会员排名VcMember组件文档
  • Java并发编程痛点解析:从底层原理到实战解决方案
  • Axure RP 10 预览显示“无标题文档”的空白问题探索【护航版】
  • 【密码学】1. 引言
  • vue3引入cesium完整步骤
  • 深入Java注解:从内置到元注解与自定义实战指南
  • STM32-CAN
  • 开发避坑短篇(2):uni-app微信小程序开发‘createIndependentPlugin‘模块缺失问题分析与解决方案
  • 初探:C语言FILE结构之文件描述符与缓冲区的实现原理
  • iOS OC 图片压缩
  • CityEngine自动化建模
  • Java面试宝典:Maven
  • 片上网络(NoC)拓扑结构比较
  • 现代R语言机器学习:Tidymodel/Tidyverse语法+回归/树模型/集成学习/SVM/深度学习/降维/聚类分类与科研绘图可视化
  • PHP:经典与现代交融的Web开发利器
  • 生成式引擎优化(GEO)核心解析:下一代搜索技术的演进与落地策略
  • 超简单linux上部署Apache
  • UDP协议介绍
  • 深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析
  • IDEA 2020.1版本起下载JDK
  • 基于 Docker 及 Kubernetes 部署 vLLM:开启机器学习模型服务的新篇章
  • Docker --privileged 命令详解
  • Jenkins+Docker+Git实现自动化CI/CD
  • [2025CVPR-目标检测方向]FSHNet:一种用于3D物体检测的全稀疏混合网络。
  • vue2 面试题及详细答案150道(41 - 60)
  • Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南
  • 武汉江滩某码头变形及应力自动化监测
  • 由于热爱,我选PGCE专家学习
  • 小红书采集工具:无水印图片一键获取,同步采集笔记与评论
  • 接口测试时如何上传文件(图片、安装包等)