反射机制的登录系统

一、实体层(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 block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.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 block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.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 block
				e1.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 block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.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 block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.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 block
			e.printStackTrace();
		}
	}
	
	//与数据库创立连接
	
	public DBConnection() {
		try {
			this.conn=DriverManager.getConnection(url,user,pwd);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.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 block
			e.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 block
			e.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();
		
		//查询是否存在该用户ID
		String 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();
		//不存在用户ID
		if(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 stub

		LogService 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;
		
	}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值