我想实现一个多条件查询数据库的方法。该方法接收一个对象,如果该对象字段有值则进入选择条件,如果没有则排除。使用sql语言可以这样实现。
SELECT Id, Name, Age, ClassID, Sex, Rark
FROM stu
WHERE (Id=@a or @a is null)and(Name =@c or @c is null)
只要id或者name两个字段中有一个有条件就可以选择这个条件,如果两个条件都为null那么就是全部选择。但是如何在java当中实现呢?
我试着这样实现
public ArrayList selectArr(biao obj) {
Connection conn = DbConn.sql(); //获得连接对象
PreparedStatement pst = null; //说明sql语句执行对象,该对象可使用参数
ArrayList arr = new ArrayList();
try {
pst = conn.prepareStatement(
"SELECT * FROM [test] WHERE (Name=? or ? is null")and(Id=?or ?is null);
pst.setString(1, obj.getName()); //给参数赋值
pst.setString(2, obj.getName());
pst.setString(3, obj.id());
pst.setString(4, obj.id());
ResultSet rs = pst.executeQuery(); //执行查询
}
catch(){}
}但是结果并不成功。主要是字段为空时不知道为什么不能满足“?is null”条件。各位知道为什么这样吗?有什么解决的办法?另外请教大家对于多条件查询有什么高招没有?
SELECT Id, Name, Age, ClassID, Sex, Rark
FROM stu
WHERE (Id=@a or @a is null)and(Name =@c or @c is null)
只要id或者name两个字段中有一个有条件就可以选择这个条件,如果两个条件都为null那么就是全部选择。但是如何在java当中实现呢?
我试着这样实现
public ArrayList selectArr(biao obj) {
Connection conn = DbConn.sql(); //获得连接对象
PreparedStatement pst = null; //说明sql语句执行对象,该对象可使用参数
ArrayList arr = new ArrayList();
try {
pst = conn.prepareStatement(
"SELECT * FROM [test] WHERE (Name=? or ? is null")and(Id=?or ?is null);
pst.setString(1, obj.getName()); //给参数赋值
pst.setString(2, obj.getName());
pst.setString(3, obj.id());
pst.setString(4, obj.id());
ResultSet rs = pst.executeQuery(); //执行查询
}
catch(){}
}但是结果并不成功。主要是字段为空时不知道为什么不能满足“?is null”条件。各位知道为什么这样吗?有什么解决的办法?另外请教大家对于多条件查询有什么高招没有?
使用上面的sql语句可以自动判断条件参数@a和@c是否存在,如果该参数不存(为null)在就忽略它。这个在查询分析器中已经验证可行。我这里设想用户界面中有很多查询条件可以输入,如果用户输入一个条件,则查询这个条件。如果输入多个则查询多个,如果不输入,则查询全部。用对象将查询对象接收然后传入这个查询方法。对象中所有的字段都可以作为查询条件。传入的对象的字段如果有值则将该值作为条件,如果没有值就忽略。但是使用PreparedStatement 的?参数输入,就无论如何都不能识别该字段是否为null。只有or前面的条件起作用。另外不知道java是否支持对sql语句中的"@a"这样的参数赋值?如果可以对sql语句的参数赋值那个这个问题就好解决啦。
真是神奇的java!!!!
String sql= "select * from student_info ";
String searchtype=codeToString(request.getParameter( "searchtype "));
String s=codeToString(request.getParameter( "ziduan "));
if(s.equals( "xh "))
{
if(searchtype.equals( "jq "))
{
sql=sql+ " where txtnumber = ' "+s1+ " ' " ;
}
else
{
sql=sql+ " where txtnumber like '% "+s1+ "% ' ";}
}
}
if(s.equals( "xy "))
{
if(searchtype.equals( "jq "))
{
sql=sql+ " where txtinstitute= ' "+s1+ " ' ";
}
else
{
sql=sql+ " where txtinstitute like '% "+s1+ "% ' ";}
}
}
if(s.equals( "xm "))
{
if(searchtype.equals( "jq "))
{
sql=sql+ " where txtname= ' "+s1+ " ' ";
}
else
{
sql=sql+ " where txtname like '% "+s1+ "% ' ";}
}
}
String sql = "select * from emp where"; //基础语句,下面的都是可选择的
String sql1 = " and name1 = ?";
String sql2 = " and name2 = ?";
String sql3 = " and name3 = ?";
String sql4 = " and name4 = ?";
String sql5 = " and name5 = ?";
String sqlyes = sql+(name1==null?"":sql1)+(name2==null?"":sql2)
+(name3==null?"":sql3)+(name4==null?"":sql4)+(name5==null?"":sql5);
}传参的时候,为空的字段参数直接用null代替