多表查询练习
程序员文章站
2022-05-09 09:25:48
...
建表
- 系统用户表 sys_user
- 客户详细信息表 customer
- 数据字典表 base_dict
说明
用户可以对多个客户信息进行管理,客户信息中的客户来源,客户所属行业等等信息从数据字典表中获取。
在项目定义的客户持久化类如下:
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
private Integer cust_id; // 客户编号
private String cust_name; // 客户名称
private Integer cust_user_id; // 负责人id
private Integer cust_create_id; // 创建人id
private String cust_source; // 客户信息来源
private String cust_industry; // 客户所属行业
private String cust_level; // 客户级别
private String cust_linkman; // 联系人
private String cust_phone; // 固定电话
private String cust_mobile; // 移动电话
private String cust_zipcode; // 邮政编码
private String cust_address; // 联系地址
private Date cust_createtime; // 创建时间
private Integer start; // 起始行
private Integer rows; // 所取行数
//getter and setter ...
}
需求
根据查询条件,分页查询某用户管理的客户信息
分析
dao接口中,定义方法:
List<Customer> selectCustomerList(Customer customer);
SQL语句:
第一部分
select
cust_id,
cust_name,
cust_user_id,
cust_create_id,
b.dict_item_name cust_source,
c.dict_item_name cust_industry,
d.dict_item_name cust_level,
cust_linkman,
cust_phone,
cust_mobile,
cust_createtime
指定查询的字段名,由于方法的返回值为Customer
列表,因此字段要和Customer
的属性名一样。
第二部分
FROM
customer a
LEFT JOIN
(
SELECT
dict_id,
dict_item_name
FROM
base_dict
WHERE
dict_type_code = '002'
) b ON a.cust_source = b.dict_id
LEFT JOIN (
SELECT
dict_id,
dict_item_name
FROM
base_dict
WHERE
dict_type_code = '001'
) c ON a.cust_industry = c.dict_id
LEFT JOIN (
SELECT
dict_id,
dict_item_name
FROM
base_dict
WHERE
dict_type_code = '006'
) d ON a.cust_level = d.dict_id
使用3个左外连接完成多表查询。左外连接和内连接的区别是:前者是在后者的基础上,确保左表的显示,即左表去匹配右表,若符合就显示,否则为null。注:sql语句中,001表示客户所属行业,002表示客户来源,006表示客户级别。
第三部分
where
cust_name like "%"#{cust_name}"%"
and cust_source = #{cust_source}
and cust_industry = #{cust_industry}
and cust_level = #{cust_level}
limit #{start},#{rows}
查询条件。
上一篇: 请好手给一个php的正则代码去除文本中的空段落,空p标签
下一篇: qq互联如何弄?求教