【Mybatis篇】Mybatis的关联映射详细代码带练 (一对一查询)

      🧸安清h:个人主页

   🎥个人专栏:【计算机网络】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。

目录

🎯一.关联映射概述

🚦简述

🚦三种Java对象关联映射关系

🎯二.一对一查询

🚦元素中的属性

🚦数据表准备

🚦POJO类准备 

🚦创建接口类

🚦创建Util类

🚦核心配置文件

🚦映射文件

🚦测试类


🎯一.关联映射概述

🚦简述

关联映射是数据处理和编程中的一个重要概念,尤其在数据库和面向对象编程中应用广泛。它主要处理实体之间的关系,无论是将这种关系映射到数据库表之间,还是在面向对象编程中处理类之间的关系。实体通常指的是具体的事物,如用户、订单、产品等,在数据库中通常表示为表,而表中的每一行代表一个实体。

关联映射的核心在于处理实体之间的关系,这种关系可以是简单的对应关系,也可以是更复杂的如一对一、一对多或多对多的关系。例如,一个用户可以有多个订单,但一个订单只属于一个用户,这就是典型的一对多关系。在数据库中,这种关系需要通过外键来建立连接,确保数据的完整性和准确性。

在面向对象编程中,关联映射则处理类之间的关系。类是对象的模板或蓝图,定义了对象的属性和行为。当两个类需要建立关联关系时,通常通过属性引用来实现。这种关联是有方向性的,也就是说,一个类可能引用另一个类的实例,但不一定被另一个类的实例所引用。

🚦三种Java对象关联映射关系

  1. 一对一(1:1)关联映射

    • 在这种关系中,一个对象与另一个对象有且仅有一个关联。
    • 例如,一个用户(User)对象可能与一个个人资料(Profile)对象关联,每个用户只有一个个人资料,每个个人资料也只属于一个用户。
    • 在数据库中,这通常通过在两个表之间共享一个主键或者使用外键来实现。
    • 在Java类中,可以通过在一个类中定义另一个类的实例作为私有成员来表示。
  2. 一对多(1:N)关联映射

    • 这种关系表示一个对象可以与多个对象关联,而每个对象只能与一个对象关联。
    • 例如,一个部门(Department)对象可以有多个员工(Employee)对象,但每个员工只能属于一个部门。
    • 在数据库中,通常是通过在“多”的一方的表中包含“一”的一方的表的主键作为外键来实现的。
    • 在Java类中,这通常是通过在“一”的一方的类中定义一个集合(如ListSet)来表示,而在“多”的一方的类中定义一个指向“一”的一方的引用。
  3. 多对多(M:N)关联映射

    • 在这种关系中,两个对象可以相互关联多个对象。
    • 例如,学生(Student)和课程(Course)之间的关系,一个学生可以选多个课程,一个课程也可以被多个学生选择。
    • 在数据库中,这通常需要一个中间表(或称为连接表),该表包含两个关联表的主键。
    • 在Java类中,这通常是通过在两个类中各自定义一个集合来表示,每个集合包含对方类的实例。

Java对象描述数据之间的关系示意图如下:

🎯二.一对一查询

🚦<association>元素中的属性

属性描述
property指定映射到列结果的字段或属性
column指定数据库中的列名或列的别名
javaType指定一个 Java 类的完全限定名,或一个类型别名
jdbcType指定数据库中的列名或列的别名
fetchType可选属性,有效值为 lazyeager
select用于加载复杂类型属性的映射语句的 ID
typeHandler覆盖默认的类型处理器
columnPrefix指定关联实体中属性所对应的数据库列名的前缀,配合 resultMap 使用

下面将通过一个实例来演示。

🚦数据表准备

首先创建两张表,并向每张表中插入两条数据。具体代码如下:

create table idcard(
    id int primary key auto_increment,
    code varchar(100)
);

create table person(
    id int primary key auto_increment,
    name varchar(100),
    age int,
    sex varchar(50),
    card_id int UNIQUE ,
    foreign key (card_id) references idcard(id)
);

随便往里面插入两条数据即可。

🚦POJO类准备 

在项目包com.haust.pojo中创建类IdCard和Person,具体代码如下:

public class IdCard {
    private Integer id;
    private String code;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return "IdCard{" +
                "id=" + id +
                ", code='" + code + '\'' +
                '}';
    }
}
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private IdCard card;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public IdCard getCard() {
        return card;
    }

    public void setCard(IdCard card) {
        this.card = card;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", card=" + card +
                '}';
    }
}

🚦创建接口类

在com.haust.mapper包中创建接口IdCardMapper和PersonMapper,具体代码如下:

public interface IdCardMapper {
    List<IdCard> findCodeById(IdCard idCard);
}
public interface PersonMapper {
    List<Person> findPersonById(Person person);
}

🚦创建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();
    }
}

🚦核心配置文件

核心配置文件mybatis-config.xml中具体代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配置文件的根元素 -->
<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/IdCardMapper.xml"/>
        <mapper resource="mapper/PersonMapper.xml"/>
    </mappers>

</configuration>

🚦映射文件

在mapper包中创建IdCardMapper.xml和PersonMapper.xml文件,并在映射文件中编写一对一关联映射查询的配置信息。

IdCardMapper.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.IdCardMapper">
    <select id="findCodeById" parameterType="Integer" resultType="com.haust.pojo.IdCard">
        select * from idcard where id=#{id}
    </select>
</mapper>

PersonMapper.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.PersonMapper">
    <select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">
        select * from person where id=#{id}
    </select>
    <resultMap id="IdCardWithPersonResult" type="com.haust.pojo.Person">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <association property="card" column="card_id" javaType="com.haust.pojo.IdCard"
                     select="com.haust.mapper.IdCardMapper.findCodeById"/>
    </resultMap>
</mapper>

🚦测试类

最后在包com.haust.test中创建测试类MybatisTest,并在其中编写测试方法testFindPersonById,具体代码如下:

public class MybatisTest {
    @Test
    public void testFindPersonById(){
        SqlSession sqlSession= MybatisUtil.getSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        Person person=new Person();
        person.setId(2);

        List<Person> list=personMapper.findPersonById(person);
        for(Person p:list){
            System.out.println(p);
        }
        sqlSession.close();
    }
}

以上就是今天要讲的内容了,由于时间有限,现在只更新到了一对一查询,在下一篇会写到一对多查询,非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值