《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32

《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32

12.2.2 JdbcTemplate 应用于 Dao 层

虽然已经可以使用 JdbcTemplate 完成对数据的 CRUD 操作,但是目前的代码中有一个非常大的问题:与数据库操作相关的 API 应当集中到 Dao层的 API 中,而不是直接注入 Controller 层。所以下面要做的是将 JdbcTemplate 的使用移入 Dao 层。

模拟一个贴近真实开发环境的代码结构,新建一个 dao 包,并在其中创建一个接口 UserDao,声明 3 个方法。注意,这次只演示了保存操作和查列表、查单条数据的操作,并未涉及全部内容。

java 复制代码
public interface UserDao {
    void save(User user);
    User findById(Integer id);
    List<User> findAll();
}

紧接着是 UserDao 的实现类 UserDaoImpl,注意这个实现类上需要使用 @Repository 标注,该注解同样是 @Component 的派生注解,可以被Spring Boot 扫描到并注入进 IOC 容器。

java 复制代码
package com.yangjunbo.springboot.jdbc.exampleb;

import com.yangjunbo.springboot.jdbc.examplea.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void save(User user) {
        jdbcTemplate.update("insert into tbl_user (name, tel) values (?, ?)", user.getName(), user.getTel());
    }

    @Override
    public User findById(Integer id) {
        List<User> userList = jdbcTemplate.query("select * from tbl_user where id = ?", new BeanPropertyRowMapper<> (User.class), id);
        return userList.size() > 0 ? userList.get(0) : null;
    }

    @Override
    public List<User> findAll() {
        return jdbcTemplate.query("select * from tbl_user", new BeanPropertyRowMapper<>(User.class));
    }
}

最后在需要操作 tbl_user 表的位置注入 UserDao 即可,不需要再注入 JdbcTemplate 组件。

12.2.3 查询策略

1.queryForList

顾名思义,queryForList 方法的返回值一定是一个 List,借助 IDE 可以发现 JdbcTemplate 中有 7 个重载的 queryForList 方法,这些方法会根据是否传入 elementType 决定返回指定的类型还是 Map,注意 "指定的类型" 这个概念,只有当查询结果只有单列时才可以指定,否则会出现列数过多的异常。

在讲解 select 系列方法中已经介绍过指定类型的方法,代码展示了一个返回 Map<String, Object> 的查询示例,这种查询的方式通常在临时查询一批数据时使用。重新编译代码后访问 /test11 接口,浏览器中得到了数据,与预期相同。

java 复制代码
package com.yangjunbo.springboot.jdbc.examplea;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class JdbcTemplateController {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @GetMapping("/test1")
    public String test1() {
        System.out.println(jdbcTemplate);
        return "success";
    }

    @GetMapping("/test2")
    public String test2() {
        User user = new User();
        user.setName("heihei");
        user.setTel("200");
        int row = jdbcTemplate.update("insert into tbl_user (name, tel) values (?, ?)", user.getName(), user.getTel());
        return "success - " + row;
    }

    @GetMapping("/test3")
    public String test3() {
        User user = new User();
        user.setName("heihei");
        user.setTel("54321");
        int row = jdbcTemplate.update("update tbl_user set tel = ? where name = ?", user.getTel(), user.getName());
        return "success - " + row;
    }

    @GetMapping("/test4")
    public String test4() {
        int row = jdbcTemplate.update("delete from tbl_user where name = ?", "heihei");
        return "success - " + row;
    }

    @GetMapping("/test5")
    public List<User> test5() {
        List<User> userList = jdbcTemplate.query("select * from tbl_user", new BeanPropertyRowMapper<>(User.class));
        return userList;
    }

    @GetMapping("/test6")
    public List<User> test6() {
        List<User> userList = jdbcTemplate.query("select * from tbl_user where id > ?", new BeanPropertyRowMapper<>(User.class), 2);
        return userList;
    }

    @GetMapping("/test7")
    public User test7(int id) {
        User user = jdbcTemplate.queryForObject("select * from tbl_user where id = ?", new BeanPropertyRowMapper<>(User.class), id);
        return user;
    }

    @GetMapping("/test8")
    public User test8(int id) {
        List<User> userList = jdbcTemplate.query("select * from tbl_user where id = ?", new BeanPropertyRowMapper<>(User.class), id);
        User user = userList.size() > 0 ? userList.get(0) : null;
        return user;
    }

    @GetMapping("/test9")
    public User test9(int id) {
        User user = jdbcTemplate.queryForObject("select * from tbl_user where id = ?", User.class, id);
        return user;
    }

    @GetMapping("/test10")
    public Integer test10() {
        Integer count = jdbcTemplate.queryForObject("select count(*) from tbl_user", Integer.class);
        return count;
    }

    @GetMapping("/test11")
    public List<Map<String, Object>> test11() {
        List<Map<String, Object>> userList = jdbcTemplate.queryForList("select * from tbl_user where id > 3");
        return userList;
    }

}

返回 Map<String, Object> 结构的 queryForList 方法通常在项目开发中使用不多,但以笔者的工作经历来看,这个方法很适合用来临时查询一批数据,并对这些数据进行操作,由于 JdbcTemplate 只需要依赖数据源,因此使用 JdbcTemplate 处理临时的一次性工作非常顺手。

2.queryForMap

queryForMap 方法也是一个非常好理解的方法,这个系列的方法都会返回 Map<String,Object>。注意,这个方法只会返回一条数据,所以这个方法适用于查询单条数据的场景。代码提供了一个非常简单的 queryForMap 方法的使用。

有关 JdbcTemplate 的常用方式就介绍这些,在实际项目开发中 JdbcTemplate 使用频率不高,但就其本身而言,JdbcTemplate 不失为一个简单实用的 JDBC API,读者可以在恰当的场景中合理利用。

相关推荐
高频因子挖掘机1 小时前
股票 API 接入回测框架时最容易忽略的几个问题:复权、时间对齐与数据泄露
后端·github·api
wangbing11251 小时前
springboot应用关闭时触发动作
java·spring boot·后端
子兮曰5 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
全栈弄潮儿8 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
启观川8 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
paopaokaka_luck8 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
阿森_dev8 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
计算机毕业设计杰瑞8 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
一木 之林9 小时前
Dify学习笔记 01 · 平台入门与实战:部署、五类应用、RAG与MCP(第1-16集)
人工智能·笔记·学习·计算机视觉