spring jdbctemplate和java web中jdbc的区别,它有啥好处
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring jdbctemplate和java web中jdbc的区别,它有啥好处相关的知识,希望对你有一定的参考价值。
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
Spring提供的JdbcTemplate对jdbc做了封装,大大简化了数据库的操作。找到Spring JdbcTemplate源码,可以看到如下方法:
Connection con = DataSourceUtils.getConnection(getDataSource());如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作;繁琐且代码看起来不直观。
此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值/赋值等操作,提高开发效率;
如下:
return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class) 参考技术A 调用的还是javaweb中的jdbc,是对原生jdbc的封装,代码量更小,如同DBUtils一样Spring jdbcTemplate 数据访问和java算法
【中文标题】Spring jdbcTemplate 数据访问和java算法【英文标题】:Spring jdbcTemplate data access and java algorithms 【发布时间】:2016-09-05 07:17:29 【问题描述】:我有一种方法必须在 DAO 中返回数据。
部门型号:
public class Department implements Serializable
private Long id;
private String departmentName;
private List<Employees> employeesInThisDepartment;
// getters and setters...
员工模型:
public class Employees implements Serializable
private Long id;
private String department;
private String fullName;
private Date birthday;
private int salary;
// getters and setters...
DAO 中的方法:
@Override
public Department findByDepartmentNameWithEmployees(String departmentName)
String sql = "select d.id, d.departmentName, e.id, e.fullName, e.department, e.birthday" +
", e.salary from department as d left join employees as e on d.departmentName = e.department " +
"where lower(d.departmentName) = lower(:departmentName)";
Map<String, Object> map = new HashMap<>();
map.put("departmentName", departmentName);
return jdbcTemplate.queryForObject(sql, map, (rs, rowNum) ->
Department department = new Department();
department.setId(rs.getLong("department.id"));
department.setDepartmentName(rs.getString("department.departmentName"));
department.setEmployeesInThisDepartment(new ArrayList<>());
while (rs.next())
Employees employees = new Employees();
employees.setId(rs.getLong("employees.id"));
employees.setFullName(rs.getString("employees.fullName"));
employees.setDepartment(rs.getString("employees.department"));
employees.setBirthday(rs.getDate("employees.birthday"));
employees.setSalary(rs.getInt("employees.salary"));
department.getEmployeesInThisDepartment().add(employees);
return department;
);
此方法必须返回一个部门,其中包含在该部门工作的所有员工的列表,但它错过了列表中的第一个员工。 为什么会这样? (SQL部分工作正常,我认为问题出在循环上?)
【问题讨论】:
不要调用rs.next()
... 对结果集中的每一行调用mapRow
方法(已使用)。您基本上是在反对而不是使用框架。结果集中的每一行都将包含一名员工的所有部门信息和信息,您现在总是跳过第一个。您应该使用ResultSetExtractor
而不是RowMapper
。
【参考方案1】:
是的,循环中的问题。根据docs:
实现必须实现这个方法来映射每一行数据 结果集。
所以你不需要调用rs.next()
,只需删除这个循环包装器并移动块
Department department = new Department();
department.setEmployeesInThisDepartment(new ArrayList<>());
在return jdbcTemplate.queryForObject(sql, map, (rs, rowNum) -> ...
之外。即:
Department department = new Department();
department.setEmployeesInThisDepartment(new ArrayList<>());
jdbcTemplate.queryForObject(sql, map, (rs, rowNum) ->
department.setId(rs.getLong("department.id"));
department.setDepartmentName(rs.getString("department.departmentName"));
Employees employees = new Employees();
employees.setId(rs.getLong("employees.id"));
employees.setFullName(rs.getString("employees.fullName"));
employees.setDepartment(rs.getString("employees.department"));
employees.setBirthday(rs.getDate("employees.birthday"));
employees.setSalary(rs.getInt("employees.salary"));
department.getEmployeesInThisDepartment().add(employees);
);
return department;
【讨论】:
在department
恕我直言上缺少final
在 Java 8 中可能不需要,因为它实际上是最终版本。但是我已经在没有编译器的情况下编写了这段代码,所以我将把这个细节留给 SO
好的,我无法为没有 rs 的部门设置 ID。 Rs 在 lambda 之外不存在
当我删除循环时,我得到异常“不正确的结果大小:预期 1,实际 3”
然后在 lambda 中移动这行特定的代码以上是关于spring jdbctemplate和java web中jdbc的区别,它有啥好处的主要内容,如果未能解决你的问题,请参考以下文章
java web014——Spring JdbcTemplate
Java之Spring JdbcTemplate(一篇文章精通系列)