JAVA: шаблон JDBC queryForObject: включает пустые / пустые поля - PullRequest
0 голосов
/ 15 марта 2019

Запрос ниже работает без проблем, так как он имеет только один столбец, и я могу легко проверить, не является ли он пустым, и продолжить.

String query = "SELECT * FROM test WHERE ID=?";
Test test = template.queryForObject(query,new Object[]{id},
                                          new BeanPropertyRowMapper<>(Test.class));

Я создаю веб-страницу, и у меня есть требование, где мне нужнокак сгенерировать динамический queryForObject с только ненулевым столбцом в соответствии с пользовательским вводом, как я могу это сделать?

Например, на моей веб-странице, если у меня есть поля ввода в качестве идентификатора, имени и зарплаты, и если пользователь вводит только имя и идентификатори не вводит данные для зарплаты, он должен динамически генерировать ниже оператора выполнения

String query = "SELECT * FROM test WHERE ID=? and name=?" ;
Test test = template.queryForObject(query,new Object[]{id, name},
                                          new BeanPropertyRowMapper<>(Test.class));

1 Ответ

0 голосов
/ 16 марта 2019

это то, что вы ищете?быстрый и грязный способ.

import org.apache.commons.lang.StringUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.CollectionUtils;

import javax.sql.DataSource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class TestMe {
    private static DataSource dataSource = null;//@TODO please create datasource
    private static NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

    public static void main(String[] args) {
        String criterias = "id=123";
        //criterias = "id=123,name=test;
        //criterias = "id=123,name=test, salary=100.00";
        final List<String> criteriaList = createQeuryCriteriaList(criterias);
        Test test = getTest(criteriaList);
        System.out.println(test);
    }


    public static List<String> createQeuryCriteriaList(final String criterias) {
        final List<String> queryCriteriaList = new ArrayList<>();
        if (StringUtils.isNotEmpty(criterias)) {
            final String qryCriterias = criterias.replaceAll("[{}]", "");
            for (String criteria : qryCriterias.split(",")) {
                queryCriteriaList.add(criteria);
            }
        }
        return queryCriteriaList;
    }

    public static Test getTest(final List<String> criteriaList) {
        try {
            final MapSqlParameterSource namedParameters = new MapSqlParameterSource();
            final String qry = addCriteriasToQuery("SELECT * FROM test WHERE 1=1 ", criteriaList, namedParameters);
            return jdbcTemplate.queryForObject(qry, namedParameters, (resultSet, i) ->
                    new Test(resultSet.getLong("id"), resultSet.getString("name"),
                            resultSet.getBigDecimal("salary"))
            );
        } catch (EmptyResultDataAccessException emptyExp) {
            return null;
        }
    }

    private static String addCriteriasToQuery(final String query, final List<String> criteriaList,
                                              final MapSqlParameterSource namedParameters) {
        if (CollectionUtils.isEmpty(criteriaList)) {
            return query;
        }
        StringBuilder qryCriteria = new StringBuilder(query);
        for (String criteria : criteriaList) {
            final String[] keyValue = criteria.split("=");
            if (keyValue.length < 2) {
                continue;
            }
            final String key = keyValue[0].trim();
            final String value = keyValue[1];
            switch (key) {
                case "id":
                    qryCriteria.append(" AND id=:id");
                    namedParameters.addValue("id", value);
                    break;
                case "name":
                    qryCriteria.append(" AND name=:name");
                    namedParameters.addValue("name", value);
                    break;
                case "salary":
                    qryCriteria.append(" AND salary=:salary");
                    namedParameters.addValue("salary", value);
                    break;
                default:
                    System.out.println(String.format("Unknown criteria, Key:%s, Value:%s", key, value));
            }
        }
        return qryCriteria.toString();
    }

    static class Test {
        Long id;
        String name;
        BigDecimal salary;

        public Test(Long id, String name, BigDecimal salary) {
            this.id = id;
            this.name = name;
            this.salary = salary;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public BigDecimal getSalary() {
            return salary;
        }

        public void setSalary(BigDecimal salary) {
            this.salary = salary;
        }
    }
}

Примечание. Это просто пример кода, который может иметь проблемы с компиляцией или другие проблемы.

...