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);
- 在使用的时候 由于不熟悉jdbctemplate内部方法
出了这个错误 即查询不到用户 (需求是通过用户名 在数据库里查询 返回一个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里
看错误报告 猜想可能是数据库查询时的问题 于是去改dao层
果然
原来写的
List<Province> list = (List<Province>) template.queryForObject(sql, new BeanPropertyRowMapper<Province>(Province.class));
因为要返回一个list 所以查询的肯定不止一个 那么在使用template方法的时候 就不能用template.queryforObject了 而要用template.query()
如以下 并且传入参数的时候 是new一个 BeanPropertyRowMapper<Bean的类型>(Bean.class)
List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
就解决了