0

我正在使用 spring mvc 并创建了 CRUD 功能。但我想创建一个搜索功能,允许我通过任何参数(变量)作为“用户 ID”或“用户名”或“姓氏”或“社会保险号”或其他任何参数来查找用户。

我的用户 ID 是整数类型。

我怎样才能做到这一点?对此的 SQL 查询是什么?

如何检查输入是整数还是字符串,然后通过给定参数遍历数据库并搜索用户?

4

1 回答 1

1

如果您使用 Hibernate 进行数据访问,您可以使用标准 API 轻松创建通用查找器:

抽象 DAO 类:

public abstract class AbstractHibernateDAO<T> {

    private static final String PARAM_VALUE_PARAMETER = "paramValue";

    private final Class<T> clazz;

    @Autowired
    private SessionFactory sessionFactory;

    public AbstractHibernateDAO(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T findOne(String paramName, Object paramValue) {
        Session session = sessionFactory.getCurrentSession();

        @SuppressWarnings("unchecked")
        T fetchedObject = (T) session.createCriteria(clazz).add(Restrictions.eq(paramName, paramValue)).uniqueResult();

        return fetchedObject;
    }

    // Other CRUD methods.

}

实体的具体 DAO 类:

@Repository
@Transactional
public class ProductHibernateDAO extends AbstractHibernateDAO<Product> {

    public ProductHibernateDAO() {
        super(Product.class);
    }

}

或者,如果您更喜欢使用 HQL 而不是 Criteria API,您可以将搜索方法重写为:

public T findOne(String paramName, Object paramValue) {
    Session session = sessionFactory.getCurrentSession();

    StringBuilder queryText = new StringBuilder();

    queryText.append("from ");
    queryText.append(clazz.getSimpleName());
    queryText.append(" where ");
    queryText.append(paramName);
    queryText.append("=:");
    queryText.append(PARAM_VALUE_PARAMETER);

    @SuppressWarnings("unchecked")
    T fetchedObject = (T) session.createQuery(queryText.toString()).setParameter(PARAM_VALUE_PARAMETER, paramValue).uniqueResult();

    return fetchedObject;
}

在本文中,您可以找到很好的描述如何使用 hibernate 创建通用 DAO(或者,如果您更喜欢 JPA,还描述了如何使用 JPA 执行此操作)。

或者,如果您更喜欢使用 JDBC 进行数据访问,我建议您查看 Spring 的 JdbcTemplate。它大大简化了开发。在这里,您如何使用 JdbcTemplate 实现通用查找器:

@Repository
@Transactional
public class ProductJDBCDAO implements DAO<Product> {

    private static final String TABLE_NAME = "product";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Product findOne(String paramName, Object paramValue) {
        RowMapper<Product> rowMapper = new RowMapper<Product>(){

            public Product mapRow(ResultSet rs, int rowNum) throws SQLException {

                long productId = rs.getLong("product_id");
                // Other properties

                Product product = new Product(...);

                return product;
            }

        };

        StringBuilder queryText = new StringBuilder();
        queryText.append("select * from ");
        queryText.append(TABLE_NAME);
        queryText.append(" where ");
        queryText.append(paramName);
        queryText.append("=?");

        Product fetchedObject = jdbcTemplate.queryForObject(queryText.toString(), rowMapper, paramValue);

        return fetchedObject;
    }


    // Other CRUD methods
}

正如您在所有示例中看到的那样,您不需要显式指定参数类型,只需将其添加为 Object 参数。

如果您在这种情况下使用直接 JDBC,我建议您使用PreparedStatement及其setObject(..)方法。查询文本将类似于 JdbcTemplate 示例中所示。

于 2012-08-11T12:27:02.830 回答