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

网站做百度推广怎么推广网站如何制作一个电脑软件

网站做百度推广怎么推广网站,如何制作一个电脑软件,17做网站广州起做网店,手机网站建设开发在实际业务开发中,我们经常需要处理对象之间的关联关系,如一对一、一对多、多对多等。MyBatis作为一款优秀的持久层框架,提供了强大的对象关联查询能力。本文将深入探讨MyBatis中各种关联查询的实现方式、适用场景及最佳实践。 1. MyBatis关…

在实际业务开发中,我们经常需要处理对象之间的关联关系,如一对一、一对多、多对多等。MyBatis作为一款优秀的持久层框架,提供了强大的对象关联查询能力。本文将深入探讨MyBatis中各种关联查询的实现方式、适用场景及最佳实践。

1. MyBatis关联查询基础

1.1 关联查询的概念

对象关联查询指的是在查询一个对象时,同时将其关联的其他对象也查询出来,形成完整的对象图。例如查询订单时同时获取订单项,查询用户时获取其角色等。

1.2 关联查询的两种策略

  1. 嵌套查询:通过多次SQL查询完成,先查询主对象,再根据主对象ID查询关联对象
  2. 嵌套结果:通过单条复杂SQL(多表连接)一次查询出所有数据,然后在结果映射中进行组装

2. 一对一关联查询

2.1 使用<association>标签

<resultMap id="orderWithUserMap" type="Order"><id property="id" column="id"/><result property="orderNo" column="order_no"/><!-- 其他Order字段 --><association property="user" javaType="User"><id property="id" column="user_id"/><result property="username" column="username"/><!-- 其他User字段 --></association>
</resultMap><select id="getOrderWithUser" resultMap="orderWithUserMap">SELECT o.*, u.usernameFROM orders oLEFT JOIN user u ON o.user_id = u.idWHERE o.id = #{id}
</select>

2.2 嵌套查询方式

<resultMap id="orderWithUserMap" type="Order"><association property="user" column="user_id" select="com.example.mapper.UserMapper.getById"/>
</resultMap><select id="getOrderWithUser" resultMap="orderWithUserMap">SELECT * FROM orders WHERE id = #{id}
</select>

优缺点比较

  • 嵌套结果:一次SQL,效率高,但SQL可能复杂
  • 嵌套查询:SQL简单,但可能产生N+1问题

3. 一对多关联查询

3.1 使用<collection>标签

<resultMap id="userWithOrdersMap" type="User"><id property="id" column="id"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="orderNo" column="order_no"/><!-- 其他Order字段 --></collection>
</resultMap><select id="getUserWithOrders" resultMap="userWithOrdersMap">SELECT u.*, o.id as order_id, o.order_noFROM user uLEFT JOIN orders o ON o.user_id = u.idWHERE u.id = #{id}
</select>

3.2 嵌套查询方式

<resultMap id="userWithOrdersMap" type="User"><collection property="orders" column="id" select="com.example.mapper.OrderMapper.getByUserId"/>
</resultMap><select id="getUserWithOrders" resultMap="userWithOrdersMap">SELECT * FROM user WHERE id = #{id}
</select>

4. 多对多关联查询

多对多关系通常通过中间表实现,MyBatis处理方式类似一对多。

4.1 示例:用户与角色

<resultMap id="userWithRolesMap" type="User"><id property="id" column="id"/><collection property="roles" ofType="Role"><id property="id" column="role_id"/><result property="name" column="role_name"/></collection>
</resultMap><select id="getUserWithRoles" resultMap="userWithRolesMap">SELECT u.*, r.id as role_id, r.name as role_nameFROM user uLEFT JOIN user_role ur ON ur.user_id = u.idLEFT JOIN role r ON r.id = ur.role_idWHERE u.id = #{id}
</select>

5. 高级关联查询技巧

5.1 延迟加载

解决N+1问题的有效手段:

<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings><resultMap id="orderWithUserLazyMap" type="Order"><association property="user" column="user_id" select="com.example.mapper.UserMapper.getById"fetchType="lazy"/>
</resultMap>

5.2 自动映射与手动映射结合

<resultMap id="orderWithUserAutoMap" type="Order" autoMapping="true"><association property="user" javaType="User" autoMapping="true"><id property="id" column="user_id"/></association>
</resultMap>

5.3 鉴别器(Discriminator)

根据某列的值决定如何映射:

<resultMap id="vehicleResult" type="Vehicle"><id property="id" column="id"/><discriminator javaType="int" column="type"><case value="1" resultMap="carResult"/><case value="2" resultMap="truckResult"/></discriminator>
</resultMap>

6. 性能优化建议

  1. 避免过度关联:只查询必要的关联数据
  2. 合理使用延迟加载:对不立即使用的关联使用延迟加载
  3. 注意N+1问题:一对多嵌套查询时特别小心
  4. 使用二级缓存:对不常变更的关联数据可考虑缓存
  5. 批量查询优化:对于列表查询,考虑使用批量关联查询

7. 常见问题与解决方案

7.1 列名重复问题

解决方案:

  • 使用<resultMap>明确指定列名映射
  • SQL中使用别名避免冲突

7.2 循环依赖问题

解决方案:

  • 使用@JsonIgnore等注解避免序列化循环
  • 设计DTO切分关联关系

7.3 复杂嵌套性能问题

解决方案:

  • 考虑使用多条简单SQL替代单条复杂SQL
  • 使用MyBatis的@SelectProvider编写动态SQL

8. 结语

MyBatis的关联查询功能强大而灵活,正确使用可以极大提高开发效率。在实际项目中,应根据业务场景、数据量和性能要求选择合适的关联策略。记住,没有放之四海而皆准的最佳方案,只有最适合当前场景的选择。

希望本文能帮助您更好地理解和使用MyBatis的关联查询功能。如有任何问题或建议,欢迎留言讨论。


文章转载自:

http://jYgbwFlb.sbncr.cn
http://ArjaX7WD.sbncr.cn
http://s9MzPZNX.sbncr.cn
http://EBmTBptm.sbncr.cn
http://jHuktdVk.sbncr.cn
http://BQttiueC.sbncr.cn
http://RxBt18ak.sbncr.cn
http://PnLYD7dz.sbncr.cn
http://d4HVtesC.sbncr.cn
http://GghhyUSU.sbncr.cn
http://mVWeNIhv.sbncr.cn
http://DZDKC2pJ.sbncr.cn
http://P64kRKr7.sbncr.cn
http://SHHNNtEt.sbncr.cn
http://t8p7CTq2.sbncr.cn
http://VnOQbLWg.sbncr.cn
http://YP5xrdV9.sbncr.cn
http://0nFfuG5i.sbncr.cn
http://QM2AEjh2.sbncr.cn
http://qNOpLUOR.sbncr.cn
http://nE1V5clQ.sbncr.cn
http://LBLLY5Q6.sbncr.cn
http://pCilWnIO.sbncr.cn
http://dwWWRYZr.sbncr.cn
http://sYzOJRBh.sbncr.cn
http://kENlnHiR.sbncr.cn
http://FeOs3vcM.sbncr.cn
http://GKtrqQbl.sbncr.cn
http://f2V2DGTz.sbncr.cn
http://fQUFEuBz.sbncr.cn
http://www.dtcms.com/wzjs/707849.html

相关文章:

  • 机关门户网站建设管理情况数据交易网站开发
  • 有没有做图的网站恩做网站动态页面好
  • 黑龙江做网站的公司有哪些指数是指什么
  • 西安造价信息网官网企业网站优化面向什么工作
  • 旅游网站网页设计seo的基本步骤
  • 免费网站建设培训班我的网站模板下载 迅雷下载 迅雷下载
  • 建设公司网站的要点公众号开发者密码怎么查看
  • 龙文网站建设贵州省交通建设工程质量监督局网站
  • 网站建设怎么样蝉知 wordpress
  • 中海园林建设有限公司网站1688网站登录
  • 绍兴 网站建设 电话什么网站都能进的浏览器
  • 建网站 陕西牛人网络科技邯郸网站设计培训
  • c 在网站开发方面有优势吗怎样建设自己的物流信息网站
  • 移动网站 图片优化网站的优化从哪里进行
  • 网站建设 电脑 手机怎么上传网页到wordpress
  • 企业网站建设 新天地网络32强世界排名
  • 大学生创业做创意宿舍装修网站微信公众号文档
  • 网站常用配色wordpress英文企业模板下载地址
  • 网站语言包是什么网站开发解决方案
  • 彭阳县城乡与住房建设局网站百度快照
  • 佛山市做网站第三方营销策划公司有哪些
  • 十字绣网站开发在线短视频网站开发费用
  • flash做网站轮播图通过微信发布诱导分享的美文或者集赞活动属于哪种网络营销方式
  • 利用已有网站 制作做设计的最后都转行到哪里了
  • dede网站 地图什么做wordpress 子主题 教程
  • 2在线做网站wordpress wiki 模版
  • 鲁东大学课程网站建设如何删除flash网站素材下载
  • 网站访客跟踪阿里巴巴国际贸易网站
  • 做外贸的有哪些网站做外贸a货网站
  • 网站程序备份方法seo查询系统