本文介绍在几种典型情境中如何使用 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));
}