SpringBoot项目使用JdbcTemplate
JdbcTemplate介绍
我们都知道使用原始的JDBC在操作数据库是比较麻烦的,所以Spring为了提高开发的效率,顺带着就把JDBC封装、改造了一番,而JdbcTemplate就是Spring对原始JDBC封装之后提供的一个操作数据库的工具类。
我们可以借助JdbcTemplate来完成所有数据库操作,比如:增删改查等。
JdbcTemplate主要提供以下三种类型的方法:
- executeXxx() : 执行任何SQL语句,对数据库、表进行新建、修改、删除操作
- updateXxx() : 执行新增、修改、删除等语句
- queryXxx() : 执行查询相关的语句
JdbcTemplate算是最简单的数据持久层方案,实际开发过程中,我们会使用mybatis、hibernate、jpa等持久化框架。
与JdbcTemplate类似的还有NamedParameterJdbcTemplate。
SpringBoot使用JdbcTemplate
添加相关的依赖
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
application.yml中hikari数据源配置
server:
port: 9999
spring:
datasource:
#通用配置
driver-class-name: com.mysql.jdbc.Driver
password: root
username: root
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false
#数据源连接池配置
hikari:
minimum-idle: 10
maximum-pool-size: 20
idle-timeout: 500000
max-lifetime: 540000
connection-timeout: 60000
connection-test-query: select 1
只要配置了数据源就会自动注入JdbcTemplate Bean。
注意:如果引入了jdbc starter,但是没有配置数据源,应用是起不来的,要么配置数据源,要么排除数据源的自动配置
测试验证
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testAddUser(){
//插入数据
jdbcTemplate.update("insert into tb_user(name, age) values (?, ?)", "张三", 20);
//插入返回主键
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
String addSql = "insert into tb_user(name, age) values (?, ?)";
PreparedStatement ps = connection.prepareStatement(addSql,PreparedStatement.RETURN_GENERATED_KEYS);
ps.setString(1, "李四");
ps.setInt(2, 43);
return ps;
}
}, keyHolder);
int keyId = keyHolder.getKey().intValue();
System.out.println("插入的数据Id = " + keyId);
//查询数据
List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from tb_user");
for(Map<String, Object> userInfo : mapList){
System.out.println("id = " + userInfo.get("id") + ", name = " + userInfo.get("name") + ", age = " + userInfo.get("age"));
}
}
}
NamedParameterJdbcTemplate
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)。
具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。
具名参数只在 NamedParameterJdbcTemplate 中得到支持。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Test
public void testAddUser() {
//插入数据
MapSqlParameterSource param = new MapSqlParameterSource();
param.addValue("name", "王五");
param.addValue("age", 25);
namedParameterJdbcTemplate.update("insert into tb_user(name, age) values (:name, :age)", param);
//插入返回主键
KeyHolder keyHolder = new GeneratedKeyHolder();
MapSqlParameterSource param1 = new MapSqlParameterSource();
param1.addValue("name", "李白");
param1.addValue("age", 28);
namedParameterJdbcTemplate.update("insert into tb_user(name, age) values (:name, :age)", param1, keyHolder);
int keyId = keyHolder.getKey().intValue();
System.out.println("插入的数据Id = " + keyId);
//查询数据
List<Map<String, Object>> mapList = namedParameterJdbcTemplate.queryForList("select * from tb_user", new HashMap());
for (Map<String, Object> userInfo : mapList) {
System.out.println("id = " + userInfo.get("id") + ", name = " + userInfo.get("name") + ", age = " + userInfo.get("age"));
}
}
}
标签:
SpringBoot
, JdbcTemplate
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY