ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MyBatis中表和实体类的映射

MyBatis中表和实体类的映射 MyBatis 表 ↔ 实体类映射数据库表字段下划线user_nameJava 实体属性驼峰userName。两种方案自动映射、手动 resultMap 映射。表t_user| id | user_name | user_age | dept_id ||----|-----------|----------|---------|| 1 | 张三 | 22 | 1001 |实体 User.javapublic class User { private Long id; private String userName; private Integer userAge; private Long deptId; // getter setter }一、自动映射resultTypeMyBatis 自动映射规则列名和实体属性完全一样就自动赋值。情况 1数据库下划线实体驼峰最常见业务场景开启全局配置下划线转驼峰不需要写任何映射直接用resultType。yml 配置mybatis: configuration: map-underscore-to-camel-case: true数据库列user_name→ Java 属性userName数据库列user_age→ Java 属性userAgemapper xmlselect idselectAll resultTypecom.entity.User select id,user_name,user_age,dept_id from t_user /select✅ 查询结果自动封装 User 对象。⚠️注意这个配置只作用于resultType同样也对resultMap生效。情况 2字段名字完全一致不推荐数据库这样设计数据库列userName实体属性userName不需要开启配置直接自动映射。自动映射失效场景没有开启下划线转驼峰数据库下划线实体驼峰 → 属性为 nullsql 查询的列名和实体属性名完全不匹配多表关联查询、嵌套对象、一对一 / 一对多自动映射搞不定必须resultMap二、手动映射 resultMap核心重点适用场景数据库列名和实体属性差异很大一对一、一对多关联查询需要指定主键、typeHandler 自定义类型处理不想开启全局下划线转驼峰配置基础语法!-- type实体全类名 / 别名idresultMap唯一标识 -- resultMap iduserResultMap typecom.entity.User !-- id 映射主键字段提升MyBatis解析性能主键一定要写 -- id columnid propertyid/ !-- columnsql查询出来的列名property实体类属性名 -- result columnuser_name propertyuserName/ result columnuser_age propertyuserAge/ result columndept_id propertydeptId/ /resultMap !-- 使用resultMap不要写resultType -- select idselectUser resultMapuserResultMap select id,user_name,user_age,dept_id from t_user where id#{id} /select关键点column是SQL 查询返回的列名不是原始表字段名 如果写了别名select user_name as uname那 column 就要写uname。别名示例select idselectUser resultMapuserResultMap select id,user_name as uname from t_user /select resultMap iduserResultMap typeUser id columnid propertyid/ result columnuname propertyuserName/ /resultMap三、一对一关联映射associationUser 里面包含 Dept 对象public class User { private Long id; private String userName; private Dept dept; // 一对一 } public class Dept { private Long deptId; private String deptName; }方式 1联合查询一次 SQL业务常用resultMap iduserDeptMap typeUser id columnu_id propertyid/ result columnuser_name propertyuserName/ !-- association一对一对象映射 property实体属性名 javaType对象类型 -- association propertydept javaTypeDept id columnd_id propertydeptId/ result columndept_name propertydeptName/ /association /resultMap select idgetUser resultMapuserDeptMap select u.id u_id, u.user_name, d.id d_id, d.dept_name from t_user u left join t_dept d on u.dept_id d.id where u.id#{id} /select方式 2嵌套查询多 SQL会产生 N1 问题resultMap iduserDeptMap typeUser id columnid propertyid/ result columnuser_name propertyuserName/ !-- select调用另外一个mapper方法column传给子查询的参数 -- association propertydept javaTypeDept selectcom.mapper.DeptMapper.selectById columndept_id/ /resultMap注意 N1 问题查询 N 条用户会额外发起 N 次查询部门大数据量禁止。四、一对多关联映射collection一个用户多个订单User 中存放 ListOrder orderListpublic class User { private Long id; private String userName; private ListOrder orderList; //一对多 } public class Order{ private Long orderId; private String orderNo; }resultMap iduserOrderMap typeUser id columnu_id propertyid/ result columnuser_name propertyuserName/ !-- collection集合映射ofType集合里面元素类型 -- collection propertyorderList ofTypeOrder id columno_id propertyorderId/ result columnorder_no propertyorderNo/ /collection /resultMap select idgetUserOrder resultMapuserOrderMap select u.id u_id, u.user_name, o.id o_id, o.order_no from t_user u left join t_order o on u.id o.user_id where u.id#{id} /selectofType集合泛型里面的实体类型不是写 List。五、resultMap 复用extends 继承!--基础resultMap -- resultMap idbaseUserMap typeUser id columnid propertyid/ result columnuser_name propertyuserName/ /resultMap !--继承上面追加字段不用重复写 -- resultMap iduserWithDeptMap extendsbaseUserMap typeUser association propertydept javaTypeDept id columnd_id propertydeptId/ /association /resultMap六、常见坑resultType和resultMap二选一不能同时写column是查询出来的列名不是表原始字段注意 sql 别名下划线转驼峰只对 resultType 生效resultMap 不受影响resultMap 需要手动写 column-propertyassociation用javaTypecollection用ofType不要搞混嵌套子查询容易 N1生产尽量用left join 单 sql实体属性大小写严格区分property 必须和实体 getter/setter 对应主键尽量写id/标签MyBatis 内部缓存、去重依赖主键不写会出现重复对象自动映射 vs resultMap 选型表格方案适用场景resultType 下划线驼峰配置单表简单查询字段一一对应resultMap字段名差异、一对一、一对多、复杂关联查询补充MyBatis‑Plus 封装了实体注解TableName、TableField底层也是生成 mybatis 的映射逻辑。
返回列表