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;
        }
    }
相关推荐
码云社区2 小时前
JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP
java·开发语言·微信小程序·二手交易·闲置回收
crescent_悦2 小时前
C++:The Largest Generation
java·开发语言·c++
indexsunny2 小时前
互联网大厂Java面试实战:从Spring Boot到微服务的技术问答解析
java·spring boot·redis·微服务·消息队列·电商
Victor3563 小时前
MongoDB(72)如何创建用户和角色?
后端
Victor3563 小时前
MongoDB(71)如何启用MongoDB身份验证?
后端
想打游戏的程序猿3 小时前
工具与协议层——Agent 如何连接世界
后端·ai编程
希望永不加班3 小时前
SpringBoot 过滤器(Filter)与请求链路梳理
java·spring boot·后端·spring
Lyyaoo.3 小时前
【JAVA基础面经】抽象类/方法与接口
java·开发语言
0xDevNull3 小时前
Java实现Redis延迟队列:从原理到高可用架构
java·开发语言·后端