Spring Boot开发之Mybatis 1对1查询
- 一、准备工作
- 1、打开MySQL Workbench(这是我的数据库工具,大家可以使用其他的可视化工具,都可),在class表所属的数据库下新建idcard表,字段名有id,stuid,classname,id设置为主键和自动递增;在class表中增加一个idcardid字段用来记录关联的idcard表的id,记住class表的idcardid的值一定要与idcard表中id的值相对应!!!
- 2、往idcard表中添加一些数据
- 二、准备工作完成后,我们开始写代码,首先实现查询操作
- 1、打开上次的springboot项目,在pojo文件夹下新建Idcard实体类
- 2、修改Person实体类
- 3、修改dao层PersonMapper类
- 4、修改PersonMapper.xml
- 5、修改service层PersonServiceImpl实现类
- 6、修改personlist.html
- 7、点击运行,查询成功!
- 三、查询方法2--级联查询
- 1、在dao层新建IdcardMapper类
- 2、在resources文件夹下的mappers文件夹下新建IdcardMapper.xml
- 3、修改PersonMapper类
- 4、修改PersonMapper.xml
- 5、修改PersonServiceImpl实现类
- 6、点击运行,级联查询成功!
- 四、增加数据
- 1、修改IdcardMapper类
- 2、修改IdcardMapper.xml
- 3、修改PersonMapper.xml
- 4、修改PersonServiceImpl实现类
- 5、修改addPerson.html
- 6、点击运行,访问addperson界面增加数据成功!
- 五、删除数据
- 1、修改IdcardMapper类
- 2、修改IdcardMapper.xml
- 3、修改PersonService类
- 4、修改PersonServiceImpl实现类
- 5、修改PersonController类
- 6、修改personlist.html
- 7、点击运行,删除数据成功!
- 六、资源下载
关联查询一对一查询是最基础的关联查询知识,何谓一对一。比如本文要讲到的例子,学生去图书馆借书的例子,有一个表叫做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
<!--<!–如果参数是对象类型 对象类型可以省略–>-->
<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、点击运行,删除数据成功!