举个例子
我们有一个员工表,和一个部门表,一个部门包括多个员工,而一个员工只属于一个部门。所以在员工表添加外键约束,将员工的部门编号与部门表的编号绑定。
create table dept(
id int primary key ,
name varchar(50)
);
create table emp(
id int primary key ,
name varchar(50),
age int ,
dept_id int,
constraint foreign key(dept_id) references dept(id)
);
接着我们写一个插入员工的功能,首先写实体类
public class Dept {
private int id;
private String name;
@Override
public String toString() {
return "Dept{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Emp {
private int id;
private String name;
private int age;
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", dept=" + dept +
'}';
}
}
接着写接口
package cn.sjxy.employee_springboot.dao;
import cn.sjxy.employee_springboot.domain.Dept;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface DeptMapper {
public Dept findById(int id);
}
package cn.sjxy.employee_springboot.dao;
import cn.sjxy.employee_springboot.domain.Emp;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public void insert(Emp emp);
}
接下来写映射文件mapper,这里的values(#{id},#{name},#{age},#{dept.id}中的dept.id最为关键
<?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="cn.sjxy.employee_springboot.dao.UserMapper">
<insert id="insert" parameterType="emp">
insert into emp values(#{id},#{name},#{age},#{dept.id})
</insert>
</mapper>
接着写控制层
@Controller
public class EmpController {
@Autowired
private UserMapper userMapper;
@RequestMapping(value="/insert",method = RequestMethod.POST)
public String insert(Emp emp){
userMapper.insert(emp);
return "redirect:/find";
}
}
下面写jsp页面, 部门:input name="dept.id"中的dept.id就是本文的重点。
<html>
<head>
<title>insert</title>
</head>
<body>
<form action="/insert" method="post">
id:<input name="id" type="text">
<br>
姓名:<input name="name" type="text">
<br>
age:<input name="age" type="number">
<br>
部门:<input name="dept.id">
<button type="submit">提交</button>
</form>
</body>
</html>
其实本质上就是form表单通过input标签的name属性,来匹配实体类的属性,而实体类就是根据数据库设计的,因此name属性一般会和数据库中#{}中的内容一致。
而员工表的外键值本来就是绑定在部门表的id上的,因此用dept.id来表示员工所在部门的编号。如果直接在映射文件的#{}中写dept_id,在jsp页面也这么写,就会出现属性不匹配问题,因为实体类没有dept_id属性。