有2个实体:用户、会员卡,一个用户只能办理一张会员卡,即一对一。

user_tb :

需要在一方引入另一方的主键作为外键。

card_tb:


使用扩展类

(1)在pojo包下新建User类:

package com.chy.pojo;

public class User {
private Integer id; //主键
private String name; //姓名
private String tel; //手机号
private String address; //地址 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 getTel() {
return tel;
} public void setTel(String tel) {
this.tel = tel;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
", address='" + address + '\'' +
'}';
}
}

(2)在pojo包下新建User的扩展类UserExt,继承User,并把Card的属性添加进来,提供对应的getter、setter方法。

package com.chy.pojo;

public class UserExt extends User {
private Integer no;
private float money; public Integer getNo() {
return no;
} public void setNo(Integer no) {
this.no = no;
} public float getMoney() {
return money;
} public void setMoney(float money) {
this.money = money;
} @Override
public String toString() {
return super.toString()+",Card{" +
"no=" + no +
", money=" + money +
'}';
}
}

先alt+insert插入toString(),再拼接上User的toString(),然后修改下就ok。

(3)编写UserMapper接口、UserMapper.xml

package com.chy.mapper;

import com.chy.pojo.UserExt;

public interface UserMapper {
public UserExt queryUserExtById(Integer id);
}
<?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.chy.mapper.UserMapper">
<select id="queryUserExtById" parameterType="integer" resultType="userext">
SELECT user_tb.*,card_tb.* FROM user_tb,card_tb WHERE user_tb.id=#{id} AND user_tb.card_no=card_tb.no
</select>
</mapper>

(4)使用

package com.chy.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.IOException;
import java.io.InputStream; public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory; static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
     SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserExt userExt = mapper.queryUserExtById(1);
System.out.println(userExt);
sqlSession.close();

使用扩展类可以实现一对一的关联查询,但没有体现实体之间的关联关系(一个模型中包含另一个模型)。


使用嵌套查询

(1)给2个“一”都编写pojo类,需要在一个“一”中关联另一个“一”

package com.chy.pojo;

public class User {
private Integer id; //主键
private String name; //姓名
private String tel; //手机号
private String address; //地址
private Card card; //与之关联的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 String getTel() {
return tel;
} public void setTel(String tel) {
this.tel = tel;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public Card getCard() {
return card;
} public void setCard(Card card) {
this.card = card;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
", address='" + address + '\'' +
", card=" + card +
'}';
}
}
package com.chy.pojo;

public class Card {
private Integer no; //会员卡编号
private Float money; //余额 public Integer getNo() {
return no;
} public void setNo(Integer no) {
this.no = no;
} public Float getMoney() {
return money;
} public void setMoney(Float money) {
this.money = money;
} @Override
public String toString() {
return "Card{" +
"no=" + no +
", money=" + money +
'}';
}
}

外键是用来辅助sql操作的,并不是实体的属性,所以pojo类一般不包含外键字段。

(2)给这2个pojo类都编写Mapper接口、xml映射文件

public interface CardMapper {
public Card queryCardByUserId(Integer no);
}
<?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.chy.mapper.CardMapper">
<select id="queryCardByNo" parameterType="integer" resultType="card">
SELECT * FROM card_tb WHERE no=#{no}
</select>
</mapper>
package com.chy.mapper;

import com.chy.pojo.User;

public interface UserMapper {
public User queryUserById(Integer id);
}
<?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.chy.mapper.UserMapper">
<select id="queryUserById" parameterType="integer" resultMap="userResultWithCard">
SELECT * FROM user_tb WHERE id=#{id}
</select>
<resultMap id="userResultWithCard" type="user">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="tel" column="tel"/>
<result property="address" column="address"/>
<association property="card" select="com.chy.mapper.CardMapper.queryCardByNo" column="card_no" javaType="card" />
   </resultMap>
</mapper>

sql语句都是查询当前pojo类对应的数据表,但主动嵌套的查询要使用resultMap来设置关联对象的映射,被嵌套的查询则不必设置。

  • property指定表示关联对象的成员变量名
  • select指定要嵌套的查询(namespace+id),执行当前查询时,会自动嵌套指定的<select>进行查询
  • column指定要把当前pojo类对应的数据表的哪一列作为参数传递给select嵌套的查询。
  • javaType指定嵌套的查询返回的数据类型

(3)使用

package com.chy.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.IOException;
import java.io.InputStream; public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory; static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
package com.chy.test;

import com.chy.mapper.UserMapper;
import com.chy.pojo.User;
import com.chy.utils.MyBatisUtils;
import org.apache.ibatis.session.*;
import java.io.IOException; public class Test {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
sqlSession.close();
}
}

使用嵌套查询体现了实体之间的关联关系,但一条查询会触发另一个与之关联的查询,另一个查询如果有与之关联的查询,也会触发.....可能引发链式反应,降低查询效率和数据库的性能。


使用嵌套结果

使用方式与嵌套查询大体相同,不同的只有第二步:

(二)编写UserMapper接口、UserMapper.xml

package com.chy.mapper;

import com.chy.pojo.User;

public interface UserMapper {
public User queryUserById(Integer id);
}
<?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.chy.mapper.UserMapper">
<select id="queryUserById" parameterType="integer" resultMap="userResultWithCard">
SELECT user_tb.*,card_tb.* FROM user_tb,card_tb WHERE user_tb.id=#{id} AND user_tb.card_no=card_tb.no
</select>
<resultMap id="userResultWithCard" type="user">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="tel" column="tel"/>
<result property="address" column="address"/>
<association property="card" javaType="card">
<id property="no" column="no"/>
<result property="money" column="money"/>
</association>
</resultMap>
</mapper>

因为只查询一次,所以要选取所有需要的数据。

<association>指定与之关联的实体的映射。

  • property表示关联对象的成员变量名
  • javaType指定返回的数据类型,mybatis根据javaType找到关联对象对应的pojo类。

嵌套结果只需指定2个属性,而嵌套查询要用select指定嵌套的<select>,还需要用column向嵌套的查询传递参数,所以嵌套查询需要指定4个属性。

MyBatis 关联查询的实现:一对一的更多相关文章

  1. MyBatis关联查询,一对一关联查询

    数据库E-R关系 实体类 public class City { Long id; String name; Long countryId; Date lastUpdate; } public cla ...

  2. MyBatis基础:MyBatis关联查询(4)

    1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...

  3. MyBatis关联查询,一对多关联查询

    实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collect ...

  4. MyBatis关联查询、多条件查询

    MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...

  5. mybatis关联查询基础----高级映射

    本文链接地址:mybatis关联查询基础----高级映射(一对一,一对多,多对多) 前言: 今日在工作中遇到了一个一对多分页查询的问题,主表一条记录对应关联表四条记录,关联分页查询后每页只显示三条记录 ...

  6. Mybatis关联查询和数据库不一致问题分析与解决

    Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...

  7. mybatis 关联查询实现一对多

    场景:最近接到一个项目是查询管理人集合  同时每一个管理人还存在多个出资人   要查询一个管理人列表  每个管理人又包含了出资人列表 采用mybatis关联查询实现返回数据. 实现方式: 1 .在实体 ...

  8. Mybatis关联查询之二

    Mybatis关联查询之多对多 多对多 一.entity实体类 public class Student { private Integer stuid; private String stuname ...

  9. MyBatis关联查询和懒加载错误

    MyBatis关联查询和懒加载错误 今天在写项目时遇到了个BUG.先说一下背景,前端请求更新生产订单状态,后端从前端接收到生产订单ID进行查询,然后就有问题了. 先看控制台报错: org.apache ...

  10. mybatis关联查询,一对一,一对多

    注:这篇文章的代码有部分删减,不能直接使用,不过关键代码都存在  应用场景: 想用mybatis做关联查询,并且把查询出的数据自动组装成对象可以使用关联查询. 1.一对一实现 例如:一部小说,属于一个 ...

随机推荐

  1. 084、Java数组之实现数组复制

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. Redis的下载与安装

    1). 从官网上下载Redis的压缩包   2). 将压缩包解压到 某个指定的文件目录中         tar -xzvf redis-4.0.9.tar.gz  /xx/xx/xx_dir   3 ...

  3. 今日份学习:初步的springboot

    今日记录 今日份BUG清单 flyway的sql文件有两个下划线 __ , _ 是不可以的. 高版本的freemarker默认的扩展名变成了flth,而不是ftl 今日份用到的网址 1. freema ...

  4. POJ1471 Tree/洛谷P4178 Tree

    Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...

  5. Windows驱动开发-_DRIVER_OBJECT结构体

    每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的,内核对一个驱动只加载一个实例,是由内核中的I/O管理器负责加载的,驱动程序需要在Driver ...

  6. 搭建python的开发环境(采用eclipse的开发工具)在线和离线安装pyDev

    一.首先下载python的开发环境并安装 在这里下载python3.7.2,然后安装在一个指定文件夹,随后,将安装路径配置到环境变量中 验证是否成功 OK! 二.在线安装pyDev工具 三.导入开发环 ...

  7. uni app中关于图片的分包加载

    因为在项目中使用了大量的静态资源图片,使得主包体积过大, 而把这些图片全部放到服务器又有点麻烦,就想能不能把图片也分包,但是直接放在分包下的话导致图片资源找不到了, 在社区中看到大佬分享的十分有用,特 ...

  8. Day5 - D - Conscription POJ - 3723

    Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...

  9. Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32

    安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...

  10. Spring boot application.properties和 application.yml 初学者的学习

    来自于java尚硅谷教程 简单的说这两个配置文件更改配置都可以更改默认设置的值比如服务器端口号之类的,只需再文件中设置即可, properties可能是出现的比较早了,如果你不调你的默认编码,中文可能 ...