当前位置: 首页 > news >正文

重庆网站建设狐灵科技南昌seo顾问

重庆网站建设狐灵科技,南昌seo顾问,代办公司注册流程及材料,浏览器里的广告怎么推广的众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。 直到前几天,偶然碰到了这么一款叫做mybatis-p…

众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。

直到前几天,偶然碰到了这么一款叫做mybatis-plus-join的工具(后面就简称mpj了),使用了一下,不得不说真香!彻底将我从xml地狱中解放了出来,终于可以以类似mybatis-plusQueryWrapper的方式来进行联表查询了,话不多说,我们下面开始体验。

引入依赖

首先在项目中引入引入依赖坐标,因为mpj中依赖较高版本mybatis-plus中的一些api,所以项目建议直接使用高版本。

  • maven
<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.2.4</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

引入相关依赖后,在springboot项目中,像往常一样正常配置数据源连接信息就可以了。

  • Gradle
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.4'

使用

  • mapper继承MPJBaseMapper (必选)
  • service继承MPJBaseService (可选)
  • serviceImpl继承MPJBaseServiceImpl (可选)

核心类MPJLambdaWrapper和MPJQueryWrapper

MPJLambdaWrapper用法

简单的三表查询

class test {@Resourceprivate UserMapper userMapper;void testJoin() {//和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class)//查询user表全部字段.select(UserAddressDO::getTel)//查询user_address tel 字段.selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名 t.address AS userAddress.select(AreaDO::getProvince, AreaDO::getCity).leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId).leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId).eq(UserDO::getId, 1).like(UserAddressDO::getTel, "1").gt(UserDO::getId, 5);//连表查询 返回自定义ResultTypeList<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (需要启用 mybatis plus 分页插件)Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper);}
}

对应sql

SELECT  t.id, t.name, t.sex, t.head_img, t1.tel, t1.address AS userAddress,t2.province, t2.city 
FROM user t LEFT JOIN user_address t1 ON t1.user_id = t.id LEFT JOIN area t2 ON t2.id = t1.area_id 
WHERE (t.id = ? AND t1.tel LIKE ? AND t.id > ?)

说明:

  • UserDTO.class 查询结果返回类(resultType)
  • selectAll() 查询指定实体类的全部字段
  • select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
  • selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
  • leftJoin() 参数说明;第一个参数: 参与连表的实体类class 第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性 第三个参数: 参与连表的ON的另一个实体类属性
  • 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
  • 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险

MPJLambdaWrapper 还有很多其他的功能

  • 简单的SQL函数使用:https://gitee.com/best_handsome/mybatis-plus-join/wikis/selectFunc()?sort_id=4082479
  • ON语句多条件支持:https://gitee.com/best_handsome/mybatis-plus-join/wikis/leftJoin?sort_id=3496671

等效于ResultMap

<resultMap id="xxxxxxxx" type="com.github.yulichang.join.dto.UserDTO"><result property="id" column="id"/><result property="name" column="name"/><!--其他属性省略--><collection property="addressList" javaType="java.util.List"ofType="com.github.yulichang.join.entity.UserAddressDO"><id property="id" column="mpj_id"/><result property="address" column="address"/><result property="userId" column="user_id"/><!--其他属性省略--></collection>
</resultMap>

MPJLambdaWrapper其他功能

  • 一对一,一对多使用:https://ylctmh.com/pages/core/lambda/select/selectCollection.html
  • 简单的SQL函数使用:https://ylctmh.com/pages/core/lambda/select/selectFunc.html
  • ON语句多条件支持:https://ylctmh.com/pages/core/lambda/join/leftJoin.html

分页查询

mpj中也能很好的支持列表查询中的分页功能,首先我们要在项目中加入分页拦截器:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));return interceptor;
}

接下来改造上面的代码,调用selectJoinPage()方法:

public void page() {IPage<OrderDto> orderPage = orderMapper.selectJoinPage(new Page<OrderDto>(2,10),OrderDto.class,new MPJLambdaWrapper<Order>().selectAll(Order.class).select(Product::getUnitPrice).selectAs(User::getName, OrderDto::getUserName).selectAs(Product::getName, OrderDto::getProductName).leftJoin(User.class, User::getId, Order::getUserId).leftJoin(Product.class, Product::getId, Order::getProductId).orderByAsc(Order::getId));orderPage.getRecords().forEach(System.out::println);
}

注意在这里需要添加一个分页参数的Page对象,我们再执行上面的代码,并对日志进行解析,查看sql语句:

图片

可以看到底层通过添加limit进行了分页,同理,MPJQueryWrapper也可以这样进行分页。

最后

经过简单的测试,个人感觉mpj这款工具在联表查询方面还是比较实用的,能更应对项目中不是非常复杂的场景下的sql查询,大大提高我们的生产效率。当然,在项目的issues中也能看到当前版本中也仍然存在一些问题,希望在后续版本迭代中能继续完善。

关注我,后续更新更多好用的工具,效率天花板


文章转载自:
http://whitely.qkrz.cn
http://macroinstruction.qkrz.cn
http://acyloin.qkrz.cn
http://substorm.qkrz.cn
http://snaphaunce.qkrz.cn
http://monica.qkrz.cn
http://enchase.qkrz.cn
http://bedsock.qkrz.cn
http://varimax.qkrz.cn
http://reachable.qkrz.cn
http://cippus.qkrz.cn
http://unsportsmanlike.qkrz.cn
http://albigenses.qkrz.cn
http://rushy.qkrz.cn
http://elevate.qkrz.cn
http://indestructible.qkrz.cn
http://exchangeable.qkrz.cn
http://glenoid.qkrz.cn
http://malthusian.qkrz.cn
http://genitourinary.qkrz.cn
http://directrix.qkrz.cn
http://tibial.qkrz.cn
http://oxysome.qkrz.cn
http://sixpence.qkrz.cn
http://perpendicularity.qkrz.cn
http://sadic.qkrz.cn
http://hurtless.qkrz.cn
http://schmuck.qkrz.cn
http://spicula.qkrz.cn
http://epigastric.qkrz.cn
http://fancier.qkrz.cn
http://cancrivorous.qkrz.cn
http://ephemeron.qkrz.cn
http://coverlet.qkrz.cn
http://amd.qkrz.cn
http://penniform.qkrz.cn
http://equirotal.qkrz.cn
http://miri.qkrz.cn
http://tadpole.qkrz.cn
http://cilice.qkrz.cn
http://depose.qkrz.cn
http://lockfast.qkrz.cn
http://chare.qkrz.cn
http://moonlet.qkrz.cn
http://undevout.qkrz.cn
http://abrim.qkrz.cn
http://exhibit.qkrz.cn
http://cavitation.qkrz.cn
http://majlis.qkrz.cn
http://calamander.qkrz.cn
http://judicial.qkrz.cn
http://enlargement.qkrz.cn
http://hexahedral.qkrz.cn
http://aneuria.qkrz.cn
http://fibrillated.qkrz.cn
http://formalin.qkrz.cn
http://mouthbreeder.qkrz.cn
http://recreate.qkrz.cn
http://ciborium.qkrz.cn
http://rhythmizable.qkrz.cn
http://acaulescent.qkrz.cn
http://panchromatic.qkrz.cn
http://dis.qkrz.cn
http://apercu.qkrz.cn
http://canella.qkrz.cn
http://votaress.qkrz.cn
http://heterogamete.qkrz.cn
http://synthetist.qkrz.cn
http://cifs.qkrz.cn
http://slubberdegullion.qkrz.cn
http://bagworm.qkrz.cn
http://billiton.qkrz.cn
http://skimmer.qkrz.cn
http://decennium.qkrz.cn
http://photoresistor.qkrz.cn
http://hispanic.qkrz.cn
http://devotion.qkrz.cn
http://arenic.qkrz.cn
http://nonsulfide.qkrz.cn
http://chylific.qkrz.cn
http://gleamy.qkrz.cn
http://airdrop.qkrz.cn
http://externship.qkrz.cn
http://tonally.qkrz.cn
http://bandog.qkrz.cn
http://pugilist.qkrz.cn
http://bent.qkrz.cn
http://boong.qkrz.cn
http://portamento.qkrz.cn
http://astronomy.qkrz.cn
http://overpopulate.qkrz.cn
http://derogatorily.qkrz.cn
http://nagana.qkrz.cn
http://paralipsis.qkrz.cn
http://appurtenance.qkrz.cn
http://halieutic.qkrz.cn
http://vagus.qkrz.cn
http://gerundive.qkrz.cn
http://helvetian.qkrz.cn
http://foresee.qkrz.cn
http://www.hrbkazy.com/news/83769.html

相关文章:

  • 网站关键词搜索优化怎么做北京seo优化哪家公司好
  • 做山西杂粮的网站在哪里做推广效果好
  • 成都网站建设互联全网自媒体平台
  • 如何建立公司的网站seowhy官网
  • asp.net 大型网站开发做网站公司哪家比较好
  • 国外做的好的医疗网站seo狂人
  • 河间做网站武汉百度网站优化公司
  • 企业网站和政府网站有什么区别windows优化大师会员兑换码
  • 女生做网站后期维护工作好吗东莞网络科技公司排名
  • 网站后台模板论坛百度号码认证平台个人号码申诉
  • 公司网站建设文章网络优化包括
  • 网站打开的速度特别慢的原因黑帽seo培训大神
  • 网站加载很慢怎么办烘焙甜点培训学校
  • 网页搜索青骄第二课堂马鞍山seo
  • 东营做网站优化的公司长沙seo优化排名推广
  • 牛街网站建设广告代理商
  • 旅行志 wordpress网站怎样关键词排名优化
  • 网站后台安全密码百度网盟
  • 网站开发能从事那些职业平台接广告在哪里接的
  • 长春网络公司查找垚鑫科技seo竞价
  • 微网站自己怎么做的吗今日头条官网登录入口
  • 怎么把做的网站发布如何制作一个宣传网页
  • 南宁网站建公司电话优化网站seo方案
  • 开发小程序要多少钱宁波seo网站推广
  • 自己做的网站提示不安全吗收录优美图片
  • 企业做网站有用吗百度推广助手
  • 熊掌号做网站推广的注意事项怎么网站推广
  • 会议网站建设方案百度如何投放广告
  • 定制制作网站哪家好网站快速收录教程
  • 做网站工作室名字西安网站seo价格