问题一:Cannot resolve method 'query(java.sql.Connection, java.lang.String,无法解析方法的查询
解决方法:
1.清空缓存
左上角点击“File”---->“Invalidate Caches / Restart”
试了一下,结果不如人意
于是改用其他方法:
.添加tomcat
左上角点击“File”----->Project Structure
新出现对话框点击“Modules”---->“+”---->“Library 或 Module Dependency..”
已经在里面了,啧!难搞
备用方法
若解决不了,尝试返回方法1:“File”---->“Invalidate Caches / Restart”---->弹出对话框,点击“Invalidate and Restart”。
结果都于事无补,于是检查了上下,发现问题不在系统配置上,而是方法数据类型前后不匹配,之前想将符合注册条件的人数以int类型输出,但是后来想实现输出String类型的结果,前后没一致导致结果无法输出。
改成一致数据类型以后我的问题也解决了。
在小伙伴大头的提醒下,我意识到新的需求需要做出一些改变:
发布兼职人员基本功能中有描述出了可以对兼职信息进行发布外,还可以对自己发布的兼职信息进行查看(状态:未通过,已通过,未审批),以及查看审核过关的信息是否有兼职人员已经接取。可以对自己发布的兼职信息进行撤销
而如何查找呢?在job中只凭jid是可以查找,但是无法精确查找,所以新引入了uid,两个字段一起查找,实现精确查找。
首先是在是实体类上添加uid,然后是数据库job表也要添加uid字段并且建立外键,删除时遇到一些问题,首先是之前applyjob表建立过uid、jid外键,删除时会有外键关联,会弹出提示:
注释外键关联,记得选禁用外键检查
最后添加外键要重新运行确保建立联系成功。
在输入时直接略过性别并且输出报错进入下一个输入,出现问题的原因是:Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等
next就是读取到空格就结束了,nextLine是读取到回车结束
所以我还没有输入nextLine的字符串,它已经停掉了。
解决方法:
将scanner.nextLine改成scanner.next
成功啦!
查找发布兼职人员需要遍历用户list集合,遍历前先判断集合是否为空,
其中
参考资料:
终于测试辣!
第一次完成的大测,结果就报错:
Column count doesn't match value count at row 1 Query
列计数与第一行查询中的值计数不匹配
检查发现是user表之前有11个字段,后来加入了字段
user.getRegdat(),user.getCount(),user.getStatus());
分别是//注册日期 //升级需要未逾期完成兼职次数 //用户状态 0代表待业中,1代表工作中,2表示已完成
但是数据表和UserDaoImpl未更新,更新以后再试
普通用户 注册成功!数据库也成功存入。
同理发布兼职者也注册成功
管理员注册
添加兼职信息时报错:
Cannot add or update a child row: a foreign key constraint fails ……
无法添加或更新子行:外键约束失败
问题原因:
经过查找,发现在job,user表里uid的属性定义都not null,但是兼职信息录入时未指定用户,用“ ”占位,结果查询为空,自然报错
解决方法:
将uid设置非空即可,
这里将其设置为user.getUid(),将操作者用户存进去即可
问题:
之前输入的jid“001”无效,变成了“1”,并且查找不到
出现原因:
将jid设置为int类型,int类型001=1,自然查不到
解决方案:
将jid改为String类型
但是!!!事后小伙伴提醒后在数据库查询发现int字段能被String查询条件查找到,所以不用改
查询如图所示:
Duplicate entry '1' for key 'job.PRIMARY' Query
百度翻译一下,意思是键“primary”的重复条目“1”,也就是主键重复(但是可以正常录入数据库,查询结果见上上图)
int类型001=1,限制了但没完全限制,无效限制
改一下,将“int jid = TSUtils.number0(3,15);”
改为“int jid = TSUtils.number0(1,15);”
java List集合中contains方法总是返回false
发现在contains方法会调用 o.equals(elementData[i])方法,其中elementData[i]是个object类的实例。也就是说我在调用list.contains(user)时实际上比较的是user.equals(object) 这当然会返回false。
解决方法:
在Job类中改写equals方法,注意:
public boolean equals(Object obj) {
//多态的弊端是无法使用子类特有的属性和行为,所以得向下转型
Job p1 = (Job) obj;//将Object向下转型为job
return ((Integer)this.jid).equals(p1.jid); //!!!!因为jid是int类型需要将其强转为lnerger类型才能重写方法
}
还有很多细节,以结束工作为例:
还有结束日期的设置,String转Date进行compareTo比较
小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期
工作状态、用户状态的改变
信用等级的评定
余额的计算
……
都要注意
@Override //结束兼职工作
public boolean endJob(User user, int jid) throws SQLException, ParseException {
User user1 = userDao.findUserByUid(user);
ApplyJob applyJob = jobDao.findApplyJob(user, jid); //查询已申请兼职
Job job = jobDao.findJob(jid);
if (applyJob != null) {
// if (upte1 == 1 && applyJob.getJobStatus()==0 ) { } //受影响的行数1 工作状态status;//用户状态,0代表待业中或工作已完成,1代表工作中
//判断是否逾期
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
Date now = new Date(System.currentTimeMillis()); //获取当前结束时间
Date jobtimes = ft.parse(job.getJobTime()); //获取给定的时间,String转Date
System.out.println("当前结束时间为:" + ft.format(now));
System.out.println("给定的时间为:" + jobtimes);
long times = (now.getTime() - jobtimes.getTime()) / (1000 * 60 * 60 * 24); //计算逾期时间(单位:天)
//1.按时完成的情况
if (now.compareTo(jobtimes) == -1 || now.compareTo(jobtimes) == 0) {
//小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期
//余额的结算
double balance = user1.getBalance(); //获取当前最新余额
double newBalance = balance + job.getSalary();
System.out.println("您本次工作能获得的薪水为" + job.getSalary() + ",您的账户余额为:" + newBalance);
//余额写入数据库
jobDao.midifyBalance(user, newBalance);
//用户余额为0,自动结束工作,结算费用
if (newBalance == 0) {
//用户状态改变 从已工作1→未工作0
//用户的工作状态修改 status;//用户状态,0代表待业中或工作已完成,1代表工作中
jobDao.modifyStatus(user, 0);
userDao.midifyJobStatus(user, jid);
System.out.println("用户余额为0,自动结束工作");
}
//信用的结算
int creditRating = user1.getCreditRating(); //获取当前最新信用等级
if (creditRating == 5) {
System.out.println("您的信用已是最高5级,请继续保持!");
} else if (0 < creditRating && creditRating < 5) {
int count = user1.getCount() - 1;
if (count == 0) {
userDao.modifyCredit(user, creditRating + 1); //信用等级修改
} else {
System.out.println("按时完成" + count + "次兼职工作后信用等级恢复至" + (user1.getCreditRating() + 1) + "级");
}
}
//用户状态改变 从已工作1→未工作0
//用户的工作状态修改 status;//用户状态,0代表待业中或工作已完成,1代表工作中
jobDao.modifyStatus(user, 0);
userDao.midifyJobStatus(user, jid);
userDao.modifyCredit(user, creditRating); //信用等级修改
return true;
}
//2.逾期完成的情况
if (now.compareTo(jobtimes) == 1) {
//小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期
//余额的结算
double balance = user1.getBalance(); //获取当前最新余额
double number = job.getSalary() - (times * job.getDeductSalary() * job.getSalary()); //本次可获得薪资
double newBalance = balance + number;
//当前余额 = 先前余额 + 本次工作工资 - (逾期时间 * 逾期扣除费用比率 * 工作工资)
//用户余额为0,自动结束工作,结算费用
if (newBalance <= 0) {
//用户状态改变 从已工作1→未工作0
//用户的工作状态修改 status;//用户状态,0代表待业中或工作已完成,1代表工作中
jobDao.modifyStatus(user, 0);
userDao.midifyJobStatus(user, jid);
newBalance = 0.0;
System.out.println("用户余额为0,自动结束工作");
System.out.println("您本次工作能获得的薪水为" + 0.0 + ",您的账户余额为:" + 0.0);
//薪资、余额写入数据库
jobDao.midifyBalance(user, newBalance);
}
System.out.println("您本次工作能获得的薪水为" + number + ",您的账户余额为:" + newBalance);
//余额写入数据库
jobDao.midifyBalance(user, newBalance);
//信用的结算
int creditRating = user1.getCreditRating(); //获取当前最新信用等级
if (1 < creditRating && creditRating <= 5) {
userDao.modifyCredit(user, creditRating - 1); //信用等级修改
System.out.println("您已逾期,信誉等级扣除一级,当前您的信誉等级为:" + (creditRating - 1) + "级");
System.out.println("再按时完成" + user1.getCount() + "次兼职工作后信用等级恢复至" + (user1.getCreditRating()) + "级");
} else if (creditRating == 1) {
userDao.modifyCredit(user, 0); //信用等级修改
System.out.println("您已逾期,信誉等级扣除一级,当前您的信誉等级为:0级");
}
//用户状态改变 从已工作1→未工作0
//用户的工作状态修改 status;//用户状态,0代表待业中或工作已完成,1代表工作中
jobDao.modifyStatus(user, 0);
userDao.midifyJobStatus(user, jid);
return true;
}
System.out.println("该工作已结束!");
}
return false;
}
运行成功!
最后终于成功实现了功能:
项目的完成除了自己的努力以外,还要感谢葫芦葫芦葫芦同学以及沐风游云同学的倾情帮助,谢谢她们的援手,给我们鼓掌,呱唧呱唧!