欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反面教材

程序员文章站 2022-06-11 10:21:22
...
/**
	 * 说明     :  获取最近登陆账户信息
	 * @param  :   1. List ls, 
	 * 			   
	 * @return :   Accountinfo
	 */
    @TransactionAttribute(TransactionAttributeType.MANDATORY)
	public Accountinfo getRecentAccount(List<String> ls)
	{
		...
    	      Accountinfo accountinfo = (Accountinfo)query.getSingleResult();
	      return accountinfo;
	}
 

 

评点: 不够简洁且高并发情况下,还可能会发生“张冠李戴”的情况。
  可优化为:
return (Accountinfo)query.getSingleResult();
 
public  List<AccountDTO>  queryAccounts(String accountNo,
			String chanelCode, String registTimeStart,String registTimeEnd, String status,  List<String> lsAccountInfoId,
			String merchantName,String radiocode,int startRow,int endRow){

......
}
 评点: 参数过多,可用AccountDTO来代替。可能需要在该DTO增加几个属性来对应页面表单参数,如起始时间,结束时间及多选checkbox状态等。如下图:
反面教材
            
    
    博客分类: java 代码实践


/**
	 * 说明     :  账户账号密码登陆验证
	 * @param  :   1. Long accountInfoId, 
	 * 			   2. int status 
	 * @return :   long  
	 */
	@TransactionAttribute(TransactionAttributeType.MANDATORY)
	public long loginValidate(String accountNo, String loginPwd,String chanel)
	{
		long returnValue=1; //失败
		
	//查询该帐户编号是否存在	
        String sql = "select count(*) from useraccnum u,accountinfo t where t.ACCOUNTSTATE!=4 and u.accountinfoid = t.accountinfoid  and u.useraccount=? and u.channelinfoid=?"; 
    	Query query = em.createNativeQuery(sql);
    	query.setParameter(1, accountNo);
    	query.setParameter(2, chanel);
    	
    	BigDecimal b = (BigDecimal)query.getSingleResult();
    	
    	//----如果验证成功则取得账户编号
    	if(null!=b&&1==b.intValue())
    	{
    		//取得账户ID
                sql = "select u.accountinfoid from useraccnum u where u.useraccount=?  and u.channelinfoid=?";
    		query = em.createNativeQuery(sql);
        	query.setParameter(1, accountNo);
        	query.setParameter(2, chanel);
    		b = (BigDecimal)query.getSingleResult();
    		returnValue = b.longValue(); //账户流水
    		
    		//验证密码
    		sql = "select loginpwd from useraccnum u,accountinfo t where t.ACCOUNTSTATE!=4 and u.accountinfoid = t.accountinfoid  and u.useraccount=? and u.channelinfoid=?";
        	Query querymm = em.createNativeQuery(sql);
        	querymm.setParameter(1, accountNo);
        	querymm.setParameter(2, chanel);
        	String dPwd = (String)querymm.getSingleResult();
        	//验证不通过
        	//if(!PasswordUtil.validate(dPwd, loginPwd))
        	if(!dPwd.equals(loginPwd))
        	{
        		return -returnValue;
        	}
        	
    		//-----更新登陆时间
    		sql = "update useraccnum t set t.recentlandtime=sysdate where  t.useraccount=?  and t.channelinfoid=?" ;
    		query = em.createNativeQuery(sql);
        	query.setParameter(1, accountNo);
        	query.setParameter(2, chanel);
    		query.executeUpdate();
    	}
    	
    	return returnValue;
	
	}
 
评点:该方法用于账户登录时的校验。功能过于复杂、凌乱。先是查询记录数,若为1,则再查询主键ID,接着查询其密码(以上三步可查询一次便可解决),校验密码是否匹配,更新登录时间。且返回值也让人眼花缭乱,账户不存在返回1,账户存在密码错误则为主键ID的负值,若校验通过则为主键ID。
优化:功能单一化,仅校验登录信息。登录日志(登陆成功、登录失败)另外处理。返回值为boolean,即告知校验通过还是未通过。

 
/**
	 * 1. 根据账户ID进行账户锁定
	 * 
	 * @param 1.
	 *            账户ID Long accountInfoId 2. 锁定方式 int lockType 0:自动锁定;1:手工锁定;
	 * @return OutObj4Account
	 * @exception
	 */
	public OutObj4Account lockAccount(Long accountInfoId, int lockType) {
		OutObj4Account outObj4Account = new OutObj4Account();
		try {
			ut.begin();
			if (null != accountInfoId) {
				if (0 == lockType) {
					accountDAO.updateStatusById(accountInfoId, 0);
				}
				if (1 == lockType) {
					accountDAO.updateStatusById(accountInfoId, 1);

				}
				outObj4Account.setIsSuccess("0");
				outObj4Account.setMsg("操作成功");
			......
	}
 
评点: 多此一举。
优化:
accountDAO.updateStatusById(accountInfoId, lockType)
 
/**
	 * 1. 根据账户ID进行账户解锁
	 * 
	 * @param 1.
	 *            账户ID Long accountInfoId 2. 解锁方式 int unLockType 0:自动解锁;1:手工解锁;
	 * @return OutObj4Account
	 * @exception
	 */
	public OutObj4Account unlockAccount(Long accountInfoId, int unLockType


) {

		OutObj4Account outObj4Account = new OutObj4Account();

		// -------------------------------------------------------
		try {
			ut.begin();
			if (null != accountInfoId) {
				accountDAO.updateStatusById(accountInfoId, 3);
				outObj4Account.setIsSuccess("0");
				outObj4Account.setMsg("账户解锁操作成功");
			} else {
				......
			}
			......
	}
 
评点: unLockType参数多余。且校验accountInfoId亦属画蛇添足。很明显在该操作前你已明确知道该主键ID。


  • 反面教材
            
    
    博客分类: java 代码实践
  • 大小: 7.1 KB