栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

Mybatis 实战: 一对一关系

Java 更新时间:发布时间: 百科书网 趣学号

文章目录
    • 一 背景
    • 二 操作步骤
      • 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 源码

一 背景

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

二 操作步骤 2.1 新建项目
mvn archetype:generate -DgroupId=com.ivandu.mybatis -D artifactId=mybatis -DarchetypeArtifactId=maven-archetype-quickstart
2.2 关联远程已有仓库
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 创建数据库、表

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

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

    4.0.0
    com.ivandu.mybatis
    mybatis
    jar
    1.0.0
    mybatis

    
        UTF-8
        11
        11
        11
    

    
        
            org.mybatis
            mybatis
            3.5.7
        
        
            mysql
            mysql-connector-java
            8.0.26
        
        
            log4j
            log4j
            1.2.17
        
        
            junit
            junit
            4.13.2
            test
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.0
            
        
        
            
                src/main/java
                
                    ***.*
                
            
        
    


2.4.2 src/resources/mybatis.cfg.xml



    
        
    
    
        
            
            
                
                
                
                
            
        
    
    
        
    

2.4.3 src/resources/log4j.properties
# 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 类
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 类
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
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




    

    
    
        
        
        
        
            
            
            
        
    

2.7 测试运行
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 错误及故障排除

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 参考资料
  • Mybatis 官方文档
3.3 源码

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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号