在项目开发中,会存在一对一的关系,比如一个人只有一个身份证,一个身份证只能给一个人使用,这就是一对一关系。一对一关系使用主外键关联。

table.sql,在数据库中创建如下两个表并插入数据

CREATE TABLE T_CARD(
ID INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(20)
);
INSERT INTO T_CARD(CODE)VALUES('130113198701274657'); CREATE TABLE T_PERSON(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) DEFAULT NULL,
SEX CHAR(20) DEFAULT NULL,
AGE INT(11) DEFAULT NULL,
CARD_ID INT UNIQUE,
FOREIGN KEY(CARD_ID) REFERENCES T_CARD(ID)
);
INSERT INTO T_PERSON(NAME,SEX,AGE,CARD_ID) VALUES('张三','男','23',1);

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>
<!-- 指定 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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.47.151:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
<mappers>
<mapper resource="mapper/CardMapper.xml"/>
<mapper resource="mapper/PersonMapper.xml"/>
</mappers>
</configuration>

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">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="com.rookie.bigdata.mapper.PersonMapper"> <parameterMap type="com.rookie.bigdata.domain.Person" id="parameterPersonMap">
<parameter property="id"/>
<parameter property="name"/>
<parameter property="sex"/>
<parameter property="age"/>
</parameterMap> <insert id="insertPerson" parameterMap="parameterPersonMap">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
INSERT INTO t_person(name,sex,age,card_id)
VALUES(#{name},#{sex},#{age},#{card.id}) <!--记得不要有逗号-->
</insert> <!-- 根据id查询Person,返回resultMap -->
<select id="selectPersonById" parameterType="int"
resultMap="personMapper">
SELECT * from t_person where id = #{id}
</select> <!-- 映射Peson对象的resultMap -->
<resultMap type="com.rookie.bigdata.domain.Person" id="personMapper">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<!-- 一对一关联映射:association -->
<association property="card" column="card_id"
select="com.rookie.bigdata.mapper.CardMapper.selectCardById"
javaType="com.rookie.bigdata.domain.Card"/>
</resultMap> </mapper>

CardMapper.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">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="com.rookie.bigdata.mapper.CardMapper"> <!-- 根据id查询Card,返回Card对象 -->
<select id="selectCardById" parameterType="int" resultType="com.rookie.bigdata.domain.Card">
SELECT * from t_card where id = #{id}
</select> <parameterMap type="com.rookie.bigdata.domain.Card" id="cardMap">
<parameter property="id"/>
<parameter property="code"/>
</parameterMap> <insert id="insertCard" parameterMap="cardMap">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
INSERT INTO T_CARD(id,code)
VALUES(?,?)
</insert> </mapper>

Card.java

public class Card implements Serializable {

	private Integer id;  // 主键id
private String code; // 身份证编号
}

Person.java

public class Person implements Serializable {

	private Integer id;  // 主键id
private String name; // 姓名
private String sex; // 性别
private Integer age; // 年龄 // 人和身份证是一对一的关系,即一个人只有一个身份证
private Card card;

CardMapper.java

public interface CardMapper {

    void insertCard(Card card);

}

PersonMapper.java

public interface PersonMapper {

    /**
* 根据id查询Person
*/
Person selectPersonById(Integer id); /**
* 插入数据
* @param person
*/
void insertPerson(Person person); }

SqlSessionFactoryUtil.java

package com.rookie.bigdata.utils;

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 java.io.InputStream; public class SqlSessionFactoryUtil { private static SqlSessionFactory sqlSessionFactory = null; // 初始化创建SqlSessionFactory对象
static{
try {
// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
} // 获取SqlSession对象的静态方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
} // 获取SqlSessionFactory的静态方法
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
} }

测试代码进行增查操作

package com.rookie.bigdata.test;

import com.rookie.bigdata.domain.Card;
import com.rookie.bigdata.domain.Person;
import com.rookie.bigdata.mapper.CardMapper;
import com.rookie.bigdata.mapper.PersonMapper;
import com.rookie.bigdata.utils.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.Test; public class OneToOneTest { @Test
public void test() throws Exception {
// 创建Session实例
SqlSession session = SqlSessionFactoryUtil.getSqlSession(); // 获得mapper接口的代理对象
PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接调用接口的方法,查询id为1的Peson数据
Person p = pm.selectPersonById(1);
// 打印Peson对象
System.out.println(p);
// 打印Person对象关联的Card对象
System.out.println(p.getCard()); // 提交事务
session.commit();
// 关闭Session
session.close();
} @Test
public void test1() throws Exception {
SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Transaction tx = transactionFactory.newTransaction(sqlSession
.getConnection()); Card card = new Card();
card.setCode("130442154542048521"); Person person = new Person();
person.setName("lisi");
person.setSex("男");
person.setAge(30);
person.setCard(card); PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
CardMapper cardMapper = sqlSession.getMapper(CardMapper.class); cardMapper.insertCard(card);
personMapper.insertPerson(person); System.out.println(card.getId()); tx.commit(); } }

进行测试完美解决

mybatis关联映射一对一的更多相关文章

  1. 0049 MyBatis关联映射--一对一关系

    世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a.依赖use-a.关联has-a,反映在数据库中,则是表与表之间的关系,比如外键 关联关系存在着以下几种类型:一 ...

  2. spring boot(9)-mybatis关联映射

    一对多 查询type表的某一条数据,并且要同时查出所有typeid与之配置的user,最终要得到一个以下类型的Type对象 public class Type { String id; String ...

  3. Spring Boot (11) mybatis 关联映射

    一对多 查询category中的某一条数据,同时查询该分类下的所有Product. Category.java public class Category { private Integer id; ...

  4. Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  5. MyBatis学习(七)MyBatis关联映射之多对多映射

    对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...

  6. mybatis关联映射一对多

    实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...

  7. mybatis关联映射多对多

    项目开发中,多对多关系也是非常常见的关系 在数据库中创建表的脚本 table.sql CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, ...

  8. MyBatis(五):mybatis关联映射

    Mybatis中表与表之间的关系分为一下4类: 1)一对一 2)一对多 3)多对一 4)多对多 创建数据Demo表 数据库表: 用户表user:记录了购买商品的用户信息. 订单表orders:记录了用 ...

  9. MyBatis学习(六)MyBatis关联映射之一对多映射

    数据库中一对多通常使用主外键关联,外键应该在多方,即多方维护关系. 下面举一个简单实例来看看MyBatis怎么处理一对多的关系. 1.创建一个项目,导入所需jar包,导入db.properties配置 ...

随机推荐

  1. SpringBoot整合自定义FTP文件连接池

    说明:通过GenericObjectPool实现的FTP连接池,记录一下以供以后使用环境:JDK版本1.8框架 :springboot2.1文件服务器: Serv-U1.引入依赖 <!--ftp ...

  2. Eclipse调用Tomcat出错

    错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...

  3. debug模式不报错,release模式报错

    经常会 char * pMem = new char[icount]; 其中icount为变量,然后对该内存段猛的操作.release编译出来,出现莫名奇妙的错误.但是debug没问题. 后面查了别人 ...

  4. STM32F10x之NVIC

    转载自:https://www.jianshu.com/p/3aa5997fe794 1 异常类型 Cortex-M3内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(excep ...

  5. jvm堆、栈、String常量池

    原文地址:http://blog.csdn.net/tophawk/article/details/78704074 程序计数器:它的生命周期与线程相同,线程私有.较小的内存区域,用以完成分支.循环. ...

  6. Windbg Scratch Pad(便笺簿)窗口的使用

    “便笺簿”窗口是一个剪贴板,您可以在其中键入和保存文本. 打开便笺簿 通过菜单View--->Scratch Pad 通过快捷键Alt+8 通过工具栏 使用便笺簿 用上面的方式打开的窗口如下: ...

  7. IE与标准浏览器对事件处理的区别?(监听、阻止冒泡、阻止默认等)

    谷歌 IE:监听:addEventListener   attachEvent--------要在事件名称前面加on解绑:removeEventListener      detachEvent--- ...

  8. 【CSP-S膜你考】那23个路口

    那23个路口 题面 故事的起源不加赘述,那23个路口. 单刀直入,我直接说题的意思. 蚊子和疯子在做一件事,就是他们要在茫茫的大街上找一个出发点,然后从出发点开始,经过上下左右23次拐弯,到达一个他们 ...

  9. C语言中宏的相关知识

    2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串.格式如下: #define name(宏名) stuff(字符串) 本质就是使用宏名去替 ...

  10. 转载:EM算法的最精辟讲解

    机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么是神,因为神能做很多人做不了的事.那么EM ...