反面教材
程序员文章站
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状态等。如下图:
/** * 说明 : 账户账号密码登陆验证 * @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。
上一篇: js 变量的定义及其有效范围
下一篇: 到多大年龄,不适合找工作