今天晚上在学习一个小的综合案例,用浏览器页面给数据库数据实现增删改查时,踩的一个坑…
- 这是我想要的效果:
- 这是我实际的效果:
- 然后我就找代码错误,找了半个小时…
- 再然后我又开始debug模式运行,打断点,一步一步看,每个参数都没问题,sql语句也没有问题,但是一查询完,就不对了,就这样又半个多小时过去了…
- 纠结再三,我决定把学习资料源码中的两个方法复制到我的项目,对我的进行了替换,居然成了!!!
- 不到黄河心不死的我,最终决定将两个方法的源码和我的代码一个字母一个字母的比对!又花了半个多小时,给你们感受一下:
- 源码:
@Override
public int findTotalCount(Map<String, String[]> condition) {
//1.定义模板初始化sql
String sql = "select count(*) from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//2.遍历map
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
System.out.println(sb.toString());
System.out.println(params);
return template.queryForObject(sb.toString(),Integer.class,params.toArray());
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//2.遍历map
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
//添加分页查询
sb.append(" limit ?,? ");
//添加分页查询参数值
params.add(start);
params.add(rows);
sql = sb.toString();
System.out.println(sql);
System.out.println(params);
return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
}
}
- 我的代码:
@Override
public int findTotalCount(Map<String, String[]> condition) {
//1.定义初始化模板sql
String sql = " select count(*) from users where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//存放参数value的集合
List<Object> params = new ArrayList<Object>();
//2.遍历map
Set<String> keyset = condition.keySet();
for (String key : keyset) {
if("currentPage".equals(key) || "rows".equals(key)) {
continue;
}
//获取value
String value = condition.get(key)[0];
if(value != null && !"".equals(value)) {
sb.append(" and " + key + " like ? ");
params.add(" %" + value + "% ");
}
}
/*System.out.println(sb.toString());
System.out.println(params);*/
return template.queryForObject(sb.toString(),Integer.class,params.toArray());
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from users where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//存放参数value的集合
List<Object> params = new ArrayList<Object>();
//2.遍历map
Set<String> keyset = condition.keySet();
for (String key : keyset) {
if("currentPage".equals(key) || "rows".equals(key)) {
continue;
}
//获取value
String value = condition.get(key)[0];
if(value != null && !"".equals(value)) {
sb.append(" and " + key + " like ? ");
params.add("%" + value + "%");
}
}
sb.append(" limit ?, ? ");
params.add(start);
params.add(rows);
/*System.out.println(sb.toString());
System.out.println(params);*/
return template.query(sb.toString(), new BeanPropertyRowMapper<User>(User.class), params.toArray());
}
- 除了我的表是users ,源码用的表是user以外, 我还是没找到不同…
- 最后,我决定将每个字符串的格式(主要是空格),都写得和源码一样,然后发现了问题所在:
params集合存储的value值,在拼接%时,我多写了空格…MySQL不允许这个空格存在…
- 正确的格式:
params.add("%" + value + "%");
- 我的格式:
params.add(" %" + value + "% ");