很多人一提到 springboot 操作数据库,就只想到 mybatis、jpa,其实在很多简单业务、小工具项目、后台管理模块里,根本没必要上重型框架。jdbctemplate 才是轻量、简单、开箱即用的神器,没有复杂配置、没有 xml、没有各种插件,几行代码就能完成增删改查,非常适合快速开发。
一、jdbctemplate 适合什么场景?
- 单表简单业务,不想写 mybatis xml/注解
- 微服务内部小模块、轻量接口
- 快速原型开发、临时数据处理
- 对 sql 可控,但又不想引入复杂 orm
优点:
- 极轻量,无额外依赖
- 直接写原生 sql,灵活直观
- 性能接近原生 jdbc,无损耗
- spring 自带,自动整合事务
二、引入依赖
只需要 web + jdbc + mysql 驱动即可:
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-jdbc</artifactid>
</dependency>
<dependency>
<groupid>com.mysql</groupid>
<artifactid>mysql-connector-j</artifactid>
<scope>runtime</scope>
</dependency>
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>三、application.yml 配置
和 mybatis 数据源配置完全一样:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useunicode=true&characterencoding=utf-8&servertimezone=asia/shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.driver不需要任何额外配置,启动项目自动装配 jdbctemplate。
四、建表 sql
create table `user` ( `id` bigint not null auto_increment, `username` varchar(50) default null, `age` int default null, `email` varchar(50) default null, `create_time` datetime default current_timestamp, primary key (`id`) ) engine=innodb default charset=utf8mb4;
五、实体类 user
package com.demo.entity;
import lombok.data;
import java.time.localdatetime;
@data
public class user {
private long id;
private string username;
private integer age;
private string email;
private localdatetime createtime;
}六、直接使用 jdbctemplate(最简洁方式)
jdbctemplate 常用方法:
- update():增、删、改
- queryforobject():查询单个对象
- query():查询列表
- batchupdate():批量操作
1. 新增
@autowired
private jdbctemplate jdbctemplate;
public int adduser(user user) {
string sql = "insert into user(username, age, email) values(?, ?, ?)";
return jdbctemplate.update(
sql,
user.getusername(),
user.getage(),
user.getemail()
);
}2. 删除
public int deletebyid(long id) {
string sql = "delete from user where id=?";
return jdbctemplate.update(sql, id);
}3. 修改
public int updateuser(user user) {
string sql = "update user set username=?, age=?, email=? where id=?";
return jdbctemplate.update(
sql,
user.getusername(),
user.getage(),
user.getemail(),
user.getid()
);
}4. 根据 id 查询单个对象
public user findbyid(long id) {
string sql = "select * from user where id=?";
return jdbctemplate.queryforobject(
sql,
new beanpropertyrowmapper<>(user.class),
id
);
}5. 查询列表
public list<user> findall() {
string sql = "select * from user";
return jdbctemplate.query(
sql,
new beanpropertyrowmapper<>(user.class)
);
}6. 带条件查询
public list<user> findbyage(integer age) {
string sql = "select * from user where age=?";
return jdbctemplate.query(
sql,
new beanpropertyrowmapper<>(user.class),
age
);
}7. 统计数量
public long count() {
string sql = "select count(*) from user";
return jdbctemplate.queryforobject(sql, long.class);
}8. 批量插入
public void batchadd(list<user> userlist) {
string sql = "insert into user(username, age, email) values(?,?,?)";
jdbctemplate.batchupdate(sql, new batchpreparedstatementsetter() {
@override
public void setvalues(preparedstatement ps, int i) throws sqlexception {
user user = userlist.get(i);
ps.setstring(1, user.getusername());
ps.setint(2, user.getage());
ps.setstring(3, user.getemail());
}
@override
public int getbatchsize() {
return userlist.size();
}
});
}七、封装成标准 service 层
@service
public class userservice {
@autowired
private jdbctemplate jdbctemplate;
// 新增
@transactional(rollbackfor = exception.class)
public boolean add(user user) {
string sql = "insert into user(username,age,email) values(?,?,?)";
return jdbctemplate.update(sql, user.getusername(), user.getage(), user.getemail()) > 0;
}
// 删除
@transactional
public boolean delete(long id) {
string sql = "delete from user where id=?";
return jdbctemplate.update(sql, id) > 0;
}
// 修改
@transactional
public boolean update(user user) {
string sql = "update user set username=?,age=?,email=? where id=?";
return jdbctemplate.update(sql,
user.getusername(),
user.getage(),
user.getemail(),
user.getid()) > 0;
}
// 根据id查询
public user findbyid(long id) {
string sql = "select * from user where id=?";
try {
return jdbctemplate.queryforobject(
sql,
new beanpropertyrowmapper<>(user.class),
id);
} catch (emptyresultdataaccessexception e) {
return null;
}
}
// 查询全部
public list<user> list() {
string sql = "select * from user";
return jdbctemplate.query(sql, new beanpropertyrowmapper<>(user.class));
}
}注意:queryforobject 查询不到会抛异常,必须 try-catch 处理。
八、controller 接口
@restcontroller
@requestmapping("/user")
public class usercontroller {
@autowired
private userservice userservice;
@postmapping("/add")
public result add(@requestbody user user) {
userservice.add(user);
return result.success("添加成功");
}
@deletemapping("/delete/{id}")
public result delete(@pathvariable long id) {
userservice.delete(id);
return result.success("删除成功");
}
@putmapping("/update")
public result update(@requestbody user user) {
userservice.update(user);
return result.success("修改成功");
}
@getmapping("/{id}")
public result findbyid(@pathvariable long id) {
return result.success(userservice.findbyid(id));
}
@getmapping("/list")
public result list() {
return result.success(userservice.list());
}
}九、jdbctemplate 事务支持
直接使用 @transactional 即可,和 mybatis 完全一致:
@transactional(rollbackfor = exception.class)
public void testtransaction() {
// 两次修改,要么都成功,要么都回滚
jdbctemplate.update("update user set age=20 where id=1");
int i = 1 / 0; // 模拟异常
jdbctemplate.update("update user set age=30 where id=2");
}十、jdbctemplate 与 mybatis 如何选择?
- 简单单表、快速开发 → jdbctemplate
- 复杂查询、多表关联、动态sql → mybatis
- 企业后台管理系统 → mybatis 更易维护
- 小接口、轻量服务 → jdbctemplate 更清爽
十一、注意事项
1. 查询不到数据报错queryforobject 无数据会抛异常,需要捕获 emptyresultdataaccessexception
2. 类型不匹配
数据库日期、数字类型要与实体类对应
3. sql 注入风险
必须使用 ? 占位符,不要字符串拼接
4. 批量操作性能
大量数据建议分批插入,避免一次过大
十二、总结
springboot 整合 jdbctemplate 可以说是最简单的数据层方案:
只需要引入 spring-boot-starter-jdbc,自动装配,直接写 sql 就能完成所有操作。
没有配置、没有 xml、没有学习成本,非常适合小项目、快速开发场景,也是 spring 生态最原生的数据访问方式。
以上就是springboot整合jdbctemplate快速开发数据访问层的详细内容,更多关于springboot jdbctemplate数据访问层的资料请关注代码网其它相关文章!
发表评论