MyBatis注解之一对一关联实战

一 领域模型

1 Card

package org.fkit.domain;
import java.io.Serializable;
public class Card implements Serializable {
     
     private static final long serialVersionUID = 1L;
     
     private Integer id;  // 主键id
     private String code; // 身份证编号
     
     public Card() {
           super();
           // TODO Auto-generated constructor stub
     }
     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 "Card [id=" + id + ", code=" + code + "]";
     }
}

2 Person

package org.fkit.domain;
import java.io.Serializable;
/**
* CREATE TABLE tb_card(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(18)
);
INSERT INTO tb_card(CODE) VALUES('432801198009191038');
CREATE TABLE tb_person(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18),
sex VARCHAR(18),
age INT,
card_id INT UNIQUE,
FOREIGN KEY (card_id) REFERENCES tb_card(id)
);
INSERT INTO tb_person(NAME,sex,age,card_id) VALUES('jack','男',23,1)
* */
public class Person implements Serializable {
     private static final long serialVersionUID = 1L;
     
     private Integer id;  // 主键id
     private String name; // 姓名
     private String sex;  // 性别
     private Integer age; // 年龄
     
     // 人和身份证是一对一的关系,即一个人只有一个身份证
     private Card card;
     public Person() {
           super();
           // TODO Auto-generated constructor stub
     }
     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 String getSex() {
           return sex;
     }
     public void setSex(String sex) {
           this.sex = sex;
     }
     public Integer getAge() {
           return age;
     }
     public void setAge(Integer age) {
           this.age = age;
     }
     public Card getCard() {
           return card;
     }
     public void setCard(Card card) {
           this.card = card;
     }
     @Override
     public String toString() {
           return "Person [id=" + id + ", name=" + name + ",  sex=" + sex
                     + ", age=" + age + "]";
     }
}

二 会话工厂

package org.fkit.factory;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class FKSqlSessionFactory {
    
    private static SqlSessionFactory sqlSessionFactory = null;
    
    // 初始化创建SqlSessionFactory对象
    static{
        try (// 读取mybatis-config.xml文件
                InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            ){
            sqlSessionFactory = new SqlSessionFactoryBuilder()
                    .build(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 获取SqlSession对象的静态方法
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

    // 获取SqlSessionFactory的静态方法
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

三 mapper

1 CardMapper

package org.fkit.mapper;

import org.apache.ibatis.annotations.Select;
import org.fkit.domain.Card;

public interface CardMapper {

    @Select("SELECT * FROM TB_CARD WHERE ID = #{id} ")
    Card selectCardById(Integer id);
    
}

2 PersonMapper

package org.fkit.mapper;

import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import org.fkit.domain.Person;

public interface PersonMapper {
    
    @Select("SELECT * FROM TB_PERSON WHERE ID = #{id}")
    @Results({
        @Result(id=true,column="id",property="id"),
        @Result(column="name",property="name"),
        @Result(column="sex",property="sex"),
        @Result(column="age",property="age"),
        @Result(column="card_id",property="card",
        one=@One(
                select="org.fkit.mapper.CardMapper.selectCardById",
                fetchType=FetchType.EAGER))
    })
    Person selectPersonById(Integer id);

}

四 配置

1 db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=123456

2 log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
<log4j:configuration  xmlns:log4j="http://jakarta.apache.org/log4j/">  
    <appender name="STDOUT"  class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%5p [%t] %m%n"  />  
        </layout>  
    </appender>   
     <logger name="org.fkit.mapper">  
        <level value="DEBUG" />  
    </logger>
    <root>  
        <level value="ERROR" />  
        <appender-ref ref="STDOUT" />  
    </root>  
</log4j:configuration>

3 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">
  <!--  XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
     <properties resource="db.properties"/>
     <!-- 指定 MyBatis 所用日志的具体实现 -->
     <settings>
           <setting name="logImpl" value="LOG4J"/>
     </settings>
     <environments default="mysql">
     <!-- 环境配置,即连接的数据库。 -->
    <environment id="mysql">
    <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
      <transactionManager type="JDBC"/>
      <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
  <mappers>
      <mapper class="org.fkit.mapper.PersonMapper"/>
      <mapper class="org.fkit.mapper.CardMapper"/>
  </mappers>
</configuration>

四 测试

package org.fkit.test;

import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.Person;
import org.fkit.factory.FKSqlSessionFactory;
import org.fkit.mapper.PersonMapper;
public class OneToOneTest {

    public static void main(String[] args) {
        // 定义SqlSession变量
        SqlSession sqlSession = null;
        try {
            // 创建SqlSession实例
            sqlSession = FKSqlSessionFactory.getSqlSession();
            // 获取PersonMapper实例
            PersonMapper pm = sqlSession.getMapper(PersonMapper.class);
            // 根据id查询Person对象,同时需要获得关联的Card对象
            Person p = pm.selectPersonById(1);
            // 查看查询到的Person对象
            System.out.println(p);
            // 查看查询到的关联的Card对象
            System.out.println(p.getCard());
            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            sqlSession.rollback();
            e.printStackTrace();
        }finally {
            // 关闭SqlSession
            if(sqlSession != null)
                sqlSession.close();
        }
    }
}

测试结果

DEBUG [main] ==>  Preparing: SELECT * FROM TB_PERSON WHERE ID =  ?
DEBUG [main] ==> Parameters: 1(Integer)
DEBUG [main] ====>  Preparing: SELECT * FROM TB_CARD WHERE ID =  ?
DEBUG [main] ====> Parameters: 1(Integer)
DEBUG [main] <====      Total: 1
DEBUG [main] <==      Total: 1
Person [id=1, name=jack, sex=男, age=23]
Card [id=1, code=432801198009191038]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 注解开发一对一关系可以使用 `@One` 注解和 `@Result` 注解来实现。 首先,我们需要在父实体类中添加一个子实体类的属性。比如,我们有一个 User 实体类和一个 Order 实体类,它们之间是一对一的关系,那么我们需要在 User 实体类中添加一个 Order 实体类的属性: ```java public class User { private Integer id; private String name; private Integer age; private Order order; // getter和setter方法 } ``` 接着,我们需要在 SQL 映射文件中编写 SQL 语句,并使用 `@One` 注解和 `@Result` 注解来映射一对一关系。例如,我们可以这样编写 SQL 语句: ```xml <select id="getUserById" resultMap="userResultMap"> SELECT u.id, u.name, u.age, o.id AS order_id, o.order_no, o.order_date FROM user u LEFT JOIN `order` o ON u.id = o.user_id WHERE u.id = #{id} </select> ``` 其中,`resultMap` 属性指定了使用哪个结果映射器,我们需要在结果映射器中使用 `@One` 注解和 `@Result` 注解来映射 Order 实体类。例如: ```xml <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <one property="order" fetchType="lazy" select="getOrderById"/> </resultMap> <resultMap id="orderResultMap" type="Order"> <id column="order_id" property="id"/> <result column="order_no" property="orderNo"/> <result column="order_date" property="orderDate"/> </resultMap> ``` 在上面的结果映射器中,我们使用了 `@One` 注解和 `@Result` 注解来映射 Order 实体类。其中,`property` 属性指定了 User 实体类中的 Order 实体类属性名,`fetchType` 属性指定了懒加载方式,`select` 属性指定了查询 Order 实体类的 SQL 语句。 最后,我们需要在 SQL 映射文件中编写查询 Order 实体类的 SQL 语句,并使用 `@ResultMap` 注解关联两个结果映射器: ```xml <select id="getOrderById" resultMap="orderResultMap"> SELECT id AS order_id, order_no, order_date FROM `order` WHERE id = #{id} </select> ``` 完成上述步骤后,我们就可以使用 MyBatis 注解开发一对一关系了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值