Mybatis关联映射之关联单个对象,即一对一(一)

本文详细解析了在Mybatis框架中实现一对一双表关联查询的方法,包括使用一条SQL语句和两条SQL语句的方式,通过具体示例展示了如何在XML映射文件中配置SQL语句和结果映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Mybatis框架,在业务需要对数据库进行关联查询的时候需使用关联映射
而关联映射分为关联单个对象关联多个对象,即一对一一对多的情况,且每种关联方式都可以有两种处理情况,即使用1条sql进行处理与使用2条sql进行处理,接下来开始分析

已有表关系如下(表的字段名与实体类中的属性名一致):
cn_user表:主键为cn_user_Id
cn_book表:主键为cn_book_id

已有java类信息如下:
1、entity.User.java

package entity;
import java.util.List;
public class User {
	private String cn_user_id;//用户id,主键
	private String cn_user_name;//用户姓名
	private String cn_user_password;//用户密码
	private List<Book> books;//用户拥有的书籍信息,用户与书籍是一对多的关系
	public List<Book> getBooks() {
		return books;
	}
	public void setBooks(List<Book> books) {
		this.books = books;
	}
	public String getCn_user_id() {
		return cn_user_id;
	}
	public void setCn_user_id(String cn_user_id) {
		this.cn_user_id = cn_user_id;
	}
	public String getCn_user_name() {
		return cn_user_name;
	}
	public void setCn_user_name(String cn_user_name) {
		this.cn_user_name = cn_user_name;
	}
	public String getCn_user_password() {
		return cn_user_password;
	}
	public void setCn_user_password(String cn_user_password) {
		this.cn_user_password = cn_user_password;
	}
	@Override
	public String toString() {
		return "User [cn_user_id=" + cn_user_id + ", cn_user_name=" + cn_user_name + ", cn_user_password="
				+ cn_user_password + ", books=" + books + "]";
	}
}

2、entity.Book.java

package entity;
public class Book {
	private String cn_book_id;//书籍id,主键
	private String cn_user_id;//所属用户id,外键参照于用户表的主键
	private String cn_book_name;//书籍名称
	private User user;//书籍所属用户关系,书籍与用户为一对一
	public String getCn_book_id() {
		return cn_book_id;
	}
	public void setCn_book_id(String cn_book_id) {
		this.cn_book_id = cn_book_id;
	}
	public String getCn_user_id() {
		return cn_user_id;
	}
	public void setCn_user_id(String cn_user_id) {
		this.cn_user_id = cn_user_id;
	}
	public String getCn_book_name() {
		return cn_book_name;
	}
	public void setCn_book_name(String cn_book_name) {
		this.cn_book_name = cn_book_name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	@Override
	public String toString() {
		return "Book [cn_book_id=" + cn_book_id + ", cn_user_id=" + cn_user_id + ", cn_book_name=" + cn_book_name
				+ ", user=" + user + "]";
	}
}

3、dao.BookAndUserDao(Mapper映射器)

package dao;
import java.util.List;
import entity.Book;
public interface BookAndUserDao {
	//关联单个对象
	public List<Book> findBookAndUser1();//两条语句执行sql
	public List<Book> findBookAndUser2();//一条语句执行sql
}

4、Spring-Mybatis(spring与mybatis的配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:jms="http://www.springframework.org/schema/jms"
	xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/jms http://www.springframework.org/schema/tx/spring-jms-3.2.xsd
		http://www.springframework.org/schema/lang http://www.springframework.org/schema/tx/spring-lang-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
	
	<!-- 配置数据库连接及连接池 (Mysql) -->
	<bean id="bds" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/cloud_note"></property>
	</bean>
	
	<!-- 配置SqlSessionFactoryBean -->
	<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="bds"></property>
		<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
	</bean>
	
	<!-- 配置Mapper扫描 (MapperScannerConfigurer) -->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="dao"></property>
	</bean>
</beans>

5、BookAndUserMapper.xml(关键点,进行sql语句的配置)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
 
 <!-- namespace为命名空间,需与映射器全名一致 -->
<mapper namespace="dao.BookAndUserDao">
	 <!--使用一条sql语句来加载Book和关联的User(使用内连接)-->
	 <select id="findBookAndUser1" resultMap="bookMap_1" >
	 SELECT * FROM cn_book JOIN cn_user ON book.cn_user_id = user.cn_user_id
	 </select>
	 <!--书籍关联查询结果映射-->
	 <resultMap id="bookMap_1" type="entity.Book">
	 	<!-- id指定主键,其余字段用result指定 -->
		 <id property="cn_book_id" column="cn_book_id"></id>
		 <result property="cn_user_id" column="cn_user_id"></result>
		 <result property="cn_book_name" column="cn_book_name"></result>
		 <!--映射关系,指定属性与属性的类型-->
		 <association property="user" javaType="entity.User">
			 <id property="cn_user_id" column="cn_user_id"></id>
			 <result property="cn_user_name" column="cn_user_name"></result>
			 <result property="cn_user_password" column="cn_user_password"></result>
		 </association>
	 </resultMap>
	 
	 
	 <!-- 使用两条sql语句来加载Book和关联的User(关联单个对象) -->
	<select id="findBookAndUser2" resultMap="bookMap2">
		select *from cn_book
	</select>
	<resultMap id="bookMap2" type="entity.Book">
		<association property="user" javaType="entity.User" select="findUser" 
			column="cn_user_id"></association>
	</resultMap>
	<!-- 此处id必须与上面一致 -->
	<select id="findUser" parameterType="String" resultType="entity.User">
		select *from cn_user where cn_user_id=#{id}
	</select>
</mapper>

以上便是一对一的关联查询的两种方式,如果还有不懂的可以评论或者私聊
重点:一对一是使用<association >标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值