前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis 实战: 一对一关系

Mybatis 实战: 一对一关系

作者头像
耕耘实录
发布2021-12-07 17:00:46
2700
发布2021-12-07 17:00:46
举报
文章被收录于专栏:耕耘实录耕耘实录

文章目录

一 背景

某大型企业,集团公司旗下有若干子公司,每个公司一名 CEO。同时,集团文件要求各子公司的 CEO 不得兼任。此时,CEO 与子公司的关系就是一对一的,分别对 CEO 和公司进行建模。要求输入公司 ID 即可查询到该公司的信息,包括 CEO 详细信息。

二 操作步骤

2.1 新建项目

代码语言:javascript
复制
mvn archetype:generate -DgroupId=com.ivandu.mybatis -D artifactId=mybatis -DarchetypeArtifactId=maven-archetype-quickstart

2.2 关联远程已有仓库

代码语言:javascript
复制
git init
git add .
git commit -m "一对一"
git remote add origin https://github.com/cxwn/mybatis.git
git push -u -f origin master

2.3 创建数据库、表

根据背景描述,我们可以创建如下两张表:

代码语言:javascript
复制
create table ceo
(
    id_ceo   int primary key auto_increment, -- ID
    name_ceo varchar(20),                    -- 姓名
    age_ceo  int                             -- 年龄
);

insert into ceo(name_ceo, age_ceo)
values ('John', 39);
insert into ceo(name_ceo, age_ceo)
values ('Bill', 45);
insert into ceo(name_ceo, age_ceo)
values ('Musk', 40);

create table company
(
    id_com     int primary key auto_increment, -- 公司ID
    name_com   varchar(20),                    -- 公司名称
    id_ceo_com int unique,
    foreign key (id_ceo_com) references ceo (id_ceo)
);

insert into company(name_com, id_ceo_com)
values ('ChinaACompany', 1);
insert into company(name_com, id_ceo_com)
values ('ChinaCCompany', 3);
insert into company(name_com, id_ceo_com)
values ('ChinaBCompany', 2);

2.4 项目配置

2.4.1 pom.xml
代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ivandu.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>mybatis</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>
2.4.2 src/resources/mybatis.cfg.xml
代码语言:javascript
复制
<?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>
    <typeAliases>
        <package name="com.ivandu.mybatis.model"/>
    </typeAliases>
    <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://10.1.1.88:3306/mybatis?useSSL=false"/>
                <property name="username" value="mybatis"/>
                <property name="password" value="drh123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/ivandu/mybatis/mapper/CompanyMapper.xml"/>
    </mappers>
</configuration>
2.4.3 src/resources/log4j.properties
代码语言:javascript
复制
# Global logging configuration
log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.5 创建实例类 Model

2.5.1 CEO 类
代码语言:javascript
复制
package com.ivandu.mybatis.model;

public class CEO {
    private Integer id;
    private String name;
    private Integer age;

    public CEO(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    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;
    }
}
2.5.2 Company 类
代码语言:javascript
复制
package com.ivandu.mybatis.model;

public class Company {
    private Integer id;
    private String name;
    private CEO ceo;

    public Company(){}

    public Company(Integer id, String name, CEO ceo) {
        this.id = id;
        this.name = name;
        this.ceo = ceo;
    }

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

    public Integer getId() {
        return this.id;
    }

    public String getName() {
        return name;
    }

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

    public CEO getCeo() {
        return ceo;
    }

    public void setCeo(CEO ceo) {
        this.ceo = ceo;
    }
}

2.6 创建 Mapper

2.6.1 CompanyMapper.java
代码语言:javascript
复制
package com.ivandu.mybatis.mapper;

import com.ivandu.mybatis.model.Company;

public interface CompanyMapper {
    Company selectCompanyById(Integer id) throws Exception;
}
2.6.2 CompanyMapper.xml
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ivandu.mybatis.mapper.CompanyMapper">

    <select id="selectCompanyById" parameterType="int" resultMap="companymap">
        select *
        from company com,
             ceo
        where com.id_ceo_com = ceo.id_ceo
          and com.id_com = #{id}
    </select>

    <!-- resultMap: 映射实体类和字段之间的一一对应的关系 -->
    <resultMap id="companymap" type="Company">
        <id property="id" column="id_com"/>
        <result property="name" column="name_com"/>
        <!-- 一对一关联映射:association -->
        <association property="ceo" javaType="CEO">
            <id property="id" column="id_ceo" javaType="Integer"/>
            <result property="name" column="name_ceo" javaType="String"/>
            <result property="age" column="age_ceo" javaType="Integer"/>
        </association>
    </resultMap>
</mapper>

2.7 测试运行

代码语言:javascript
复制
package com.ivandu.mybatis;

import com.ivandu.mybatis.mapper.CompanyMapper;
import com.ivandu.mybatis.model.Company;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.InputStream;

public class OneToOneTest {

    public static SqlSessionFactory sqlSessionFactory;

    @BeforeClass
    public static void init() throws Exception{
        String resource = "mybatis.cfg.xml";
        InputStream reader = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        reader.close();
    }

    @Test
    public void selectCompanyById(){
        Company company;
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try (sqlSession) {
            CompanyMapper companyMapper = sqlSession.getMapper(CompanyMapper.class);
            company = companyMapper.selectCompanyById(2);
            System.out.println(company.getId() + "\t" +
                    company.getName() + "\t" +
                            company.getCeo().getAge() + "\t" +
                            company.getCeo().getId() + "\t" +
                            company.getCeo().getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三 总结

3.1 错误及故障排除

代码语言:javascript
复制
Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.ivandu.mybatis.model.Company with invalid types (Integer,String,CEO) or values (1,ChinaBigCompany,1). Cause: java.lang.IllegalArgumentException: argument type mismatch.
 解决:实体类中加入无参构造函数。

3.2 参考资料

3.3 源码

GitHub:https://github.com/cxwn/mybatis.git tag:2.0.0​

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一 背景
  • 二 操作步骤
    • 2.1 新建项目
      • 2.2 关联远程已有仓库
        • 2.3 创建数据库、表
          • 2.4 项目配置
            • 2.4.1 pom.xml
            • 2.4.2 src/resources/mybatis.cfg.xml
            • 2.4.3 src/resources/log4j.properties
          • 2.5 创建实例类 Model
            • 2.5.1 CEO 类
            • 2.5.2 Company 类
          • 2.6 创建 Mapper
            • 2.6.1 CompanyMapper.java
            • 2.6.2 CompanyMapper.xml
          • 2.7 测试运行
          • 三 总结
            • 3.1 错误及故障排除
              • 3.2 参考资料
                • 3.3 源码
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档