第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建立外鍵關系 |
---|