Spring 5 JDBC 查询操作

2018-04-22  本文已影响0人  maxwellhertz

  本文介绍在几种典型情境中如何使用 Spring 5 JDBC 进行查询操作。
  在使用 Spring 提供的 JDBC 操作前要进行一些相关的配置,比如配置连接池、连接数据库等,此处不做介绍,可以参考网上的相关教程。另外,本文假设读者已经对 NamedParameterJdbcTemplate 和 JdbcTemplate 这两个类有基本了解。
  示例代码使用的数据库是 MySQL,用到的表 orders 的结构如下:

+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| order_num  | int(11)  | NO   | PRI | NULL    | auto_increment |
| order_date | datetime | NO   |     | NULL    |                |
| cust_id    | int(11)  | NO   | MUL | NULL    |                |
+------------+----------+------+-----+---------+----------------+

  示例代码中所有的查询都将结果包装成为一个对象:

//将查询结果包装为对象
public class Order {
    private int order_num;
    private int cust_id;
    private Timestamp order_date;
    
    public int getOrder_num() {
        return order_num;
    }
    public void setOrder_num(int order_num) {
        this.order_num = order_num;
    }
    public int getCust_id() {
        return cust_id;
    }
    public void setCust_id(int cust_id) {
        this.cust_id = cust_id;
    }
    public Timestamp getOrder_date() {
        return order_date;
    }
    public void setOrder_date(Timestamp order_date) {
        this.order_date = order_date;
    }
    @Override
    public String toString() {
        return "{order_num:" + order_num + ",order_date:" + order_date + ",cust_id:" + cust_id + "}";
    }
    
}

查询条件中具有不同个数的参数

参数只有一个

  查询指定客户的订单(假设该客户只有一条订单记录):

    //根据客户 id,查询该客户的订单
    public Order getOrder(int order_num) {
        //使用 NamedParameterJdbcTemplate
        NamedParameterJdbcTemplate namedTempl = new NamedParameterJdbcTemplate(dataSource);
        String sql = "SELECT order_num,order_date,cust_id FROM orders WHERE order_num = :order_num";
        Map<String,Integer> param = new HashMap<>(); 
        //将参数封装在 Map 中
        param.put("order_num", order_num);                
        return namedTempl.queryForObject(sql, param, BeanPropertyRowMapper.newInstance(Order.class));
    }

参数不止一个

  查询若干个时间点上的订单记录:

    public List<Order> getOrder(Date date1, Date date2) {
        //使用 JdbcTemplate
        JdbcTemplate templ = new JdbcTemplate(dataSource);
        String sql = "SELECT order_num,order_date,cust_id FROM orders "
                + "WHERE Date(order_date) IN (?,?)";
        //将参数放在 Object 数组中
        Object[] params = {start,end};
        return templ.query(sql, params, BeanPropertyRowMapper.newInstance(Order.class));
    }

  这种情况也可以使用 NamedParameterJdbcTemplate,但是需要多次调用 put 方法,这就不如直接把参数放入数组中方便。

查询结果返回的记录数目不同

结果只有一条记录

  查询指定客户在指定日期的订单:

    public Order getOrder(int cust_id, Date order_date) {
        JdbcTemplate templ = new JdbcTemplate(dataSource);
        String sql = "SELECT order_num,order_date,cust_id FROM orders "
                + "WHERE cust_id = ? AND Date(order_date) = ?";
        //将参数放在 Object 数组中
        Object[] params = {cust_id,order_date};
        //使用 queryForObject 方法
        return templ.queryForObject(sql, params, BeanPropertyRowMapper.newInstance(Order.class));
    }

结果不只一条记录

  查询若干个指定客户的订单:

    public List<Order> getOrder(int cust_id1, int cust_id2) {
        JdbcTemplate templ = new JdbcTemplate(dataSource);
        String sql = "SELECT order_num,order_date,cust_id FROM orders "
                + "WHERE cust_id IN (cust_id1, int cust_id2)";
        //将参数放在 Object 数组中
        Object[] params = {cust_id1,cust_id2};
        //使用 query 方法
        return templ.query(sql, params, BeanPropertyRowMapper.newInstance(Order.class));
    }
上一篇 下一篇

猜你喜欢

热点阅读