我正在使用 spring mvc 并创建了 CRUD 功能。但我想创建一个搜索功能,允许我通过任何参数(变量)作为“用户 ID”或“用户名”或“姓氏”或“社会保险号”或其他任何参数来查找用户。
我的用户 ID 是整数类型。
我怎样才能做到这一点?对此的 SQL 查询是什么?
如何检查输入是整数还是字符串,然后通过给定参数遍历数据库并搜索用户?
我正在使用 spring mvc 并创建了 CRUD 功能。但我想创建一个搜索功能,允许我通过任何参数(变量)作为“用户 ID”或“用户名”或“姓氏”或“社会保险号”或其他任何参数来查找用户。
我的用户 ID 是整数类型。
我怎样才能做到这一点?对此的 SQL 查询是什么?
如何检查输入是整数还是字符串,然后通过给定参数遍历数据库并搜索用户?
如果您使用 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 示例中所示。