147. 如何在 MyBatis 中實現一對多和多對一的關系映射?
在 MyBatis 中實現一對多(One-to-Many)和多對一(Many-to-One)的關系映射,主要是通過 <resultMap>
元素中的 <collection>
和 <association>
子元素來完成的。
1)一對多(One-to-Many)
一對多關系常見于一個父級實體對應多個子級實體的場景。以下是具體實現步驟:
-
實體類定義:在父級實體類中包含一個子級實體的集合。
public class Parent {private int id;private List<Child> children;// getters and setters } public class Child {private int id;// getters and setters }
-
Mapper XML配置:在
<resultMap>
中使用<collection>
標簽定義子集。<resultMap id="parentWithChildren" type="Parent"><id column="parent_id" property="id"/><collection property="children" ofType="Child"><id column="child_id" property="id"/><!-- 其他字段映射 --></collection> </resultMap>
-
查詢語句:在 SQL 語句中使用
<resultMap>
。<select id="selectParentWithChildren" resultMap="parentWithChildren">SELECT p.*, c.*FROM parent pLEFT JOIN child c ON p.id = c.parent_idWHERE p.id = #{id} </select>
2)多對一(Many-to-One)
多對一關系通常是指多個子級實體對應一個父級實體。
-
實體類定義:在子級實體類中包含一個父級實體的引用。
public class Child {private int id;private Parent parent;// getters and setters }
-
Mapper XML配置:在
<resultMap>
中使用<association>
標簽定義父級實體。<resultMap id="childWithParent" type="Child"><id column="child_id" property="id"/><association property="parent" javaType="Parent"><id column="parent_id" property="id"/><!-- 其他字段映射 --></association> </resultMap>
-
查詢語句:
<select id="selectChildWithParent" resultMap="childWithParent">SELECT c.*, p.*FROM child cLEFT JOIN parent p ON c.parent_id = p.idWHERE c.id = #{id} </select>
通過這樣的方式,MyBatis 提供了一種靈活且強大的機制來實現一對多和多對一的關系映射。
148. MyBatis 的事務管理是如何工作的?
MyBatis 的事務管理主要是通過在配置文件中定義事務管理器和事務隔離級別來實現的。MyBatis 支持兩種事務管理方式:JDBC 事務管理和 MANAGED 事務管理。
- JDBC 事務管理:
- MyBatis 默認使用 JDBC 事務管理,它會將事務交給 JDBC 來控制。
- 在 JDBC 事務管理方式下,MyBatis 會使用 Connection 對象的 setAutoCommit(false) 方法來關閉自動提交事務,然后執行一系列的 SQL 語句,最后可以選擇提交(commit())或回滾(rollback())事務。
- 這種方式適用于單個數據庫連接,如果涉及到多個數據庫連接,需要手動處理事務傳播和同步。
以下是一個簡單的 JDBC 事務管理示例:
SqlSession sqlSession = sqlSessionFactory.openSession();
try {// 獲取Mapper接口的代理對象SomeMapper someMapper = sqlSession.getMapper(SomeMapper.class);// 執行一系列數據庫操作someMapper.updateData();someMapper.insertData();// 提交事務sqlSession.commit();
} catch (Exception e) {// 回滾事務sqlSession.rollback();
} finally {// 關閉SqlSessionsqlSession.close();
}
- MANAGED 事務管理:
- MANAGED 事務管理是指 MyBatis 不管理事務,而是將事務管理交給容器(如 Spring 容器)來處理。
- 在這種情況下,MyBatis 會忽略 commit 和 rollback 方法,因為它認為容器已經處理了這些操作。
- 這種方式適用于分布式事務或者需要與其他事務資源(如消息隊列、分布式緩存等)一起工作的情況。
以下是一個簡單的 MANAGED 事務管理示例(在 Spring 環境中):
@Service
public class SomeService {@Autowiredprivate SomeMapper someMapper;@Transactionalpublic void someMethod() {// 執行一系列數據庫操作someMapper.updateData();someMapper.insertData();// 事務提交或回滾由Spring容器處理}
}
總的來說,MyBatis 的事務管理通過配置文件和編程方式實現,可以根據實際需求選擇適當的事務管理方式。在開發過程中,需要注意合理處理事務邊界、事務傳播行為和事務隔離級別,以確保數據的一致性和安全性。
編程資料包領取:https://pan.quark.cn/s/601cbea644ff
編程、AI、副業交流:https://t.zsxq.com/19zcqaJ2b
領【150 道精選 Java 高頻面試題】請 go 公眾號:碼路向前 。