zoukankan      html  css  js  c++  java
  • Mybatis学习——一对一关联表查询

    1.SQL语句建表

     1 CREATE TABLE teacher(
     2 t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20)
     3 );
     4 CREATE TABLE class(
     5 c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20),
     6 teacher_id INT
     7 );
     8 ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
     9 INSERT INTO teacher(t_name) VALUES('LS1'); INSERT INTO teacher(t_name) VALUES('LS2');
    10 INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1); INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);
    sql

    2.实体类

     1 package com.zhengbin.entity;
     2 
     3 public class Teacher {
     4     private int id;
     5     private String name;
     6     public int getId() {
     7         return id;
     8     }
     9     public void setId(int id) {
    10         this.id = id;
    11     }
    12     public String getName() {
    13         return name;
    14     }
    15     public void setName(String name) {
    16         this.name = name;
    17     }
    18     @Override
    19     public String toString() {
    20         return "Teacher [id=" + id + ", name=" + name + "]";
    21     }
    22     public Teacher(int id, String name) {
    23         super();
    24         this.id = id;
    25         this.name = name;
    26     }
    27     public Teacher() {
    28         super();
    29         // TODO Auto-generated constructor stub
    30     }
    31 }
    Teacher.java
     1 package com.zhengbin.entity;
     2 
     3 public class Classes {
     4     private int id;
     5     private String name;
     6     private Teacher teacher;
     7     @Override
     8     public String toString() {
     9         return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher + "]";
    10     }
    11     public Classes() {
    12         super();
    13     }
    14     public int getId() {
    15         return id;
    16     }
    17     public void setId(int id) {
    18         this.id = id;
    19     }
    20     public String getName() {
    21         return name;
    22     }
    23     public void setName(String name) {
    24         this.name = name;
    25     }
    26     public Teacher getTeacher() {
    27         return teacher;
    28     }
    29     public void setTeacher(Teacher teacher) {
    30         this.teacher = teacher;
    31     }
    32 }
    Classes.java

    3.实体类映射文件

      两种方式:

        1. 联表查询

          关键是返回值的设置

        2. 执行两次查询

          关键是返回值的设置,和第二次查询所需参数的传递

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <!-- 每个映射文件的namespace应该是唯一的 -->
     4 <mapper namespace="com.zhengbin.entity.classMapper">
     5     <!-- parameterType 参数表示需要参数的类型 -->
     6     <!-- resultType 参数表示返回结果的类型,该可以写为实体包的全路径,或者在conf.xml配置文件中,声明实体的别名 -->
     7     
     8     <!-- 
     9         方式一:
    10             嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 封装联表查询的数据(去除重复的数据)
    11      -->
    12     <select id="getClass" parameterType="int" resultMap="getClassMap">
    13         select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id};
    14     </select>
    15     <resultMap type="Classes" id="getClassMap">
    16         <id property="id" column="c_id"/>
    17         <result property="name" column="c_name"/>
    18         <association property="teacher" javaType="Teacher">
    19             <id property="id" column="t_id"/>
    20             <result property="name" column="t_name"/>
    21         </association>
    22     </resultMap>
    23     <!-- 
    24         方式二:
    25             嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型 
    26                     SELECT * FROM class WHERE c_id=1;
    27                     SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的 teacher_id 的值
    28      -->
    29      <select id="getClass2" parameterType="int" resultMap="getClass2Map">
    30          select * from class where c_id=#{id}
    31      </select>
    32      <select id="getTeacher" parameterType="int" resultType="Teacher">
    33          select t_id id,t_name name from teacher where t_id=#{id}
    34      </select>
    35      <resultMap type="Classes" id="getClass2Map">
    36          <id property="id" column="c_id"/>
    37          <result property="name" column="c_name"/>
    38          <association property="teacher" select="getTeacher" column="teacher_id"/>
    39      </resultMap>
    40 </mapper>
    classMapper.xml

    4.测试类

     1 package com.zhengbin.test;
     2 
     3 import org.apache.ibatis.session.SqlSession;
     4 import org.apache.ibatis.session.SqlSessionFactory;
     5 
     6 import com.zhengbin.entity.Classes;
     7 import com.zhengbin.util.MyBatisUtils;
     8 
     9 public class Test3 {
    10     @org.junit.Test
    11     public void getTeacher(){
    12         SqlSessionFactory sessionFactory = MyBatisUtils.getFactory();
    13         // 参数为TRUE,相当于session.commit();
    14         SqlSession session = sessionFactory.openSession(true);
    15         // 读取映射文件
    16         String statement = "com.zhengbin.entity.classMapper" + ".getClass";
    17 //        String statement = "com.zhengbin.entity.classMapper" + ".getClass2";
    18         Classes c = session.selectOne(statement,1);
    19         System.out.println(c);
    20         session.close();
    21     }
    22 }
    Test3.java

    5.几个关键的属性

    association : 用于一对一的关联查询
    property : 对象属性的名称
    javaType : 对象属性的类型
    column : 所对应的外键字段名称
    select : 使用另一个查询封装的结果
  • 相关阅读:
    过滤器详解
    Servlet-----response.getWriter().write()与out.print()的区别
    电子凭证 : Java 生成 Pdf
    Servlet生命周期与工作原理(转载)
    【转载】(String)、toString、String.valueOf的区别
    开发过程中关于JSON的那些事
    UEditor问题整理
    SUBSTR函数
    SQL中 decode()函数简介
    合并单元格相关问题
  • 原文地址:https://www.cnblogs.com/zhengbin/p/5268013.html
Copyright © 2011-2022 走看看