sql语法- MyBatis 中 <association> 标签的作用 1对1的情况
📅 2026/7/3 17:35:39
👁️ 阅读次数
📝 编程学习
之前我们都是普通查询, 现在我们有个疑问如果出现下面的定义的model 数据库能直接查询么, 就是sql查询出来能够映射 对象作为另外一个对象的属性
// 主对象publicclassProjInfoModel{privateLongprojId;privateStringprojName;privateProjAppInfoModelprojAppInfoModel;// 关联对象// getters / setters}// 子对象publicclassProjAppInfoModel{privateStringpreMoney;privateStringpostMoney;privateStringinveRole;privateStringinveType;privateStringsumActualPayAmount;privateDatestartDate;// getters / setters}<resultMap id="ProjInfoResult"type="com.purvar.petou.ei.model.ProjInfoModel"><idcolumn="PROJ_ID"property="projId"/><resultcolumn="PROJ_NAME"property="projName"/></resultMap><resultMap id="ProjInfoResultInternal"type="com.purvar.petou.ei.model.ProjInfoModel"extends="ProjInfoResult"><association property="projAppInfoModel"javaType="com.purvar.petou.ei.model.ProjAppInfoModel"column="PROJ_ID"><!-- 这里其实不用于查询,仅作逻辑分组 --><resultcolumn="PRE_MONEY"property="preMoney"/><resultcolumn="POST_MONEY"property="postMoney"/><resultcolumn="INVE_ROLE"property="inveRole"/><resultcolumn="inve_types"property="inveType"/><resultcolumn="SUM_ACTUAL_PAY_AMOUNT"property="sumActualPayAmount"/><resultcolumn="START_DATE"property="startDate"jdbcType="TIMESTAMP"/></association></resultMap><selectid="selectProjInfoWithApp"resultMap="ProjInfoResultInternal">SELECTp.PROJ_ID,p.PROJ_NAME,a.PRE_MONEY,a.POST_MONEY,a.INVE_ROLE,a.inve_types,a.SUM_ACTUAL_PAY_AMOUNT,a.START_DATEFROMproject_info pLEFTJOINproject_app_info aONp.PROJ_ID=a.PROJ_IDWHEREp.PROJ_ID=#{projId}</select>ProjInfoModelproj=newProjInfoModel();proj.setProjId(1001L);proj.setProjName("AI项目");ProjAppInfoModelapp=newProjAppInfoModel();app.setPreMoney("500万");app.setPostMoney("600万");app.setInveRole("领投");app.setInveType("VC");// ...proj.setProjAppInfoModel(app);// 自动注入!我们仔细的看下查询 首先使用了 resultMap , 映射类型都是type=“com.purvar.petou.ei.model.ProjInfoModel” 第二个resultMap 有个 extends=“ProjInfoResult” 就是继承了第一个resultMap 的所有属性,应该也可以合写
- 为什么需要 javaType
MyBatis 在运行时通过反射创建对象。当你在 中定义一个嵌套对象(如 projAppInfoModel)时,MyBatis 无法仅从字段名推断出该对象的具体类型(尤其是当属性是接口、抽象类或泛型时)。因此,必须通过 javaType 明确告知
即使 MyBatis 能自动推断类型,显式写出 javaType 仍然是推荐做法,原因包括:
提高代码可读性:XML 配置自包含,无需跳转到 Java 类查看类型。
避免潜在错误:防止因字段类型变更(如改为接口)导致运行时异常。
兼容性保障:不同 MyBatis 版本对类型推断的实现可能有差异。
编程学习
技术分享
实战经验