反射機制的登錄系統

一、實體層(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…