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;
}
}