Spring Boot 整合 JdbcTemplate(持久层)

持久层:JdbcTemplate / mybatis

JdbcTemplate 是 Spring ⾃带的 JDBC 模版组件,底层实现了对 JDBC 的封装,⽤法与 MyBatis 类似,需要开发者⾃定义 SQL 语句,JdbcTemplate 帮助我们完成数据库的连接,SQL 执⾏,结果集的封装。

不⾜之处是灵活性不如 MyBatis,因为 MyBatis 的 SQL 语句定义在 XML 中,更有利于维护和扩展,JdbcTemplate 以硬编码的⽅式将 SQL 直接写在 Java 代码中,不利于扩展维护。

1、pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.southwind</groupId>
    <artifactId>springbootdao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
    </parent>
    <dependencies>
        <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>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

2、创建实体类

java 复制代码
package com.southwind.entity;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
}

3、创建 UserRepository

java 复制代码
package com.southwind.repository;

import com.southwind.entity.User;
import java.util.List;

public interface UserRepository {
    public List<User> findAll();
    public User findById(Integer id);
    public int save(User user);
    public int update(User user);
    public int deleteById(Integer id);
}

4、创建实现类

java 复制代码
package com.southwind.repository.impl;

import com.southwind.entity.User;
import com.southwind.repository.UserRepository;
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 UserRepositoryImpl implements UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

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

    @Override
    public User findById(Integer id) {
        return jdbcTemplate.queryForObject(
                "select * from t_user where id = ?",
                new Object[]{id},
                new BeanPropertyRowMapper<>(User.class)
        );
    }

    @Override
    public int save(User user) {
        return jdbcTemplate.update(
                "insert into t_user(username,password,age) values (?,?,?)",
                user.getUsername(),
                user.getPassword(),
                user.getAge()
        );
    }

    @Override
    public int update(User user) {
        return jdbcTemplate.update(
                "update t_user set username = ?,password = ?,age = ? where id = ?",
                user.getUsername(),
                user.getPassword(),
                user.getAge(),
                user.getId()
        );
    }

    @Override
    public int deleteById(Integer id) {
        return jdbcTemplate.update(
                "delete from t_user where id = ?",
                id
        );
    }
}

5、Handler

java 复制代码
package com.southwind.controller;

import com.southwind.entity.User;
import com.southwind.repository.impl.UserRepositoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserHandler {

    @Autowired
    private UserRepositoryImpl userRepository;

    @GetMapping("/findAll")
    public List<User> findAll() {
        return userRepository.findAll();
    }

    @GetMapping("/findById/{id}")
    public User findById(@PathVariable("id") Integer id) {
        return userRepository.findById(id);
    }

    @PostMapping("/save")
    public int save(@RequestBody User user) {
        return userRepository.save(user);
    }

    @PutMapping("/update")
    public int update(@RequestBody User user) {
        return userRepository.update(user);
    }

    @DeleteMapping("/deleteById/{id}")
    public int deleteById(@PathVariable("id") Integer id) {
        return userRepository.deleteById(id);
    }
}

query
query(String sql,RowMapper rowMapper)

RowMapper 是⼀个接⼝,作⽤是解析结果集,将 JDBC 查询出的 ResultSet 对象转换成对应的 POJO。
queryForObject(String sql,Object[] args,RowMapper rowMapper)
该⽅法⽤来查询⼀条数据,并将结果封装成⼀个 POJO。
update
增加、删除、修改的操作都可以调⽤个这个⽅法。

相关推荐
半桶水专家1 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴1 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
李慕婉学姐1 小时前
【开题答辩过程】以《“饭否”食材搭配指南小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring·小程序
码事漫谈1 小时前
AI编程规模化实践:从1到100的工程化之道
后端
码事漫谈1 小时前
AI编程:更适合0到1的创意爆发,还是1到100的精雕细琢?
后端
码事漫谈1 小时前
Python与C#:从哲学到细节的全面对比
后端
码事漫谈2 小时前
Python与C++:从哲学到细节的全面对比
后端
喵个咪2 小时前
基于 Go-Kratos 与 MCP 的推荐服务实战指南
后端·深度学习·微服务
abments2 小时前
pgsql timestamp without time zone > character varying解决方案
java