MyBaits一对一的查询方法

一:表数据与表结构

CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(20)
);
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES
teacher(t_id);
INSERT INTO teacher(t_name) VALUES('LS1');
INSERT INTO teacher(t_name) VALUES('LS2');
INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

二:基本准备

如上的sql可见,这里是一个一对一的表,一个老师,对应一个班级,那么,如果要用sql,把班级信息查出来(包含老师信息),那我们可以这样查:

方法一:

SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1

方法二:

select * from class where c_id=1
select * from teacher where t_id=1

Class实体类:

public class Classes {
private int id;
private String name;
private Teacher teacher;
} ..省略了get set方法,及默认构造方法

Teacher实体类:

public class Teacher {
private int id;
private String name;
}
省略了get set方法,及空构造方法

三:MyBaits一对一查询

3.1.使用第一种方法的sql来进行一对一查询

在实体类中也是可以看到的,Classes类中有着Teacher属性,所以这就是一个一对一的一个写法,所以在配置文件中,也要把这种关系给表达出来,下面给出配置文件的写法:

<?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="zxj.domain.ClassMapper">
<!-- 根据id来查询班级信息(带老师的信息) -->
<!-- 查询方法sql:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1 -->
<select id="getClass" parameterType="int" resultMap="getClassMap">
SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=#{id}
</select>
<!-- 在返回的结果集中,指定每一个列,对应的是哪一个对象,使用association标签来声明其它的对象,即一对一 -->
<resultMap type="zxj.domain.Classes" id="getClassMap">
<id property="id" column="c_id"/>
<result column="c_name" property="name"/>
<association property="teacher" javaType="zxj.domain.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
</mapper>

在上面的配置文件中,使用<resultMap>标签,可以把数据库中每一个字段,与java实体类中的字段对应,然后MyBaits就会知道它们的关系,然后就封装成对象。

下面来做一个测试:

/**
* 测试一对一的查询<br>
* 查询sql:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1
*/
@Test
public void testOneToOne() {
InputStream in = TestMybaits.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
String statement = "zxj.domain.ClassMapper.getClass";
Classes c = session.selectOne(statement, 1);
System.out.println(c);
session.close();
}

使用的方法还是如平常的使用是一样的

3.2.使用第二种的sql来进行一对一的查询

配置文件的写法:

<?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="zxj.domain.ClassMapper"> <!-- 另一种查询一对一的方法 -->
<!--
方法二:select * from class where c_id=1
select * from teacher where t_id=1(这里的t_id是上一条sql得到的id)
-->
<select id="getClass2" parameterType="int" resultMap="getClassMap2">
select * from class where c_id=#{id}
</select> <select id="getTeacher" parameterType="int" resultType="zxj.domain.Teacher">
<!-- 这里需要取别名,因为数据库中的字段,与实体类中的字段不一至,我们需要让它一至,才能封装成对象 -->
select t_id id,t_name name from teacher where t_id=#{id}
</select>
<resultMap type="zxj.domain.Classes" id="getClassMap2">
<id column="c_id" property="id"/>
<result column="c_name" property="name"/>
<!-- 实现原理是查询两次sql,第二次查询的条件是根据第一次查询的结果,下面的column属性就是要传过去查询的参数 -->
<association property="teacher" column="teacher_id" select="getTeacher" >
</association>
</resultMap>
</mapper>

它是要发出两条sql,第一条sql查class,第二条sql查teacher,但是第二条sql的条件是根据第一条sql查出的结果作为条件的。

测试:

    /**
* 方式二<br>
* 测试一对一的查询<br>
* 查询sql:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1
*/
@Test
public void testOneToOne2() {
InputStream in = TestMybaits.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
String statement = "zxj.domain.ClassMapper.getClass2";
Classes c = session.selectOne(statement, 1);
System.out.println(c);
session.close();
}

这样就完成了一对一的查询。

MyBaits一对一的查询方法的更多相关文章

  1. Mybatis学习4——一对一关联查询方法2------实体作为属性

    实体order和user采用resultMap order package pojo; import java.util.Date; public class Order { private Inte ...

  2. Mybatis学习4——一对一关联查询方法1--创建实体

    创建一个实体继承两个实体之一,另一个实体作为属性 实体1. order package pojo; import java.util.Date; public class Order { privat ...

  3. 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句

    如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...

  4. mybatis的动态sql编写以及一对一关系查询和一对多的查询

    创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis **************** ...

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

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

  6. mybatis 使用接口增删改查和两表一对一关联查询

    导包 总配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...

  7. MyBatis初级实战之五:一对一关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. tp5 中 model 的查询方法

    实例化模型后调用查询方法,可以写任何想要的查询(推荐) public function select(){ $user = model('User'); $data = $user -> ) - ...

  9. 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

随机推荐

  1. Android消息队列和Looper

    1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消息(Message)代表一个行为(what ...

  2. goalng 发布的版本中自动加上 git revision

    概述 起因是这样的,在编译发布 golang 工程时,希望版本号中包含有 git revision number. 但是,没有commit之前,是没法知道 revision number 的,comm ...

  3. IOS内测分发策略

    当苹果应用没有上交appstore审核,出于开始内侧阶段时,我们如何邀请别人测试和使用? plist苹果安装包实现 使用七牛云存储解决ios7.1的app部署问题 推荐两个现在比较流行的app内测辅助 ...

  4. Oracle常用函数笔记

    一.字符函数 1.dual 临时表 oracle中的临时变量表,此表只返回第一行第一列 例如:select sysdate from dual 输出:2014-6-9 11:20:39 2.Initc ...

  5. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  6. ListView设置headerview和footerview

    [简介]headerview就是通常看到的那种listview手势下滑露出上面的部分,下拉到一定位置,松手会开始请求网络数据,然后刷新listview的列表.footerview一般就是listvie ...

  7. 自定义样式的select下拉框深入探索

    第一个版本: 首先实现自定义select下拉框应该具有的功能,我是选择将原来的select隐藏掉,自己在jquery代码中动态写进去<dl><dd><dt>这样的结 ...

  8. 分离EF connectionString里的db连接串

    创建EF模型后,自动生成的connectionString如下: <add name="TravelPPEntities" connectionString="me ...

  9. jsp中运用application实现共享留言板功能

    jsp中application的知识点总结: 1.一个Web应用程序启动后,将会自动创建一个application对象,在整个应用程序的运行过程中只有这一个application对象,即所有访问该网站 ...

  10. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...