Spring Boot开发之Mybatis1对1查询

Spring Boot开发之Mybatis 1对1查询


关联查询一对一查询是最基础的关联查询知识,何谓一对一。比如本文要讲到的例子,学生去图书馆借书的例子,有一个表叫做tb_user表示学生的信息,另一个表表示tb_book,那么假定每个人只能借一本书,那么两个表之间的关系就是一对一的,即一本书只能借给一个人,一个人只能借一本书。所以相对来说,一对一的关联查询,逻辑比较清晰,容易理解。

一、准备工作

1、打开MySQL Workbench(这是我的数据库工具,大家可以使用其他的可视化工具,都可),在class表所属的数据库下新建idcard表,字段名有id,stuid,classname,id设置为主键和自动递增;在class表中增加一个idcardid字段用来记录关联的idcard表的id,记住class表的idcardid的值一定要与idcard表中id的值相对应!!!

在这里插入图片描述
在这里插入图片描述

2、往idcard表中添加一些数据

在这里插入图片描述

二、准备工作完成后,我们开始写代码,首先实现查询操作

1、打开上次的springboot项目,在pojo文件夹下新建Idcard实体类

在这里插入图片描述

package com.example.springboot2.pojo;

import lombok.Data;

@Data
public class Idcard {
    
    
    private int id;
    private String stuid;
    private String classname;
}

2、修改Person实体类

在这里插入图片描述

    private Idcard idcardid;

3、修改dao层PersonMapper类

在这里插入图片描述

    public List<Person> findAllPersonIdcard();

4、修改PersonMapper.xml

在这里插入图片描述

    <select id="findAllPersonIdcard" resultMap="personIdcard">
        select class.*,idcard.stuid,idcard.classname
        from springboot.class,springboot.idcard
        where class.idcardid=idcard.id;
    </select>
    <resultMap id="personIdcard" type="com.example.springboot2.pojo.Person">
        <id column="id" property="id"></id>
        <result column="age" property="age"></result>
        <result column="name" property="name"></result>
        <!--association将多个数据库字段映射到一个实体类  Idcrad-> javaType实体类型-->
        <association property="idcardid" javaType="com.example.springboot2.pojo.Idcard">
            <id column="idcardid" property="id"></id>
            <result column="stuid" property="stuid"></result>
            <result column="classname" property="classname"></result>
        </association>
    </resultMap>

5、修改service层PersonServiceImpl实现类

在这里插入图片描述

package com.example.springboot2.service.impl;


import com.example.springboot2.dao.PersonMapper;
import com.example.springboot2.pojo.Person;
import com.example.springboot2.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PersonServiceImpl implements PersonService {
    
    
    @Autowired
    PersonMapper personMapper;

    @Override
    public List<Person> findAllPerson(){
    
    
        return personMapper.findAllPersonIdcard();
    }

    @Override
    public int deletePersonById(Integer id) {
    
    
        return personMapper.deletePersonById(id);
    }

    @Override
    public int addPerson(Person person) {
    
    
        return personMapper.addPerson(person);
    }

    @Override
    public int updatePerson(Person person) {
    
    
        return personMapper.updatePerson(person);
    }
}

6、修改personlist.html

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<a th:href="@{/addperson}">增加页面</a>
<table border="1">
    <tr>
        <td>学生id</td>
        <td>学生年龄</td>
        <td>学生姓名</td>
        <td>学生学号</td>
        <td>学生班级</td>
        <td>删除</td>
        <td>更新</td>
    </tr>
    <tr th:each="person:${personlist}">
        <td th:text="${person.id}">学生id</td>
        <td th:text="${person.age}">学生年龄</td>
        <td th:text="${person.name}">学生姓名</td>
        <td th:text="${person.idcardid.stuid}">学生学号</td>
        <td th:text="${person.idcardid.classname}">学生班级</td>


        <th>
            <a th:href="@{deletepersonbyid(id=${person.id},idcardid=${person.idcardid.id})}">删除学生</a>
            <!--            <a th:href="@{'deletepersonbyid?id='+${person.id}+'&idcardid='+${person.idcardid.id}}">删除学生</a>-->
        </th>
        <th>
            <a th:href="@{/updateperson(id=${person.id},age=${person.age},name=${person.name})}">更新学生</a>
        </th>

    </tr>
</table>
</body>
</html>

7、点击运行,查询成功!

在这里插入图片描述

三、查询方法2–级联查询

1、在dao层新建IdcardMapper类

在这里插入图片描述

package com.example.springboot2.dao;

import com.example.springboot2.pojo.Idcard;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface IdcardMapper {
    
    
    public Idcard findIdcardById(Integer id);
}

2、在resources文件夹下的mappers文件夹下新建IdcardMapper.xml

在这里插入图片描述

<?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.example.springboot2.dao.IdcardMapper">
  <select id="findIdcardById" resultType="com.example.springboot2.pojo.Idcard" parameterType="Integer">
    select * from idcard where id=#{id}
  </select>
</mapper>

3、修改PersonMapper类

在这里插入图片描述

    public List<Person> findAllPersonIdcard2();

4、修改PersonMapper.xml

在这里插入图片描述

    <!--    级联查询-->
    <select id="findAllPersonIdcard2" resultMap="personIdcard2">
        select * from class
    </select>
    <resultMap id="personIdcard2" type="com.example.springboot2.pojo.Person">
        <id column="id" property="id"></id>
        <result column="age" property="age"></result>
        <result column="name" property="name"></result>
        <!--        select查询方法 column将class表查询出来的idcardid字段传到findIdcardById方法中-->
        <association property="idcardid" javaType="com.example.springboot2.pojo.Idcard" column="idcardid"
                     select="com.example.springboot2.dao.IdcardMapper.findIdcardById">

        </association>
    </resultMap>

5、修改PersonServiceImpl实现类

在这里插入图片描述

    @Override
    public List<Person> findAllPerson(){
    
    
        return personMapper.findAllPersonIdcard2();
    }

6、点击运行,级联查询成功!

在这里插入图片描述

四、增加数据

1、修改IdcardMapper类

在这里插入图片描述

    public int addIdcard(Idcard idcard);

2、修改IdcardMapper.xml

在这里插入图片描述

  <!--  useGeneratedKeys 增加的数据主键返回  keyProperty 返回的主键赋值给参数idcard的属性-->
  <insert id="addIdcard" parameterType="com.example.springboot2.pojo.Idcard" useGeneratedKeys="true" keyProperty="id">
    insert into idcard(stuid,classname) values (#{stuid},#{classname})
  </insert>

3、修改PersonMapper.xml

在这里插入图片描述

<!--&lt;!&ndash;如果参数是对象类型 对象类型可以省略&ndash;&gt;-->
    <insert id="addPerson" parameterType="com.example.springboot2.pojo.Person">
        insert into class(name,age,idcardid) values (#{name},#{age},#{idcardid.id})
    </insert>

4、修改PersonServiceImpl实现类

在这里插入图片描述

    @Autowired
    IdcardMapper idcardMapper;

    @Override
    public int addPerson(Person person) {
    
    
//        第一步:先增加idcard表数据
        int result1= idcardMapper.addIdcard(person.getIdcardid());//往idcard表增加数据
//        第二步:再增加class表数据
        int result2= personMapper.addPerson(person);//往class表增加数据
        if(result1>0 && result2>0) {
    
    
            return result1;
        }
        return 0;
    }

5、修改addPerson.html

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>增加用户</h1>
<form th:action="@{/addpersoncommit}" method="post">
    <div>用户名:<input name="name"></div>
    <div>年龄:<input name="age"></div>
    <div>学号:<input name="idcardid.stuid"></div>
    <div>班级:<input name="idcardid.classname"></div>
    <div><input type="submit" value="提交"></div>
</form>
</body>
</html>

6、点击运行,访问addperson界面增加数据成功!

在这里插入图片描述

在这里插入图片描述

五、删除数据

1、修改IdcardMapper类

在这里插入图片描述

    public int deleteIdcardById(Integer id);

2、修改IdcardMapper.xml

在这里插入图片描述

  <!--    返回值如果是基本类型可省略  parameterType配置参数的类型-->
  <delete id="deleteIdcardById" parameterType="Integer">
    delete from idcard where id=#{id}
  </delete>

3、修改PersonService类

在这里插入图片描述

    public int deletePersonById(Integer id,Integer idcardid);

4、修改PersonServiceImpl实现类

在这里插入图片描述

    @Override
    public int deletePersonById(Integer id,Integer idcardid) {
    
    
//        删除操作要么同时删除成功,要么同时删除失败   ->事务
        idcardMapper.deleteIdcardById(idcardid);//操作成功
        return personMapper.deletePersonById(id);//操作失败
//        int result1=idcardMapper.deleteIdcardById(idcardid);
//        int result2=personMapper.deletePersonById(id);
//        if(result1>0 && result2>0) {
    
    
//            return result2;
//        }
//        return 0;
    }

5、修改PersonController类

在这里插入图片描述

    @RequestMapping("deletepersonbyid")
    public String deletePersonById(int id,int idcardid){
    
    
        personService.deletePersonById(id,idcardid);
        return "redirect:/personlist";
    }

6、修改personlist.html

在这里插入图片描述

        <th>
            <a th:href="@{deletepersonbyid(id=${person.id},idcardid=${person.idcardid.id})}">删除学生</a>
<!--            <a th:href="@{'deletepersonbyid?id='+${person.id}+'&idcardid='+${person.idcardid.id}}">删除学生</a>-->
        </th>

7、点击运行,删除数据成功!

在这里插入图片描述

六、资源下载

下载地址:Spring Boot开发之Mybatis1对1查询

猜你喜欢

转载自blog.csdn.net/qq_61963074/article/details/127538881