您的位置:

JdbcTemplate使用全面指南

一、JdbcTemplate使用方法

JdbcTemplate是Spring Framework 提供的一个基于JDBC的核心库,提供了简洁的Java数据库操作方式,同时也支持ORM框架集成如Hibernate、MyBatis等。

JdbcTemplate的使用非常简单,首先需要将数据源注入到JdbcTemplate中,如下:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
    <constructor-arg ref="dataSource">
</bean>

然后就可以通过调用JdbcTemplate的方法来进行相关操作了,下面是一个查询操作的示例:

public List findAll() {
        String sql = "SELECT * FROM users";
        List
    users = jdbcTemplate.query(sql, new RowMapper
    () {
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                return user;
            }
        });
        return users;
    }

    
   
  

上述代码中,调用了JdbcTemplate的query方法,传入了SQL语句和RowMapper对象。

二、JdbcTemplate使用问题

进行JdbcTemplate开发时,常见的问题有以下:

1、JdbcTemplate方法中异常返回问题

JdbcTemplate的方法中异常返回问题,常见原因是因为JdbcTemplate方法本身不抛出异常而是返回null或者空的集合,在方法中需要自行处理异常。

一个查询操作示例:

public List findAll() {
        try {
            String sql = "SELECT * FROM users";
            List
    users = jdbcTemplate.query(sql, new RowMapper
    () {
                public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                    User user = new User();
                    user.setId(rs.getLong("id"));
                    user.setName(rs.getString("name"));
                    user.setEmail(rs.getString("email"));
                    return user;
                }
            });
            return users;
        } catch (Exception e) {
            logger.error("findAll exception", e);
            throw new RuntimeException("findAll exception", e);
        }
    }

    
   
  

2、JdbcTemplate参数类型处理问题

JdbcTemplate在绑定参数时,需要注意传参的类型问题。例如,传入NULL或空字符串时需要指定参数的类型:

String sql = "UPDATE users SET name=? WHERE id=?";
jdbcTemplate.update(sql, new Object[]{null, 101}, new int[]{Types.VARCHAR, Types.INTEGER});

三、JdbcTemplate使用事务

JdbcTemplate事务的使用和Spring事务的使用类似,使用TransactionTemplate对象来实现事务管理。需要指定事务的传播行为、隔离级别等,例如:

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
def.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);

TransactionStatus status = transactionManager.getTransaction(def);
try {
    // 执行JdbcTemplate的操作
    transactionManager.commit(status);
} catch (Exception ex) {
    transactionManager.rollback(status);
    throw ex;
}

四、JdbcTemplate使用了什么设计模式

JdbcTemplate使用了模板方法模式,将模板方法定义在JdbcTemplate类中,供用户实现具体方法,如query、update、batchUpdate等。用户只需要实现相关的回调方法,就可以完成数据访问的操作。这样可以将大量的模板代码集中在一起,使代码更简洁清晰。

五、JdbcTemplate增删改查

使用JdbcTemplate进行增删改查的操作非常简单,示例如下:

1、查询操作

String sql = "SELECT * FROM users WHERE id=?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{1}, (ResultSet rs, int rowNum) -> {
    User u = new User();
    u.setId(rs.getLong("id"));
    u.setName(rs.getString("name"));
    u.setEmail(rs.getString("email"));
    return u;
});

2、插入操作

String sql = "INSERT INTO users(name, email) VALUES(?,?)";
jdbcTemplate.update(sql, new Object[]{"Jack", "jack@abc.com"});

3、删除操作

String sql = "DELETE FROM users WHERE id=?";
jdbcTemplate.update(sql, new Object[]{1});

六、JdbcTemplate方法

除了常见的query、update、batchUpdate方法外,JdbcTemplate还提供了一些其他常用的方法,例如:

1、execute方法

execute方法可以用于执行任何带参数的SQL语句,可以返回一些随机对象,如下:

String sql = "DELETE FROM users WHERE id=?";
jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
    protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
        lobCreator.setBlobAsBytes(ps, 1, new byte[0]);
        ps.setInt(2, 1);
    }
});

2、queryForList方法

执行SQL查询后将结果转换成List,每个结果直接对应于Map中的一个项目:

String sql = "SELECT id, name, email FROM users";
List
   > rows = jdbcTemplate.queryForList(sql);
for (Map
     row : rows) {
    System.out.println(row.get("id") + " " + row.get("name") + " " + row.get("email"));
}

    
   

3、queryForObject方法

查询单个结果,例如获取用户的姓名:

String sql = "SELECT name FROM users WHERE id=?";
String name = jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class);
System.out.println("name=" + name);

七、JdbcTemplate找不到

在使用JdbcTemplate时,可能会出现找不到JdbcTemplate类的问题。这通常是因为没有在pom.xml文件中引入Spring JDBC相关依赖或者版本冲突导致的。

正确的依赖应该类似如下:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.9</version>
    </dependency>
    ...
</dependencies>

八、JdbcTemplate批量insert

批量插入数据时,可以使用JdbcTemplate的batchUpdate方法,只需要把多组数据放在二维数组中即可:

String sql = "INSERT INTO users(name,email) VALUES (?, ?)";
List params = new ArrayList<>();
params.add(new Object[]{"jack", "jack@abc.com"});
params.add(new Object[]{"tom", "tom@abc.com"});
params.add(new Object[]{"jerry", "jerry@abc.com"});

jdbcTemplate.batchUpdate(sql, params);

  

九、JdbcTemplate常用方法

除了常用的query、update、batchUpdate方法外,JdbcTemplate还提供了以下常用的方法。

1、queryForRowSet方法

执行SQL查询并将结果放入SqlRowSet中,每个结果直接对应于SqlRowSet中的一个项目:

String sql = "SELECT id, name FROM users";
SqlRowSet rs = jdbcTemplate.queryForRowSet(sql);
while (rs.next()) {
    long id = rs.getLong("id");
    String name = rs.getString("name");
    System.out.println(id + " " + name);
}

2、update方法

使用update方法可以执行任何不返回结果集的SQL语句,例如删除、修改等:

String sql = "DELETE FROM users WHERE name=?";
jdbcTemplate.update(sql, new Object[]{"jack"});

3、batchUpdate方法

批量执行SQL语句,例如批量插入、修改等:

String sql = "INSERT INTO users(name, email) VALUES (?, ?)";
List batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"jack", "jack@abc.com"});
batchArgs.add(new Object[]{"tom", "tom@abc.com"});
batchArgs.add(new Object[]{"jerry", "jerry@abc.com"});
jdbcTemplate.batchUpdate(sql, batchArgs);

  

4、execute方法

用于执行任意类型的SQL语句,例如插入二进制数据到数据库:

String sql = "INSERT INTO users(id, name) VALUES (?, ?)";
final byte[] bytes = new byte[1024];
Random random = new Random();
random.nextBytes(bytes);
jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
    @Override
    protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
        ps.setInt(1, 1);
        lobCreator.setBlobAsBytes(ps, 2, bytes);
    }
});

总结

本文介绍了JdbcTemplate的使用方法、常用操作、事务管理以及常见问题。JdbcTemplate是一个非常简单实用的Java数据库操作工具,使用它进行数据操作可以提高开发效率,减少冗余代码的产生。