我们在编写程序时应该尽量提高代码的复用性,力求简洁,并且在简洁的情况下,依然可以完整地实现相应的功能。
在项目练习中,经常需要写操作数据库的方法,比如在实现注册登录业务时,需要查询数据库,并通过返回的结果集判断是否可以注册或登录。不同情况下有不同的查询条件,相应的也就有不同的查询语句。比如注册时,一般用户名不可重复,所以我们需要查询数据库中此用户名是否已存在。如果用户名不存在,即没有查询到结果,才可以注册。
// 查询返回user中所有userName为tom的数据
String sql="select * from user where userName='tom';";
但当登录时,我们不仅要查询用户名是否存在,还要判断密码是否匹配。此时的sql语句应当为:
// 查询返回user中所有userName为tom的数据
String sql="select * from user where userName='tom' and passWord='tom123';";
作为一个初学者,面对这种情况,我们下意识地会想到再写一个方法,实现不同条件的查询,这样很麻烦。
实际的项目中,不只会遇到用户名和密码两种条件的查询。面对不同的查询需要,如果我们写多个方法,其工作量大且效率比较低,代码也比较冗杂。
下面的一个方法可以实现对user对象的任意条件查询。
首先假定我们的User类有如下属性:
private int id;
private String userName;
private String passWord;
private String sex;
private int age;
当我们需要查询任意字段时,先创建一个空的对象。再将查询条件作为属性赋给此对象,然后就可以将此对象作为参数传入以下方法进行查询:
public ArrayList<User> getUsers(User user) throws SQLException {
StringBuffer str=new StringBuffer("select * from user where 1=1");
if(user.getId()!=0)
str.append("and id="+user.getId());
if(user.getUserName()!=null)
str.append("and userName='"+user.getUserName()+"'");
if(user.getPassWord()!=null)
str.append("and passWord='"+user.getPassWord()+"'");
if(user.getSex()!=null)
str.append("and sex='"+user.getSex()+"'");
if(user.getAge()!=0)
str.append("and age='"+user.getAge()+"'");
String sql=str.toString();
System.out.println(sql);
JDBCTools jt=new JDBCTools();
ResultSet rs= jt.selectObject(sql);
if(rs==null)
return null;
ArrayList<User> users=new ArrayList();
while (rs.next())
{
int id=rs.getInt("id");
String userName=rs.getString("userName");
String passWord=rs.getString("passWord");
String sex=rs.getString("sex");
int age=rs.getInt("age");
User u=new User(id,userName,passWord,sex,age);
users.add(u);
}
return users;
}
此方法需要的参数为所查询的类的对象。将查询条件封装到对象中,查询后返回的结果为对象集合,再对集合进行具体的处理,以实现不同的业务逻辑。所以这是一个通用的查询方法。