第5章 ORM映射
5.1 MyBatis自动ORM失效
MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时,无法自动ORM。
自动ORM失效 |
---|
建表
create table t_managers(mgr_id int primary key auto_increment,mgr_name varchar(50),mgr_pwd varchar(50) );
添加数据
INSERT INTO t_managers VALUES (1001, 'michael', '123456'); INSERT INTO t_managers VALUES (1002, 'eric', '654321'); INSERT INTO t_managers VALUES (1003, 'jack', '112233');
实体类
@Data @NoArgsConstructor @AllArgsConstructor public class Manager { private Integer id; private String name; private String password; }
Mapper
public interface ManagerMapper { Manager selectManagerById(Integer id); Set<Manager> selectAllManagers(); }
ManagerMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.ManagerMapper"> </mapper>
注册mapper到mybatis-config.xml中
<mapper resource="mapper/ManagerMapper.xml"/>
5.1.1 ORM映射方案一:列的别名
在SQL中使用 as 为查询字段添加列别名,以匹配属性名。
<select id="selectManagerById" resultType="manager"> SELECT mgr_id AS id , mgr_name AS name , mgr_pwd AS password FROM t_managers WHERE mgr_id = #{id} </select>
5.1.2 ORM映射方案二:结果映射(ResultMap - 查询结果的封装规则)
通过< resultMap id="" type="" >映射,匹配列名与属性名。
<!--定义resultMap标签--> <resultMap id="managerResultMap" type="manager"> <!--关联主键与列名--> <id property="id" column="mgr_id" /> <!--关联属性与列名--> <result property="name" column="mgr_name" /> <result property="password" column="mgr_pwd" /> </resultMap> <!--使用resultMap作为ORM映射依据--> <select id="selectAllManagers" resultMap="managerResultMap"> SELECT mgr_id , mgr_name , mgr_pwd FROM t_managers </select>
测试:
ManagerMapper managerMapper = sqlSession.getMapper(ManagerMapper.class); System.out.println(managerMapper.selectManagerById("1001")); System.out.println(managerMapper.selectAllManagers());
5.2 MyBatis驼峰式命名映射
使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”; 使用好处:省去mapper.xml文件中繁琐编写表字段列表与表实体类属性的映射关系,即resultMap。
在mybatis-config.xml文件中配置:
<settings><!-- 开启驼峰,开启后,只要数据库字段和对象属性名字母相同,无论中间加多少下划线都可以识别 --><setting name="mapUnderscoreToCamelCase" value="true" /> </settings>
实体类
@Data @NoArgsConstructor @AllArgsConstructor public class ManagerCamel {private String mgrId;//与字段mgr_id对应private String mgrName;//与字段mgr_name对应private String mgrPwd;//与字段mgr_pwd对应 }
ManagerMapper接口中添加:
ManagerCamel selectManagerCamelById(String id);
ManagerMapper.xml中添加;
<select id="selectManagerCamelById" resultType="managerCamel">SELECT mgr_id, mgr_name, mgr_pwdFROM t_managersWHERE mgr_id = #{id} </select>
测试:
ManagerMapper managerMapper = sqlSession.getMapper(ManagerMapper.class); System.out.println(managerMapper.selectManagerCamelById("1001"));
5.3 MyBatis处理关联关系
实体间的关系:关联关系(has-a)
OneToOne:一对一关系(Passenger--- Passport)
OneToMany:一对多关系(Employee --- Department)
ManyToMany:多对多关系(Student --- Subject)
MyBatis 有两种不同的方式加载关联:
-
嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
-
嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
Table建立外键关系 |
---|