之前我们都是普通查询, 现在我们有个疑问如果出现下面的定义的model 数据库能直接查询么, 就是sql查询出来能够映射 对象作为另外一个对象的属性
// 主对象
public class ProjInfoModel {
private Long projId;
private String projName;
private ProjAppInfoModel projAppInfoModel; // 关联对象
// getters / setters
}
// 子对象
public class ProjAppInfoModel {
private String preMoney;
private String postMoney;
private String inveRole;
private String inveType;
private String sumActualPayAmount;
private Date startDate;
// getters / setters
}
<resultMap id="ProjInfoResult" type="com.purvar.petou.ei.model.ProjInfoModel">
<id column="PROJ_ID" property="projId"/>
<result column="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"> <!-- 这里其实不用于查询,仅作逻辑分组 -->
<result column="PRE_MONEY" property="preMoney"/>
<result column="POST_MONEY" property="postMoney"/>
<result column="INVE_ROLE" property="inveRole"/>
<result column="inve_types" property="inveType"/>
<result column="SUM_ACTUAL_PAY_AMOUNT" property="sumActualPayAmount"/>
<result column="START_DATE" property="startDate" jdbcType="TIMESTAMP"/>
</association>
</resultMap>
<select id="selectProjInfoWithApp" resultMap="ProjInfoResultInternal">
SELECT
p.PROJ_ID,
p.PROJ_NAME,
a.PRE_MONEY,
a.POST_MONEY,
a.INVE_ROLE,
a.inve_types,
a.SUM_ACTUAL_PAY_AMOUNT,
a.START_DATE
FROM project_info p
LEFT JOIN project_app_info a ON p.PROJ_ID = a.PROJ_ID
WHERE p.PROJ_ID = #{projId}
</select>
ProjInfoModel proj = new ProjInfoModel();
proj.setProjId(1001L);
proj.setProjName("AI项目");
ProjAppInfoModel app = new ProjAppInfoModel();
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 版本对类型推断的实现可能有差异。
333



被折叠的 条评论
为什么被折叠?



