MyBaits一对一的查询方法

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();
    }

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

时间: 2024-10-09 13:54:40

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

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

如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true)->where($where)->order('blogid desc')->limit($Page->firstRow.','.$Page->listRows)->select(); $sql = $db->getLastSql(); 输出的sql语句为: SELE

MyBatis 使用接口增删改查和两表一对一级联查询

导包 总配置文件 <?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"> <configuration> <properties re

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

创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[email protected]@UNIQU

几种查询方法(lambda Linq Enumerable静态类方式)

1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class Data { public static List<Student> studentLi

Spring Data学习笔记-查询方法

Spring Data支持类似Hibernate的查询语句,也可以写原生SQL语句,下面记录典型的例子. /**  * 1. Repository 是一个空接口. 即是一个标记接口  * 2. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean.  * 纳入到 IOC 容器中. 进而可以在该接口中定义满足一定规范的方法.   *   * 3. 实际上, 也可以通过 @RepositoryDefinition 注解来替代继承 Rep

数据库基本查询方法等

数据库:数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式.数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用. 我们简单地学习了数据库的基本的创建方法和简单地查询方法: 创建: create语句: 如: create database f21; create t

SQL数据库查询方法

SQL数据库查询方法 简单查询: 一.投影 select * from 表名 select 列1,列2... from 表名 select distinct 列名 from 表名 二.筛选 select top 数字 列|* from 表名 (一)等值与不等值 select * from 表名 where 列名=值 select * from 表名 where 列名!=值 select * from 表名 where 列名>值 select * from 表名 where 列名<值 selec

使用ResultSet,写了一个通用的查询方法

此方法很烂,以后优化 /** * 通用的查询方法:SELECT */ @SuppressWarnings({ "unchecked", "rawtypes" }) public List testResultSet(String sql) { Connection connection = null; Statement statement = null; ResultSet rs = null; try { // 1.获取Connection connection

Oracle数据库锁表的查询方法以及解锁的方法

1,锁表语句简单查询方法   select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time 2,对于上面查询的结果来解锁,如下所示 alter system kill session '382,1125'   3,锁表详细信息查询   select dba_objects.object