文章目錄
- 內連接
- JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper對象有啥區別?
- LambdaQueryWrapper 和 QueryWrapper的區別?
- LambdaQueryWrapper和MPJLambdaQueryWrapper的區別?
- 在作單表更新時建議使用:LambdaUpdateWrapper
- MPJLambdaWrapper和MPJLambdaQueryWrapper的區別?
- 三表聯查的情況
- 做刪除操作時
內連接
代碼:
MPJLambdaWrapper<ToolsMenu> menuJoinWrapper = JoinWrappers.lambda("m1",ToolsMenu.class);//這里的m1 表示inner join 前面的表的別名menuJoinWrapper.selectAll(ToolsMenu.class,"m1");menuJoinWrapper.innerJoin(ToolsMenu.class,"m2",ToolsMenu::getMenuId,ToolsMenu::getMenuParentId);//這里的m2 表示inner join 后面的表的別名menuJoinWrapper.eq("m2",ToolsMenu::getMenuCode, "tenantManagement");final List<ToolsMenu> list = this.list(menuJoinWrapper);
解析后的SQL語句如下:
SELECTm1.MENU_ID,m1.menu_code,m1.menu_name,m1.menu_describe,m1.menu_parent_id,m1.menu_type,m1.create_date,m1.update_date,m1.menu_order,m1.menu_url,m1.dir_or_menu,m1.is_show,m1.create_user,m1.update_user
FROMTOOLS_MENU m1INNER JOIN TOOLS_MENU m2 ON ( m2.MENU_ID = m1.menu_parent_id )
WHERE( m2.menu_code = ? )
其他的左連接,右連接類似上面的寫法。
JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper對象有啥區別?
MPJLambdaWrapper<ToolsLogin> wrapper = new MPJLambdaWrapper<ToolsLogin>();
MPJLambdaWrapper<ToolsLogin> wrapper = JoinWrappers.lambda(ToolsLogin.class);
LambdaQueryWrapper 和 QueryWrapper的區別?
LambdaQueryWrapper和MPJLambdaQueryWrapper的區別?
在作單表更新時建議使用:LambdaUpdateWrapper
LambdaUpdateWrapper<KldModel> wrapper = new LambdaUpdateWrapper<>();wrapper.eq(KldModel::getOwnId, id).set(KldModel::getIsDelete, 1);kldModelService.update(wrapper);
優點:1.可以指定更新的where條件,2.可以通過特有的set方法有針對性只更新某一個或多個字段
MPJLambdaWrapper和MPJLambdaQueryWrapper的區別?
舉例:
userJoinWrapper.select(ToolsUser::getUserId,ToolsUser::getUserName,ToolsUser::getSex,ToolsUser::getEmpId,ToolsUser::getPhoneNumber,ToolsUser::getRoleCode).select(ToolsTenantUserRelation::getTenantUserRelationId);
// .selectAs(ToolsTenantUserRelation::getTenantUserRelationId,"tenantUserRelationId");//也可以給字段起別名userJoinWrapper.leftJoin(ToolsTenantUserRelation.class,ToolsTenantUserRelation::getUserId,ToolsUser::getUserId);userJoinWrapper.eq(ToolsTenantUserRelation::getTenantId, tenantId);
對應的SQL:
SELECTt.USER_ID,t.user_name,t.sex,t.emp_id,t.phone_number,t.role_code,t1.TENANT_USER_RELATION_ID
FROMTOOLS_USER tLEFT JOIN TOOLS_TENANT_USER_RELATION t1 ON ( t1.user_id = t.USER_ID )
WHERE( t1.tenant_id = ? )
//這樣可以查到不同表里的字段,此時使用MPJLambdaQueryWrapper就不行,必須使用MPJLambdaWrapper來復雜關聯查詢。
三表聯查的情況
MPJLambdaWrapper<ToolsUser> userJoinWrapper= JoinWrappers.lambda();userJoinWrapper.select(ToolsUser::getUserId,ToolsUser::getUserName,ToolsUser::getSex,ToolsUser::getEmpId,ToolsUser::getPhoneNumber,ToolsUser::getRoleCode).select(ToolsRole::getRoleName).select(ToolsTenantUserRelation::getTenantUserRelationId);
// .selectAs(ToolsTenantUserRelation::getTenantUserRelationId,"tenantUserRelationId");//也可以給字段起別名userJoinWrapper.leftJoin(ToolsRole.class,ToolsRole::getRoleCode,ToolsUser::getRoleCode);userJoinWrapper.leftJoin(ToolsTenantUserRelation.class,ToolsTenantUserRelation::getUserId,ToolsUser::getUserId);userJoinWrapper.eq(ToolsTenantUserRelation::getTenantId, tenantId);
對應的SQL語句如下:
SELECTt.USER_ID,t.user_name,t.sex,t.emp_id,t.phone_number,t.role_code,t1.role_name,t2.TENANT_USER_RELATION_ID
FROMTOOLS_USER tLEFT JOIN TOOLS_ROLE t1 ON ( t1.role_code = t.role_code )LEFT JOIN TOOLS_TENANT_USER_RELATION t2 ON ( t2.user_id = t.USER_ID )
WHERE( t2.tenant_id = 1 ) LIMIT 10
這樣可以把role_tool、tools_tenant_user_relation、tools_user表里的想要的數據都可以返回了。
做刪除操作時
// DeleteJoinWrapper<ToolsLogin> deleteQuery = JoinWrappers.delete(ToolsLogin.class); //推薦的方式(首推)
// LambdaQueryWrapper<ToolsLogin> deleteQuery = new LambdaQueryWrapper<>(); //不推薦,但是也可以MPJLambdaWrapper<ToolsLogin> deleteQuery = new MPJLambdaWrapper<>();//推薦的方式deleteQuery.lt(ToolsLogin::getExpireTime, expireTime.getTime());loginService.remove(deleteQuery);
但是需要注意一點的是:在做刪除時,千萬注意不要添加以下的內容:
// deleteQuery.select();//可能是在其他地方拷貝過來的。注意一定要刪掉
// deleteQuery.selectAll();//可能是在其他地方拷貝過來的 。注意一定要刪掉
所以建議使用DeleteJoinWrapper做刪除,因為它里面不涉及select或者selectAll方法,因為它是專為做刪除定制的。