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) -&gt; ... 之外。即:

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框架之spring—jdbcTemplate

java web014——Spring JdbcTemplate

Java之Spring JdbcTemplate(一篇文章精通系列)

Java之Spring JdbcTemplate(一篇文章精通系列)

Java Spring-JdbcTemplate

Spring中JdbcTemplate中使用RowMapper