扫码关注官方订阅号
public static void main(String[] args) { List> params = new ArrayList>(); Map param = new HashMap(); //查询条件 param.put("k", "user_name"); param.put("v", "'小美'"); param.put("rela", "="); params.add(param); //查询条件 param = new HashMap(); param.put("k", "mobile"); param.put("v", "18712345678"); param.put("rela", "="); params.add(param); //查询条件 param = new HashMap(); param.put("k", "age"); param.put("v", 33); param.put("rela", "="); params.add(param); //如果我查询条件很多,这里要写一堆param吗?怎么写可以简洁一点?? query(params); } public List query(List> params) throws Exception{ List result=new ArrayList(); Connection conn=DBUtil.getConnection(); StringBuilder sb=new StringBuilder(); sb.append("select * from imooc_goddess where 1=1 "); if(params!=null&¶ms.size()>0){ for (int i = 0; i < params.size(); i++) { Map map=params.get(i); sb.append(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" "); } } PreparedStatement ptmt=conn.prepareStatement(sb.toString()); System.out.println(sb.toString()); ResultSet rs=ptmt.executeQuery(); Goddess g=null; while(rs.next()){ g=new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); result.add(g); } return result; }
ringa_lee
首先,请你告诉我你使用PreparedStatement的理由,为什么不使用Statement?二者有什么区别?然后 你用到了PreparedStatement的特性了吗?
PreparedStatement
Statement
接下来我们在探讨这代码该怎么写。下面的代码仅供参考,基本不具有实践意义。
public static void main(String[] args) { Map<String, Object> params = new HashMap<String, Object>(); param.put("user_name", "小美"); param.put("mobile", "18712345678"); param.put("age", "33"); // 如果传递条件不限于相等,则如下 // param.put("nick_name like=?", "小李"); // param.put("age=?", "33"); query(params); } public List<Goddess> query(Map<String, Object> params) throws Exception{ List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection(); StringBuilder sb=new StringBuilder(); sb.append("select * from imooc_goddess"); if(params!=null && params.keySet().size() > 0){ sb.append(" where 1=1"); Set<String> keySet = params.keySet(); for (String key : keySet) { sb.append(" and "+key+"=?"); // 如果判断条件不是有等于可以如下 // sb.append(" and " + key); } } PreparedStatement ptmt=conn.prepareStatement(sb.toString()); System.out.println(sb.toString()); if(params!=null && params.keySet().size() > 0){ Set<String> keySet = params.keySet(); int index = 0; for (String key : keySet) { index++; Object value = params.get(key); if(value instanceof String){ ptmt.setString(index, (String)value); }else if(value instanceof Integer){ ptmt.setInt(index, (Integer)value); }else if(value instanceof Date){ ptmt.setTimestamp(index, new Timestamp(((Date)value).getTime())); }else{ //...... } } } ResultSet rs=ptmt.executeQuery(); Goddess g=null; while(rs.next()){ g=new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); result.add(g); } return result; }
你写的代码看了一下,你看可不可以改成这样,把query的形参改成String类型,用于接收查询条件:
public List<Goddess> query(String conditions) throws Exception{...}
然后,查询条件直接写进一个字符串中,例如:
String conditions = "user_name='小美' and mobile=18712345678 and age=33";
这样的话写起来就简便一些了,而且query方法也不需要对map进行遍历构造查询字符串了。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
首先,请你告诉我你使用
PreparedStatement的理由,为什么不使用Statement?二者有什么区别?然后 你用到了
PreparedStatement的特性了吗?接下来我们在探讨这代码该怎么写。下面的代码仅供参考,基本不具有实践意义。
你写的代码看了一下,你看可不可以改成这样,把query的形参改成String类型,用于接收查询条件:
然后,查询条件直接写进一个字符串中,例如:
这样的话写起来就简便一些了,而且query方法也不需要对map进行遍历构造查询字符串了。