1、关联分页查询
关联分页查询是日常开发中常见的,使用MybatisPlus插件后,单表分页查询变得很简单,一条语句就可以搞定了如下:
String staffGid = (String) params.get("staffGid");
Page<BkXcOrder> page = this.selectPage(
new Query<BkXcOrder>(params).getPage(),
new EntityWrapper<BkXcOrder>()
.eq(StringUtils.isNotBlank(staffGid), "STAFF_GID", staffGid) //查询条件
);
那么多表关联分页查询怎么做呢?
首先利用插件分页,查询出来分页的currentPage
、pageSize
、totalPage
、totalCount
以及分页的数据主键 ids
,然后再根据主键ids
来查询这些pageSize
多条数据。如下:
@GetMapping("/queryPageBookHistoryVo")
public R<PageUtils> queryPageBookHistoryVo(@RequestParam Map<String, Object> params) {
//params 参数包含page、limit、staffGid信息
String staffGid = (String) params.get("staffGid");
Assert.isBlank(staffGid, "参数错误!");
//先查分页数据
PageUtils page = bkXcOrderService.queryPage(params);
List<BkXcOrder> bkXcOrderList = (List<BkXcOrder>) page.getList();
List<String> ids = new ArrayList<>();
//拼接参数
bkXcOrderList.forEach(item -> {
ids.add(item.getGid());
});
//根据id来查询关联分页数据
page.setList(bkXcOrderService.queryListByPage(ids, staffGid));
return RUtils.ok(page);
}
其中 queryListByPage
dao 层的关联查询如下:
//当包含多个参数的时候,要用@Param注解来区分
List<BookHistoryVo> queryListByPage(@Param("ids") List ids, @Param("staffGid") String staffGid);
<select id="queryListByPage" resultType="com.sx.purchase.VO.BookHistoryVo">
SELECT bk_passport.GID customerGid ,
bk_passport.REAL_NAME customerName,
bk_book.GID bookGid,
bk_book.BOOKNAME bookname,
bk_book.AUTHOR author,
bk_book.ISBN isbn ,
bk_book.PRICE price ,
bk_passport.POSITION position,
bk_passport.DEPARTMENT department
FROM BK_XC_ORDER bk_order
INNER JOIN BK_XC_PASSPORT_INFO bk_passport ON bk_order.CUSTOMER_GID = bk_passport.GID
INNER JOIN BK_XC_BOOKS bk_book ON bk_order.BIBGID = bk_book.GID
<where>
<if test="staffGid != null and staffGid != ''">
AND bk_order.STAFF_GID=#{staffGid}
</if>
<if test=" ids != null and ids.size != 0">
AND bk_order.GID in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</select>
2、删库别跑路sql
昨天主管把一个线上的两个表的数据直接 delete 了,慌得一匹。差点要跑路了,让他懵逼的一天。
我们公司使用的是oracle数据库,当你把数据删除了后,怎么找回来呢?
可以使用以下语句查询出来在 2018-10-22 10:19:00
时间节点上的数据:
select * from BK_ORDER_FORMLIST as of timestamp to_Date('2018-10-22 10:19:00', 'yyyy-mm-dd hh24:mi:ss');
3、按照字段查重
根据某个字段来查询表中这个字段是否有重复的行。
SELECT a.PHONE FROM (SELECT count(*) num,PHONE FROM BK_PASSPORT_INFO GROUP BY PHONE) a WHERE a.num >1;
4、批量添加数据
市场提出这样的要求:要求给指定公司的用户批量添加一个默认的地址。其中具体的用户数据是表里面查询的,而有的数据如地址这些是常量,那么怎么来批量插入这些数据,如下:
INSERT INTO BK_USERMAIL_ADDR(GID,PASSPORT_GID,CREATE_DATE,RECEIVE_NAME,RECEIVE_ADDR,RECEIVE_TEL,RECEIVE_POSTCODE,ISDEFAULT,PROVINCE,CITYNAME,DISTRICTNNAME)
SELECT SEQGID,GID ,SYSDATE,REAL_NAME,'金融大街31号中国电信',PHONE,'000000',0,'北京市','市辖区', '西城区'
FROM BK_PASSPORT_INFO WHERE COMPANY_ID = '2017120818324600103';
其中SEQGID
是ORACLE的序列函数,SYSDATE
是时间日期函数,GID ,REAL_NAME
等为表中字段。
后续陆续更新…