📜  Spring JDBC-JdbcTemplate类(1)

📅  最后修改于: 2023-12-03 15:05:16.112000             🧑  作者: Mango

Spring JDBC - JdbcTemplate类

Spring JDBC是Spring框架的一部分,它为JDBC操作提供了简单和高效的方式。JdbcTemplate类是Spring JDBC的核心类之一,它简化了JDBC的使用,减少了模板代码的量。

JdbcTemplate的特点
  • 简化了JDBC的代码量
  • 提供了异常处理和自动资源管理
  • 支持命名参数和命名参数模板
  • 支持查询结果的自动映射和对象化
JdbcTemplate的使用

首先,需要在Spring配置文件中配置数据源和JdbcTemplate实例:

<bean id="dataSource"
    class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>

<bean id="jdbcTemplate" 
    class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

在代码中,可以通过使用JdbcTemplate实例来执行JDBC方法。例如,以下是一个查询方法的例子:

public List<Employee> findAllEmployees() {
    return jdbcTemplate.query(
        "SELECT id, name, age, salary FROM employees", 
        (rs, rowNum) -> {
            Employee employee = new Employee();
            employee.setId(rs.getLong("id"));
            employee.setName(rs.getString("name"));
            employee.setAge(rs.getInt("age"));
            employee.setSalary(rs.getDouble("salary"));
            return employee;
        });
}

以上代码使用query方法执行SQL查询,获取结果集,将结果集通过Lambda表达式转换为Java对象列表。Lambda表达式包含一个ResultSetExtractor函数式接口的实现, 在该实现中,将ResultSet中的数据提取出来,组成Employee对象,并进行返回。JdbcTemplate自动处理ResultSet对象,使开发人员只需关注业务逻辑。

JdbcTemplate类提供多种JDBC操作方法,如:

  • update 用于执行DDL、DML语句
  • batchUpdate 用于执行批量执行DDL、DML
  • call 用于调用存储过程和函数
  • queryForInt、queryForLong 用于获取单个整数值
  • queryForList 查询多条记录
  • queryForObject 查询单条记录
public int insertEmployee(Employee employee) {
    String sql = "INSERT INTO employees (name, age, salary) VALUES (?, ?, ?)";
    return jdbcTemplate.update(sql, employee.getName(), employee.getAge(), employee.getSalary());
}

public int[] batchInsertEmployees(List<Employee> employees) {
    String sql = "INSERT INTO employees (name, age, salary) VALUES (?, ?, ?)";
    Object[][] employeesParams = new Object[employees.size()][];
    for (int i = 0; i < employees.size(); i++) {
        Employee employee = employees.get(i);
        employeesParams[i] = new Object[] { employee.getName(), employee.getAge(), employee.getSalary() };
    }
    return jdbcTemplate.batchUpdate(sql, employeesParams);
}

public void callStoredProcedure(String spName, SqlParameter... sqlParameters) {
    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName(spName);
    simpleJdbcCall.execute(sqlParameters);
}

public List<Employee> findEmployeesByName(String name) {
    String sql = "SELECT id, name, age, salary FROM employees WHERE name = ?";
    return jdbcTemplate.query(sql, new Object[]{ name }, new BeanPropertyRowMapper<>(Employee.class));
}

public int countEmployees() {
    String sql = "SELECT COUNT(*) FROM employees";
    return jdbcTemplate.queryForObject(sql, Integer.class);
}
结论

通过JdbcTemplate类,开发人员可以简化JDBC操作,减少代码量,提高开发效率。它提供了异常处理、自动资源管理、命名参数和模板、自动映射查询结果等特性,这使得开发人员专注于业务逻辑而不必担心JDBC细节。