🧸安清h:个人主页
🎥个人专栏:【计算机网络】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。
目录
🎯一.关联映射概述
🚦简述
关联映射是数据处理和编程中的一个重要概念,尤其在数据库和面向对象编程中应用广泛。它主要处理实体之间的关系,无论是将这种关系映射到数据库表之间,还是在面向对象编程中处理类之间的关系。实体通常指的是具体的事物,如用户、订单、产品等,在数据库中通常表示为表,而表中的每一行代表一个实体。
关联映射的核心在于处理实体之间的关系,这种关系可以是简单的对应关系,也可以是更复杂的如一对一、一对多或多对多的关系。例如,一个用户可以有多个订单,但一个订单只属于一个用户,这就是典型的一对多关系。在数据库中,这种关系需要通过外键来建立连接,确保数据的完整性和准确性。
在面向对象编程中,关联映射则处理类之间的关系。类是对象的模板或蓝图,定义了对象的属性和行为。当两个类需要建立关联关系时,通常通过属性引用来实现。这种关联是有方向性的,也就是说,一个类可能引用另一个类的实例,但不一定被另一个类的实例所引用。
🚦三种Java对象关联映射关系
一对一(1:1)关联映射:
- 在这种关系中,一个对象与另一个对象有且仅有一个关联。
- 例如,一个用户(User)对象可能与一个个人资料(Profile)对象关联,每个用户只有一个个人资料,每个个人资料也只属于一个用户。
- 在数据库中,这通常通过在两个表之间共享一个主键或者使用外键来实现。
- 在Java类中,可以通过在一个类中定义另一个类的实例作为私有成员来表示。
一对多(1:N)关联映射:
- 这种关系表示一个对象可以与多个对象关联,而每个对象只能与一个对象关联。
- 例如,一个部门(Department)对象可以有多个员工(Employee)对象,但每个员工只能属于一个部门。
- 在数据库中,通常是通过在“多”的一方的表中包含“一”的一方的表的主键作为外键来实现的。
- 在Java类中,这通常是通过在“一”的一方的类中定义一个集合(如
List
或Set
)来表示,而在“多”的一方的类中定义一个指向“一”的一方的引用。多对多(M:N)关联映射:
- 在这种关系中,两个对象可以相互关联多个对象。
- 例如,学生(Student)和课程(Course)之间的关系,一个学生可以选多个课程,一个课程也可以被多个学生选择。
- 在数据库中,这通常需要一个中间表(或称为连接表),该表包含两个关联表的主键。
- 在Java类中,这通常是通过在两个类中各自定义一个集合来表示,每个集合包含对方类的实例。
Java对象描述数据之间的关系示意图如下:
🎯二.一对多查询
在 MyBatis 中,一对多查询通常是指一个主表的记录与多个从表的记录相关联。例如,一个客户(Customer)可以有多个订单(Order),这就是一个典型的一对多关系。下面同样通过一个实例来实现查询操作。
🚦数据表准备
#创建user表
create table user(
id int primary key auto_increment,
username varchar(100),
address varchar(200)
);
#向user表中插入数据
insert into user values (1,'明明','北京');
insert into user values (2,'晓晓','上海');
insert into user values (3,'兰兰','洛阳');
#创建orders表
create table orders(
id int primary key auto_increment,
number varchar(50) not null ,
user_id int not null,
foreign key (user_id ) references user(id)
);
#向orders表中插入数据
insert into orders values (1,'10001',1);
insert into orders values (2,'10002',2);
insert into orders values (3,'10003',3);
🚦POJO类准备
在项目包com.haust.pojo中创建类Users和Orders,具体代码如下:
public class Users {
private Integer id;
private String username;
private String address;
private List<Orders> ordersList;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", ordersList=" + ordersList +
'}';
}
}
public class Orders {
private Integer id;
private String number;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", number='" + number + '\'' +
'}';
}
}
🚦映射文件
在mapper包中创建UsersMapper.xml文件,并在映射文件中编写一对多关联映射查询的配置信息。
UsersMapper.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="com.haust.mapper.UsersMapper">
<select id="findUsersWithOrders" parameterType="Integer" resultMap="UserWithOrdersResult">
select u.*,o.id as orders_id,o.number
from user u,orders o
where u.id=o.user_id
and u.id=#{id};
</select>
<resultMap id="UserWithOrdersResult" type="com.haust.pojo.Users">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<collection property="ordersList" ofType="com.haust.pojo.Orders">
<id property="id" column="orders_id"/>
<result property="number" column="number"/>
</collection>
</resultMap>
</mapper>
🚦核心配置文件
在核心配置文件mybatis-config.xml中添加如下代码:
<mapper resource="mapper/UsersMapper.xml"/>
🚦创建接口类
在com.haust.mapper包中创建接口UsersMapper,具体代码如下:
public interface UsersMapper {
List<Users> findUsersWithOrders(Users users);
}
🚦创建Util类
在com.haust.util包中创建类MybatisUtil,具体代码如下:
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try {
Reader reader= Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
🚦创建测试类
最后在包com.haust.test中创建测试类MybatisTest,并在其中编写测试方法testFindUsersWithOrders,具体代码如下:
@Test
public void testFindUsersWithOrders(){
SqlSession sqlSession=MybatisUtil.getSession();
UsersMapper usersMapper=sqlSession.getMapper(UsersMapper.class);
Users users=new Users();
users.setId(2);
List<Users> list=usersMapper.findUsersWithOrders(users);
for(Users u:list){
System.out.println(u);
}
sqlSession.close();
}
以上就是今天要讲的内容了,由于时间有限,现在只更新到了一对多查询,在下一篇会写到多对多查询,非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!