
com.github.edgar615.util.spring.jdbc.JdbcImpl Maven / Gradle / Ivy
package com.github.edgar615.util.spring.jdbc;
import com.google.common.base.Joiner;
import com.github.edgar615.util.base.MorePreconditions;
import com.github.edgar615.util.base.StringUtils;
import com.github.edgar615.util.db.Jdbc;
import com.github.edgar615.util.db.Persistent;
import com.github.edgar615.util.db.SQLBindings;
import com.github.edgar615.util.db.SqlBuilder;
import com.github.edgar615.util.search.Example;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.sql.DataSource;
/**
* Created by Edgar on 2017/8/8.
*
* @author Edgar Date 2017/8/8
*/
public class JdbcImpl implements Jdbc {
private final DataSource dataSource;
public JdbcImpl(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void insert(Persistent persistent) {
SQLBindings sqlBindings = SqlBuilder.insert(persistent);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(sqlBindings.sql(), sqlBindings.bindings().toArray());
}
@Override
public void insertAndGeneratedKey(Persistent persistent) {
SQLBindings sqlBindings = SqlBuilder.insert(persistent);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
connection -> {
PreparedStatement ps
= connection.prepareStatement(sqlBindings.sql(),
new String[]{StringUtils.underscoreName(
persistent.primaryField())}
);
int i = 1;
for (Object arg : sqlBindings.bindings()) {
ps.setObject(i++, arg);
}
return ps;
},
keyHolder);
persistent.setGeneratedKey(keyHolder.getKey());
}
@Override
public > int deleteById(Class elementType, ID id) {
SQLBindings sqlBindings = SqlBuilder.deleteById(elementType, id);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate.update(sqlBindings.sql(), sqlBindings.bindings().toArray());
}
@Override
public > int deleteByExample(Class elementType,
Example example) {
example = removeUndefinedField(elementType, example);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
SQLBindings sqlBindings = SqlBuilder.whereSql(example.criteria());
String tableName = StringUtils.underscoreName(elementType.getSimpleName());
String sql = "delete from "
+ tableName;
if (!example.criteria().isEmpty()) {
sql += " where " + sqlBindings.sql();
}
return jdbcTemplate.update(sql, sqlBindings.bindings().toArray());
}
@Override
public int updateById(Persistent persistent,
Map addOrSub,
List nullFields, ID id) {
boolean noUpdated = persistent.toMap().values().stream()
.allMatch(v -> v == null);
boolean noAddOrSub = addOrSub.keySet().stream()
.allMatch(v -> !persistent.fields().contains(v));
boolean noNull = nullFields.stream()
.allMatch(v -> !persistent.fields().contains(v));
if (noUpdated && noAddOrSub && noNull) {
return 0;
}
SQLBindings sqlBindings = SqlBuilder.updateById(persistent, addOrSub, nullFields, id);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate.update(sqlBindings.sql(), sqlBindings.bindings().toArray());
}
@Override
public int updateByExample(Persistent persistent,
Map addOrSub,
List nullFields,
Example example) {
//对example做一次清洗,将表中不存在的条件删除,避免频繁出现500错误
example = example.removeUndefinedField(persistent.fields());
Map map = persistent.toMap();
List columns = new ArrayList<>();
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy