1.如果要定义一个数据过滤的功能,比如说向表内添加数据,但这条数据内的某个字段值重复,这种方法可以在DAO层内用SQL语句来实现,如果用纯逻辑判断来筛选,效率过低而且容易犯错。
另外,比较字符串是否相同要用equals方法!
2.使用标签功能可打断指定循环,例如
public Test{ public void test(){ int a= 10; loop1: while(a>0){ a--; while(a<=2){ break loop1; } } } }
3.利用try catch可以使得错误不打断程序继续运行,同时可以给用户返回指定信息
public void searchCase() { try { System.out.println("输入开始时间,年月日以横短杠分隔:"); String start = sc.next(); System.out.println("输入结束时间,年月日以横短杠分隔:"); String end = sc.next(); ArrayList<AccountBook> list = accountBookController.searchAccountBook(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date s = sdf.parse(start); Date e = sdf.parse(end); System.out.println("序号 收入类型 支出类型 支付类型 金额 建立时间 备注"); for(int i=0;i<list.size();i++) { Date c = sdf.parse(list.get(i).getCreatetime()); if(c.getTime()>=s.getTime()&c.getTime()<=e.getTime()) { System.out.printf("%d %d %d %d %f %s %s ", list.get(i).getAid(),list.get(i).getGet(),list.get(i).getPay(),list.get(i).getAccount(), list.get(i).getCost(),list.get(i).getCreatetime(),list.get(i).getDescription()); } } } catch (ParseException e) { System.out.println("日期格式输入错误!"); } }
在上例的代码中,如果用户输入的的日期不符合定义的格式,不会报ParseException错误,会打印日期格式输入错误!
另外,这种处理方式也可以用在Scanner中,如果应当输入的是个数字,而用户输入的是字符串,正常会报InputMismatchException错误
但我们可在catch块里自定义输出一条语句,保证不报错,不打断程序的运行,例如如下代码:
public void deleteAccountBook() { while(true) { try { Scanner s = new Scanner(System.in); System.out.println("输入要删除账务的ID:"); searchAll(); System.out.println("请输入:"); int aid = s.nextInt();//如果这里用户输入的是字符串 AccountBook accountBook = new AccountBook(); accountBook.setAid(aid); if(accountBookController.accountBookCheckID(accountBook)) { }else { System.out.println("该ID不存在!"); continue; } accountBookController.deleteAccountBook(accountBook); return; } catch (InputMismatchException e) { System.out.println("请输入一个数字!");//则会打印该语句
//同时注意,这个try catch是在while循环内的,不会打断循环 } } }
3.resultset的next方法问题:
如果用同一个resultset的next方法进行两个while循环,则第二个while循环只能从最后一个resultset对象开始,
因为第一个while循环结束后,指针已经移动到最后一个,第二个while循环会从这里开始。
4.MySQL查询以及修改问题:
如果在MySQL内,一个数字类型字段没有赋值,即为null,如果在java中用arraylist返回对象后,读取该对象对应的数值型的成员变量值,
则该值为零。比如说MySQL有这样一条数据: id 1 (收入类型)get NULL (支出类型)pay 2 那么在JAVA内输出时,对象.getGet()的值是0。
注意,如果是在resultset内用getString方法,则得到的就是NULL。
注意:
在添加、修改有外键约束的数值时,例如该表参考的外键值只有1-7,但是你想让对应值是NULL,那就要用setString,而不要用setInt,对应值为NULL
public int updateAccountBook(AccountBook accountBook) { try { Connection conn = DButil.getConn(); String sql = "update accountbook set get=?,pay=?,account=?,cost=?,createtime=?,description=? " + "where aid =?"; PreparedStatement ps = conn.prepareStatement(sql); if(accountBook.getGet()==0) { ps.setString(1, null);//外键约束,不能直接填0 }else { ps.setInt(1, accountBook.getGet()); } if(accountBook.getPay()==0){ ps.setString(2, null); }else { ps.setInt(2, accountBook.getPay()); } ps.setInt(3,accountBook.getAccount()); ps.setDouble(4, accountBook.getCost()); ps.setString(5, accountBook.getCreatetime()); ps.setString(6, accountBook.getDescription()); ps.setInt(7, accountBook.getAid()); int r = ps.executeUpdate(); DButil.close( ps, conn); return r; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("修改数据失败"+e); } }
5.MySQL DATE数据问题:
MySQL内的DATE类型字段在JAVA内读取时,如果在MySQL是用yyyy-mm-dd格式添加的值,在JAVA内用getString或者getDate得到的都一个
yyyy-mm-dd这样格式的值,如果要向表里添加Date类型的值,可以用setString直接添加。
6.其他应注意的报错:
另外,如果一个while一直循环,也会出现这种情况。