zoukankan      html  css  js  c++  java
  • SpringBoot 数据篇之使用JDBC

    SpringBootTutorial :: Data :: Jdbc

    简介

    Spring Data 包含对 JDBC 的存储库支持,并将自动为 CrudRepository 上的方法生成 SQL。对于更高级的查询,提供了 @Query 注解。

    当 classpath 上存在必要的依赖项时,Spring Boot 将自动配置 Spring Data 的 JDBC 存储库。它们可以通过 spring-boot-starter-data-jdbc 的单一依赖项添加到项目中。如有必要,可以通过将 @EnableJdbcRepositories 批注或 JdbcConfiguration 子类添加到应用程序来控制 Spring Data JDBC 的配置。

    更多 Spring Data JDBC 细节,可以参考 Spring Data JDBC 官方文档

    API

    spring-boot-starter-data-jdbc 引入了 spring-jdbc ,其 JDBC 特性就是基于 spring-jdbc

    spring-jdbc 最核心的 API 无疑就是 JdbcTemplate,可以说所有的 JDBC 数据访问,几乎都是围绕着这个类去工作的。

    Spring 对数据库的操作在 Jdbc 层面做了深层次的封装,利用依赖注入,把数据源配置装配到 JdbcTemplate 中,再由 JdbcTemplate 负责具体的数据访问。

    JdbcTemplate 主要提供以下几类方法:

    • execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句;
    • update 方法及 batchUpdate 方法:update 方法用于执行新增、修改、删除等语句;batchUpdate 方法用于执行批处理相关语句;
    • query 方法及 queryForXXX 方法:用于执行查询相关语句;
    • call 方法:用于执行存储过程、函数相关语句。

    为了方便演示,以下增删改查操作都围绕一个名为 user 的表(该表的主键 id 是自增序列)进行,该表的数据实体如下:

    public class User {
        private Integer id;
        private String name;
        private Integer age;
    
        // 省略 getter/setter
    }
    

    数据实体只要是一个纯粹的 Java Bean 即可,无需任何注解修饰。

    execute

    使用 execute 执行 DDL 语句,创建一个名为 test 的数据库,并在此数据库下新建一个名为 user 的表。

    public void recreateTable() {
        jdbcTemplate.execute("DROP DATABASE IF EXISTS test");
        jdbcTemplate.execute("CREATE DATABASE test");
        jdbcTemplate.execute("USE test");
        jdbcTemplate.execute("DROP TABLE if EXISTS user");
        jdbcTemplate.execute("DROP TABLE if EXISTS user");
        // @formatter:off
        StringBuilder sb = new StringBuilder();
        sb.append("CREATE TABLE user (id int (10) unsigned NOT NULL AUTO_INCREMENT,
    ")
            .append("name varchar (64) NOT NULL DEFAULT '',
    ")
            .append("age tinyint (3) NOT NULL DEFAULT 0,
    ")
            .append("PRIMARY KEY (ID));
    ");
        // @formatter:on
        jdbcTemplate.execute(sb.toString());
    }
    

    update

    新增数据

    public void insert(String name, Integer age) {
        jdbcTemplate.update("INSERT INTO user(name, age) VALUES(?, ?)", name, age);
    }
    

    删除数据

    public void delete(String name) {
        jdbcTemplate.update("DELETE FROM user WHERE name = ?", name);
    }
    

    修改数据

    public void update(User user) {
        jdbcTemplate.update("UPDATE USER SET name=?, age=? WHERE id=?", user.getName(), user.getAge(), user.getId());
    }
    

    批处理

    public void batchInsert(List<User> users) {
        String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
    
        List<Object[]> params = new ArrayList<>();
    
        users.forEach(item -> {
            params.add(new Object[] {item.getName(), item.getAge()});
        });
        jdbcTemplate.batchUpdate(sql, params);
    }
    

    query

    查单个对象

    public User queryByName(String name) {
        try {
            return jdbcTemplate
                .queryForObject("SELECT * FROM user WHERE name = ?", new BeanPropertyRowMapper<>(User.class), name);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
    

    查多个对象

    public List<User> list() {
        return jdbcTemplate.query("select * from USER", new BeanPropertyRowMapper(User.class));
    }
    

    获取某个记录某列或者 count、avg、sum 等函数返回唯一值

    public Integer count() {
        try {
            return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
    

    实战

    配置数据源

    src/main/resource 目录下添加 application.properties 配置文件,内容如下:

    spring.datasource.url = jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
    spring.datasource.username = root
    spring.datasource.password = root
    spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
    

    需要根据实际情况,替换 urlusernamepassword

    注入 JdbcTemplate

    @Service
    public class UserDAOImpl implements UserDAO {
    
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public UserDAOImpl(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
        
        // ...
    }
    

    完整示例

    请参考:源码

    使用方法:

    运行应用或单元测试例前,请先执行 codes/data/sbe-data-jdbc/sql/ddl.sql

    引申和引用

    引申

    参考

  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/jingmoxukong/p/10251451.html
Copyright © 2011-2022 走看看