当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合JdbcTemplate快速开发数据访问层

SpringBoot整合JdbcTemplate快速开发数据访问层

2026年04月03日 Java 我要评论
很多人一提到 springboot 操作数据库,就只想到 mybatis、jpa,其实在很多简单业务、小工具项目、后台管理模块里,根本没必要上重型框架。jdbctemplate 才是轻量、简单、开箱即

很多人一提到 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数据访问层的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com