Spring框架对JDBC的简单封装 -- JDBCTemplate对象

Spring JDBC
* Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
* 步骤:
1. 导入jar包(如果是Maven项目则添加依赖)
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);
3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句。增、删、改语句
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
* queryForList():查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
* query():查询结果,将结果封装为JavaBean对象
* query的参数:RowMapper
* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
* new BeanPropertyRowMapper<类型>(类型.class)
* queryForObject:查询结果,将结果封装为对象
* 一般用于聚合函数的查询

自己学习中遇到的问题

1.在使用jdbctemplate对象的时候 发现在传参数的时候对于占位符的控制 当时理解不到位

    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql = "update emp set salary=8000 where id= ? ";
        int account = template.update(sql, 1001);//各个args(参数)分别是占位符(即?所对应的想要修改的位置
                                                // 比如id=? 那么我想改id为1001的位置的信息 就在args这个参数这边改为1001就okk)
 // 1. 同时 可写多个占位符
 如    String sql = "update emp set salary=8000 where id= ? and name=? ";
 则使用的语句如下面这句
//        int account = template.update(sql, 1001, "zhangsan");
//  2.或者如果不传参 则使用下面这一句即可
//          int account = template.update(sql);
// account验证是否执行成功
        System.out.println("account = " + account);
        

  1. 在使用的时候 由于不熟悉jdbctemplate内部方法
    Spring框架对JDBC的简单封装 -- JDBCTemplate对象_第1张图片
    出了这个错误 即查询不到用户 (需求是通过用户名 在数据库里查询 返回一个user对象)

查看并分析原因是说的没有这个用户 (实际就是没有,因为是要做注册 打算利用username验证 如果有这个人则注册失败 如果没这个人 则新加到数据库)
而这个函数 就是为了通过username查询这个人的 那肯定不存在

于是想到将这预想中的异常 应该将这个 查询的sql进行try catch 一下 于是就成功了
附上源代码

 /*
     * 查询用户是否存在
     * @author jay
     * @param [username]
     * @return user对象
     */
    @Override
    public User findByUsername(String username) {
        User u = null;
        try {
            //1.定义sql
            String sql = "select* from tab_user where username= ?";
            // 2 执行sql
            u = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
        } catch (Exception e) {
        }
        return u;
    }

3.又遇到问题(跟第二个问题一样 不熟悉template的内部方法)
在做jedistest项目的时候 发现后台数据一直返回不到前台
开始的时候考虑是否druid.propertites配置错 (因为打开一直是灰色)
后来发现改了也没用
再后来考虑是不是jdbcutils工具类在封装数据库连接池的时候出错
于是又将

 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");

改为(去掉了getClassLoader())

            InputStream is = JDBCUtils.class.getResourceAsStream("druid.properties");

然并卵。。。
最后打开f12调试了发现并没有进到servlet里
Spring框架对JDBC的简单封装 -- JDBCTemplate对象_第2张图片
看错误报告 猜想可能是数据库查询时的问题 于是去改dao层
果然
原来写的

 List<Province> list = (List<Province>) template.queryForObject(sql, new BeanPropertyRowMapper<Province>(Province.class));

因为要返回一个list 所以查询的肯定不止一个 那么在使用template方法的时候 就不能用template.queryforObject了 而要用template.query()
如以下 并且传入参数的时候 是new一个 BeanPropertyRowMapper(Bean.class)

  List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));

就解决了

你可能感兴趣的:(javaee学习)