【java学习踩坑】MySQL中新手容易犯的一个错误

今天晚上在学习一个小的综合案例,用浏览器页面给数据库数据实现增删改查时,踩的一个坑…

  1. 这是我想要的效果:理想
  2. 这是我实际的效果:实际
  3. 然后我就找代码错误,找了半个小时…
  4. 再然后我又开始debug模式运行,打断点,一步一步看,每个参数都没问题,sql语句也没有问题,但是一查询完,就不对了,就这样又半个多小时过去了…
  5. 纠结再三,我决定把学习资料源码中的两个方法复制到我的项目,对我的进行了替换,居然成了!!!
  6. 不到黄河心不死的我,最终决定将两个方法的源码和我的代码一个字母一个字母的比对!又花了半个多小时,给你们感受一下:
  • 源码:
    @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());
    }
  1. 除了我的表是users ,源码用的表是user以外, 我还是没找到不同…
  2. 最后,我决定将每个字符串的格式(主要是空格),都写得和源码一样,然后发现了问题所在:

params集合存储的value值,在拼接%时,我多写了空格…MySQL不允许这个空格存在…

  • 正确的格式:
	params.add("%" + value + "%");
  • 我的格式:
	params.add(" %" + value + "% ");
总结:
新手一定要注意数据库操作时,SQL语句中字符串的拼接以及空格的使用情况!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值