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. mysql 备份软件 Xtrabackup 的 xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info 文件区别

    今天在操作 innobackupex 的时候,执行 change master to 的时候发现  xtrabackup_binlog_pos_innodb   xtrabackup_binlog_i ...

  2. js 数组遍历for..in弊端

    //for..in在数组中的弊端 原则上数组Array对象是不能操作的,但是有些程序员开始不注意把Array的原型链上添加了方法就会出现意想不到的bug //例如 ,,]; Array.prototy ...

  3. 用nifi executescript 生成3小时间隔字符串

    import java.io from datetime import datetime from org.apache.commons.io import IOUtils from java.nio ...

  4. array new 与 array deletedelete

    以前在看C++书和上C++课的时候可以看到 delete[] pointer; 的用法,而大多数对于这个用法没有具体的解释,多是看到: 有一个delete运算符的特殊语法,可以释放动态分配的数组内存: ...

  5. 一个空行引起的阿里云负载均衡上部署https证书的问题

    今天在阿里云上购买了WoSign的https证书,在证书签发后,在控制台下载证书文件,一共有2个文件,一个是.key文件(私钥文件),一个是.pem文件(证书文件). 然后在阿里云负载均衡“证书管理” ...

  6. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  7. hadoop学习笔记:zookeeper学习(上)

    在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookeeper的一些基本的应用,同时我 ...

  8. Git学习笔记(7)——多人协作

    本文主要记录了,多人协作时,产生冲突时的解决情况. 多人环境创建 首先我们需要模拟一个多人环境.前面的Git的学习都是在Ubuntu上面,现在我们也搭建一个win环境吧.安装win环境下的Git,很简 ...

  9. Java-数组练习1

    1.已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7}:把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2]:最后输出数组b的元素. ...

  10. Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结

    karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然后才可以安装karma.nodejs,npm的安装过程可以参考文章:Angularjs学习- ...