SpringBoot-JdbcTemplate

SpringBoot-JdbcTemplate

  • 1.依赖引入
  • [2. 配置文件](#2. 配置文件)
  • [3. 配置文件读取初始化](#3. 配置文件读取初始化)
  • [4. JDBC-操作](#4. JDBC-操作)
    • [4.1 JDBC-操作 批量插入](#4.1 JDBC-操作 批量插入)
    • [4.2 JDBC-操作 批量更新](#4.2 JDBC-操作 批量更新)
    • [4.3 JDBC-操作 批量查询JdbcTemplate](#4.3 JDBC-操作 批量查询JdbcTemplate)
    • [4.4 JDBC-操作 批量查询NamedParameterJdbcTemplate](#4.4 JDBC-操作 批量查询NamedParameterJdbcTemplate)
    • [4.5 JDBC-操作 测试](#4.5 JDBC-操作 测试)
    • [4.6 库表关系类](#4.6 库表关系类)

1.依赖引入

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId> <!-- 这里以MySQL为例,其他数据库请根据需求配置 -->
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
            <scope>runtime</scope>
        </dependency>

2. 配置文件

bash 复制代码
jdbc.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/evo_des?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&autoReconnectForPools=true&serverTimezone=UTC
spring.datasource.username=mysql
spring.datasource.password=N7EudjzMN0W2.DO
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3. 配置文件读取初始化

java 复制代码
/**
 * @author 303
 * @describe:
 * @date 2026/3/27
 */
@Configuration
@ComponentScan
@PropertySource("classpath:jdbc.properties")
public class Config {

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }

    @Bean
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
        return new NamedParameterJdbcTemplate(dataSource());
    }

}

4. JDBC-操作

4.1 JDBC-操作 批量插入

java 复制代码
    /**
     * 使用 jdbcTemplate,批量保存
     */
    private static int[] batchSave(List<WisCommomRelation> datas,String tabName,JdbcTemplate jdbcTemplate) {
        if(CollUtil.isEmpty(datas) || StringUtils.isEmpty(tabName)){
            return new int[]{0};
        }
        String sql = "INSERT INTO "+tabName+"(third_id, icc_id) VALUES(?, ?)";
        try {
            return   jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setString(1, datas.get(i).getThird_id());
                    ps.setString(2, datas.get(i).getIcc_id());
                }
                @Override
                public int getBatchSize() {
                    return datas.size();
                }
            });

        } catch (DataAccessException e) {
//            logger.error("jdbcTemplate.batchSavePerson error,", e);
            throw new RuntimeException("批量保存"+tabName+"失败", e);
        }
    }

4.2 JDBC-操作 批量更新

java 复制代码
    private static int[] batchUpdate(List<WisDataCache> datas,String tabName,JdbcTemplate jdbcTemplate) {
        if(CollUtil.isEmpty(datas) || StringUtils.isEmpty(tabName)){
            return new int[]{0};
        }
        String sql = "UPDATE wis_data_cache SET key_val =? WHERE key_name =? ";
        try {
            return   jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setString(1, datas.get(i).getKey_val());
                    ps.setString(2, datas.get(i).getKey_name());
                }
                @Override
                public int getBatchSize() {
                    return datas.size();
                }
            });

        } catch (DataAccessException e) {
//            logger.error("jdbcTemplate.batchSavePerson error,", e);
            throw new RuntimeException("批量更新"+tabName+"失败", e);
        }
    }

4.3 JDBC-操作 批量查询JdbcTemplate

java 复制代码
    /**
     * 使用 jdbcTemplate,查询列表
     */
    private static List<DataType> findByCondition(String thirdId, String iccId,List<String> thirdIds,String tabName, JdbcTemplate jdbcTemplate) {
        if( StringUtils.isEmpty(tabName)){
            return new ArrayList<>();
        }
        String sql = "SELECT third_id,icc_id FROM "+tabName+" WHERE 1=1";
        if(StringUtils.isNotEmpty(tabName) && tabName.equals("wis_data_cache")){
            sql = " SELECT key_name,key_val FROM wis_data_cache WHERE 1=1";
        }
        //构造一个集合存放所有的条件
        List<Object> params = new ArrayList<>();
//        Map<String, Object> params = new HashMap<>();

        if(StringUtils.isNotEmpty(thirdId)) {
            sql += " AND third_id = ?";
            params.add( thirdId);
        }
        if(StringUtils.isNotEmpty(iccId)) {
            sql += " AND icc_id = ?";
            params.add( iccId);
        }
        if(CollUtil.isNotEmpty(thirdIds)) {
            String inSql = String.join(",", Collections.nCopies(thirdIds.size(), "?"));
            sql += String.format(" AND third_id in ( %s )", inSql);
            params.addAll(thirdIds);
        }
        try {
            if(tabName.equals(TAB_NAME_DATA_CACHE)){
                return  jdbcTemplate.query(sql, params.toArray(),
                        (rs, rowNum) -> new WisDataCache(rs.getString("key_name"), rs.getString("key_val")));
            }else{
                return  jdbcTemplate.query(sql, params.toArray(),
                        (rs, rowNum) -> new WisCommomRelation(rs.getString("third_id"), rs.getString("icc_id")));
            }

        } catch (DataAccessException e) {
//            logger.error("jdbcTemplate.条件查询人员关系失败", e);
            throw new RuntimeException("条件查询"+tabName+"失败", e);
        }
    }

4.4 JDBC-操作 批量查询NamedParameterJdbcTemplate

java 复制代码
    private static final RowMapper<WisCommomRelation> COMMON_ROW_MAPPER = (rs, rowNum) -> new WisCommomRelation(rs.getString("third_id"),rs.getString("icc_id"));


    /**
     * 使用 NamedParameterJdbcTemplate,查询列表
     */
    private List<WisCommomRelation> findPersonByCondition(String thirdId, String iccId,List<String> thirdIds, NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
        String sql = "SELECT third_id,icc_id FROM wis_person WHERE 1=1";

        Map<String, Object> params = new HashMap<>();

        if(StringUtils.isNotEmpty(thirdId)) {
            sql += " AND third_id = :thirdId";
            params.put("thirdId", thirdId);
        }
        if(StringUtils.isNotEmpty(iccId)) {
            sql += " AND edu_person_id = :iccId";
            params.put("iccId", iccId);
        }
        if(CollUtil.isNotEmpty(thirdIds)) {
            sql += " AND third_id in ( :thirdIds )";
            params.put("thirdIds",thirdIds);
        }
        try {
            return namedParameterJdbcTemplate.query(sql, params,COMMON_ROW_MAPPER);
        } catch (DataAccessException e) {
//            logger.error("jdbcTemplate.条件查询人员关系失败", e);
            throw new RuntimeException("条件查询人员关系失败", e);
        }
    }

4.5 JDBC-操作 测试

java 复制代码
    private static final String TAB_NAME_PERSON = "wis_person1";
    private static final String TAB_NAME_ORG = "wis_org1";
    private static final String TAB_NAME_DATA_CACHE = "wis_data_cache";
    private static final Integer COLLECTION_CUT_SIZE = 10000;//集合切分大小
//    private static final Integer SQL_QUERY_IN_SIZE = 10000;//SQL集合查询in最大值
    private static final Integer SQL_QUERY_IN_SIZE = 100;//SQL集合查询in最大值

    public static void main(String[] args) {
            ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
            JdbcTemplate jdbcTemplate = ac.getBean(JdbcTemplate.class);
        NamedParameterJdbcTemplate namedParameterJdbcTemplate = ac.getBean(NamedParameterJdbcTemplate.class);
        List<DataType> dataTypeList = findByCondition("","",new ArrayList<>(),TAB_NAME_DATA_CACHE,jdbcTemplate);
        List<WisDataCache> updateWisDataCacheList = new ArrayList<>();
       List<WisCommomRelation> orgRelationList = new ArrayList<>();
       List<String> orgIdList = new ArrayList<>();
        if(CollUtil.isNotEmpty(dataTypeList)){
            for (int i = 0; i < dataTypeList.size(); i++) {
                DataType dataType =  dataTypeList.get(i);
                 if(dataType instanceof WisDataCache){
                     WisDataCache tempWisDataCache = (WisDataCache) dataType;
                    if(tempWisDataCache.getKey_name().equals("key")){
                        tempWisDataCache.setKey_val(RandomUtil.randomString(5));
                    }
                     if(tempWisDataCache.getKey_name().equals("orgIdMap")){
                        Map<String,Object> orgMap = JSONObject.parseObject(tempWisDataCache.getKey_val());
                         for(String key:orgMap.keySet()){
                             orgIdList.add(key);
                             WisCommomRelation org = new WisCommomRelation();
                             org.setIcc_id(orgMap.getOrDefault(key,"0").toString());
                             org.setThird_id(key);
                             orgRelationList.add(org);
                         }
                     }
                     updateWisDataCacheList.add(tempWisDataCache);
                 }

            }
//            atchUpdate(List<WisDataCache> datas,String tabName,JdbcTemplate jdbcTemplate)
            int[]  updateResult =  batchUpdate(updateWisDataCacheList,TAB_NAME_DATA_CACHE, jdbcTemplate);
            System.out.println("batchUpdate:"+ JSONObject.toJSONString(updateResult));
        }

        List<DataType> dataTypeOrgList = findByCondition("","",orgIdList,TAB_NAME_ORG,jdbcTemplate);
        if(CollUtil.isNotEmpty(dataTypeOrgList)){
            orgRelationList = orgRelationList.stream().filter(e->!orgIdList.contains(e.getThird_id())).collect(Collectors.toList());
        }
        if(CollUtil.isNotEmpty(orgRelationList)){
            if(orgRelationList.size() > SQL_QUERY_IN_SIZE){
                List<List<WisCommomRelation>> cutorgRelationList =    cut(orgRelationList,SQL_QUERY_IN_SIZE);
                for (List<WisCommomRelation> cutList:cutorgRelationList){
                    batchSave(cutList,TAB_NAME_ORG,jdbcTemplate);
                    System.out.println("> 100 batchSaveOrgResult:"+ cutList.size());
                }
            }else{
                batchSave(orgRelationList,TAB_NAME_ORG,jdbcTemplate);
                System.out.println("< 100 batchSaveOrgResult:"+ orgRelationList.size());
            }
        }else{
            System.out.println("> 100 batchSaveOrgResult: null");
        }

    }

4.6 库表关系类

java 复制代码
    /**
     * @Description
     * @param: lists 要切割的集合
     * @param: sonSize 子集合长度
     * @Return java.util.List
     * @Exception
     */
    public static <T> List<List<T>> cut(List<T> lists, int sonSize) {
        final int copies = (lists.size() + sonSize - 1) / sonSize;
        List<List<T>> sonList = IntStream.range(0, copies)
                .boxed()
                .parallel()
                .map(i -> {
                    int fromIndex = i * sonSize;
                    int toIndex = sonSize;
                    if (i + 1 == lists.size()) {
                        toIndex = lists.size() - fromIndex;
                    }
                    return lists.stream().skip(fromIndex).limit(toIndex).collect(Collectors.toList());
                }).collect(Collectors.toList());
        return sonList;
    }

    private static interface DataType{}


    @lombok.Data
//    @Builder
    private static class WisCommomRelation implements DataType{

        private  String third_id;

        private  String icc_id;


        public WisCommomRelation() {
        }

        public WisCommomRelation(String third_id, String icc_id) {
            this.third_id = third_id;
            this.icc_id = icc_id;
        }

        public String getThird_id() {
            return third_id;
        }

        public void setThird_id(String third_id) {
            this.third_id = third_id;
        }

        public String getIcc_id() {
            return icc_id;
        }

        public void setIcc_id(String icc_id) {
            this.icc_id = icc_id;
        }
    }



    @Data
//    @Builder
    private static class WisDataCache implements DataType{

        private  String key_name;

        private  String key_val;

        public WisDataCache() {
        }

        public WisDataCache(String key_name, String key_val) {
            this.key_name = key_name;
            this.key_val = key_val;
        }

        public String getKey_name() {
            return key_name;
        }

        public void setKey_name(String key_name) {
            this.key_name = key_name;
        }

        public String getKey_val() {
            return key_val;
        }

        public void setKey_val(String key_val) {
            this.key_val = key_val;
        }
    }
相关推荐
进击的丸子4 分钟前
代理网络环境下 Linux Pro 在线激活实操指南
javascript·后端·安全
开开心心就好7 分钟前
本地文件搜索工具,双击Ctrl就能呼出搜索
java·服务器·前端·支持向量机·ffmpeg·音视频·模拟退火算法
独隅12 分钟前
Claude 高效使用指南深度评测
java·开发语言·claude·claude code
ByteCoder.19 分钟前
班前十分钟的清单,按体检引导单来写
java·服务器·前端·助播虾
海的透彻21 分钟前
如何让docker容器启动时用自定义的用户
java·docker·dubbo
疯狂学习GIS26 分钟前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能
GG.WinGel37 分钟前
质数数目(蓝桥杯练习题)
java·数据结构·算法·青少年编程·蓝桥杯
泡泡糖的中文规格书42 分钟前
HDLbits 2.2 学习笔记 · 多路复用器
java·开发语言
John_Hui1 小时前
第 3 篇:配置 JDK 17 环境
java·开发语言·ubuntu
秋天的怀念_David1 小时前
算法一千零一夜 · 第十七夜 长街点灯
java·程序人生·算法