項目已托管到GitHub,大家可以去GitHub查看下載!並搜索關註微信公眾號 碼出Offer 領取各種學習資料! MyBatis 一、ORM概述 對象關係映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和資料庫之間映射的元數據,將面向對象語言程式中的對象自動 ...
項目已托管到GitHub,大家可以去GitHub查看下載!並搜索關註微信公眾號 碼出Offer 領取各種學習資料!
一、ORM概述
對象關係映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和資料庫之間映射的元數據,將面向對象語言程式中的對象自動持久化到關係資料庫中。本質上就是將數據從一種形式轉換到另外一種形式。
二、ORM映射
2.1 MyBatis自動ORM失效
MyBatis只能自動維護庫表“列名”與“屬性名”相同時的一一對應關係,二者不同時,無法自動ORM。
自動ORM失效 |
---|
2.2 解決方式一:列的別名
在SQL中使用 as 為查詢欄位添加列別名,以匹配屬性名。
<mapper namespace="com.mylifes1110.dao.ManagerDao">
<select id="selectManagerByIdAndPwd" resultType="com.mylifes1110.bean.Manager">
SELECT mgr_id AS id , mgr_name AS username , mgr_pwd AS password
FROM t_managers
WHERE mgr_id = #{id} AND mgr_pwd = #{pwd}
</select>
</mapper>
2.3 解決方式二:結果映射
使用<resultMap id="別名" type="實體類對象名" >標簽來映射,匹配列名與屬性名。
註意: property設置屬性,column設置別名
<mapper namespace="com.mylifes1110.dao.ManagerDao">
<!--定義resultMap標簽-->
<resultMap id="managerResultMap" type="com.mylifes1110.bean.Manager">
<!--關聯主鍵與列名-->
<id property="id" column="mgr_id" />
<!--關聯屬性與列名-->
<result property="username" 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>
</mapper>
三、MyBatis處理關聯關係
3.1 映射關係
實體間的關係: 關聯關係(擁有 has、屬於 belong)
OneToOne: 一對一關係(Passenger--- Passport)
OneToMany: 一對多關係(Employee --- Department)
ManyToMany: 多對多關係(Student --- Subject)
3.2 映射表分析
Table建立外鍵關係 |
---|
Entity添加關係屬性 |
---|
Mapper中將屬性與列名對應 |
---|
3.3 映射關係應用
3.3.1 標簽說明
結果映射標簽: <resultMap id="結果映射別名" type="實體類對象">
雙方均可建立關係屬性,建立關係屬性後,對應的Mapper文件中需使用<ResultMap >完成多表映射
id映射標簽: <id property="ID名" column="ID別名" />
屬性映射標簽: <result property="屬性名" column="別名" />
映射單一對象標簽: <association property="對象屬性名" javaType="實體類包含的單一對象">
持有對象關係屬性使用<association>標簽來完成映射,此標簽是寫在<resultMap>標簽內
映射集合對象標簽: <collection property="集合屬性名" ofType="集合泛型內單一對象">
持有集合關係屬性,使用<collection>標簽來完成映射,此標簽是寫在<resultMap>標簽內
查詢標簽: <select id="介面方法名" resultMap="結果映射別名">
查詢標簽中resultMap屬性內填入的是結果映射別名
3.3.2 一對一關係應用
在一對一關係中,如果實體類中包含需要查詢的對象,則需要在<resultMap>標簽內添加<association>標簽來映射實體類中的單一對象
創建表
// 旅客表
create table passenger
(
id int auto_increment
primary key,
name varchar(50) null,
sex tinyint null,
birthday date null
);
// 護照表
create table passport
(
id int auto_increment
primary key,
nationlity varchar(100) null,
expire date null,
passenger_id int null
);
創建實體類對象
package com.mylifes1110.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Passport {
private int id;
private String nationlity;
private Date expire;
private int passengerId;
private Passenger passenger;
public Passport(String nationlity, Date expire, int passengerId) {
this.nationlity = nationlity;
this.expire = expire;
this.passengerId = passengerId;
}
}
package com.mylifes1110.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Passenger {
private int id;
private String name;
private boolean sex;
private Date birthday;
private Passport passport;
public Passenger(String name, boolean sex, Date birthday) {
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
}
創建介面
package com.mylifes1110.dao;
import com.mylifes1110.bean.Passenger;
import org.apache.ibatis.annotations.Param;
public interface PassengerDao {
Passenger selectPassengerById(@Param("id") int id);
}
創建Mapper.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">
<!--namespace:所需實現的介面全限定名-->
<mapper namespace="com.mylifes1110.dao.PassengerDao">
<!--封裝結果映射-->
<resultMap id="passenger_passport" type="com.mylifes1110.bean.Passenger">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
<!--封裝類中對象-->
<association property="passport" javaType="com.mylifes1110.bean.Passport">
<id column="id" property="id"></id>
<result column="nationlity" property="nationlity"></result>
<result column="expire" property="expire"></result>
</association>
</resultMap>
<!--查詢-->
<select id="selectPassengerById" resultMap="passenger_passport">
select passenger.id,
passenger.name,
passenger.sex,
passenger.birthday,
passport.id pid,
passport.nationlity,
passport.expire,
passport.passenger_id
from passenger
join passport on passenger.id = passport.passenger_id
where passenger.id = #{id}
</select>
</mapper>
註冊Mapper
<!--Mapper註冊-->
<mappers>
<mapper resource="mappers/PassengerMapper.xml"/>
<mappers>
測試類
@Test
public void