一、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<Map> 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
九、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
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数据库操作工具,使用它进行数据操作可以提高开发效率,减少冗余代码的产生。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/306501.html
 
 微信扫一扫
微信扫一扫  支付宝扫一扫
支付宝扫一扫 