jdbctemplate那些事

本文通过具体实例介绍了使用JdbcTemplate进行数据库操作的方法,包括创建表、插入数据及查询等基本操作,并对比了其与MyBatis或JPA的区别。

由于要写个测试例程,方便起见用了内存数据库。
由于数据库操作及其简单就决定用jdbctemplate得了。
然后就是:和mybatis或者jpa比起来真的好难用。-.-~    

我们来看jdbctemplate的建表、增、查。

建表

jdbcTemplate.execute("DROP TABLE IF EXISTS useinfo");
        jdbcTemplate.execute("CREATE TABLE useinfo(id SERIAL, cardNo VARCHAR(255), boxNo int(3))"); 
建表没啥好说的。

插入

jdbcTemplate.update("insert into useinfo(cardNo, boxNo) values(?, ?)", "1541819172", ""+ 6);
注意,必须是update方法。字符串填充也是很常规的。

查询

jdbcTemplate.query("select * from useinfo where cardNo=?", new Object[] {req.getCardNo()},
                        new RowCallbackHandler() {
                            @Override
                            public void processRow(ResultSet res) throws SQLException {
                                System.out.println(res.getString("cardNo"));
                            }
                        }); 
是不是最后还有个回调参数,所以此处字符串填充必须是Object[] {}方式。
此处的RowCallbackHandler回调是不需要调用res.next()方法的。
但是,ResultSetExtractor的话必须先调用next方法做好准备,方可去数据。
还有,获取数据时的column参数竟然是从1开始算起的,是从1,竟然不是0,简直大逆不道。

jdbctemplate肯定是没框架便利的。
<think>我们正在处理一个关于JdbcTemplate的查询。用户希望了解JdbcTemplate使用教程和常见问题。根据提供的引用,我们可以总结出以下信息: 引用[1]展示了如何创建JdbcTemplate对象:需要设置数据源(DataSource)。 引用[2]指出JdbcTemplate位于org.springframework.jdbc.core包中,并提到它提供了务和异常控制。 引用[3]给出了一个使用JdbcTemplate执行查询的例子:使用query方法,并传递SQL语句、参数和一个RowMapper。 引用[4]详细介绍了JdbcTemplate的五类方法:execute、update/batchUpdate、query/queryForXXX、call。 引用[5]展示了如何使用Druid连接池创建数据源,这是一个工具类,用于获取数据库连接。 基于以上信息,我们可以组织回答如下: 1. 介绍JdbcTemplate及其作用。 2. 如何配置JdbcTemplate(包括数据源的设置)。 3. JdbcTemplate的主要方法及其使用示例(包括更新、查询等)。 4. 常见问题及注意项。 由于引用中提到了RowMapper、NamedParameterJdbcTemplate以及Druid连接池的使用,我们也可以在回答中适当提及。 注意:回答中需要引用时,在引用内容末尾添加引用标识,如[^1]。</think>### JdbcTemplate 使用教程与常见问题 #### 一、基本配置与初始化 1. **添加依赖** 需在项目中引入Spring JDBC依赖(如Maven): ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.12</version> </dependency> ``` 2. **配置数据源** 使用连接池(如Druid)创建`DataSource`: ```java // 引用Druid配置示例[^5] Properties properties = new Properties(); properties.load(JdbcUtils.class.getResourceAsStream("druid.properties")); DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); ``` 3. **初始化JdbcTemplate** 将数据源注入JdbcTemplate: ```java // 引用基础配置[^1][^2] JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); // 必须设置数据源 ``` --- #### 二、核心方法使用教程 1. **更新操作(INSERT/UPDATE/DELETE)** 使用`update()`方法执行写操作: ```java // 删除示例 String sql = "DELETE FROM users WHERE id = ?"; int rows = jdbcTemplate.update(sql, 1001); // 返回受影响行数 ``` 2. **查询操作(SELECT)** - **单行查询**:`queryForObject()` ```java String sql = "SELECT name FROM users WHERE id = ?"; String name = jdbcTemplate.queryForObject(sql, String.class, 1001); ``` - **多行查询**:`query()` + `RowMapper` ```java // 引用查询示例[^3] List<User> users = jdbcTemplate.query( "SELECT * FROM users WHERE password LIKE ?", new BeanPropertyRowMapper<>(User.class), "%g%" ); ``` 3. **批处理操作** 使用`batchUpdate()`提升批量操作效率: ```java jdbcTemplate.batchUpdate( "INSERT INTO orders(product_id, quantity) VALUES(?, ?)", List.of(new Object[]{101, 5}, new Object[]{203, 2}) // 批量参数 ); ``` --- #### 三、常见问题解决方案 1. **空结果集异常** **问题**:`queryForObject()`查询无结果时抛出`EmptyResultDataAccessException` **解决**:改用`query()`返回List判断空值 ```java List<User> result = jdbcTemplate.query(sql, rowMapper, params); if (!result.isEmpty()) return result.get(0); ``` 2. **SQL注入风险** **问题**:拼接SQL导致安全漏洞 **解决**:始终使用预编译参数`?`,避免字符串拼接: ```java // 错误写法: "SELECT * FROM users WHERE name='" + input + "'" // 正确写法: jdbcTemplate.query("SELECT * FROM users WHERE name = ?", rowMapper, input); ``` 3. **类型转换错误** **问题**:`queryForInt()`等过时方法易引发类型异常 **解决**: - 使用`queryForObject(sql, Integer.class)`替代旧版`queryForInt()`[^4] - 或通过`RowMapper`映射包装类型(如`Integer`代替`int`) 4. **命名参数支持** **问题**:`?`占位符在复杂SQL中可读性差 **解决**:使用`NamedParameterJdbcTemplate`(扩展包): ```java Map<String, Object> params = new HashMap<>(); params.put("email", "user@example.com"); namedTemplate.query("SELECT * FROM users WHERE email = :email", params, rowMapper); ``` --- #### 四、性能优化建议 1. **重用JdbcTemplate实例** 单例模式创建,避免重复初始化开销[^2]。 2. **批处理大数据量** 优先用`batchUpdate()`代替循环单条更新。 3. **连接池调优** 通过`DataSource`配置最大连接数(如Druid的`maxActive=50`)[^5]。 > 引用说明: > 配置方法参考[^1][^2];查询操作示例[^3];方法分类说明[^4];连接池工具类[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值