有时候在对数据库操作的时候,需要用到表之间的关系。多对一,一对多。一对一,多对多。今天我们来使用mybatis实现多对一。
首先创建两张表depe(部门表),emp(员工表)
CREATE TABLE `dept` (
`deptno` int(11) NOT NULL AUTO_INCREMENT,
`deptname` varchar(255) NOT NULL,
`loc` varchar(255) DEFAULT NULL,
PRIMARY KEY (`deptno`)
)
CREATE TABLE `emp` (
`empno` int(11) NOT NULL AUTO_INCREMENT,
`empname` varchar(30) NOT NULL,
`job` varchar(50) NOT NULL,
`mgr` int(11) NOT NULL,
`hiredate` datetime DEFAULT NULL,
`sal` int(11) DEFAULT NULL,
`comm` int(11) DEFAULT NULL,
`deptno` int(11) DEFAULT NULL,
PRIMARY KEY (`empno`),
KEY `fk_dept` (`deptno`),
CONSTRAINT `fk_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
)
表之间的关系
然后在IDEA中使用mybatis插件自动生成pojo层和dao层以及对应的mapper文件,可以参考mybatis-generator插件的使用 。自动生成后的效果。
分析:在emp(员工)和dept(部门)这两个表中,多个员工可以对应一个部门,一个部门可以对应多个员工。所以员工表对部门表,就像对于多对一。
多对一的实现:在多的一方添加一的一方的对象
Emp实体类,只截取了属性。
private Integer empno;
private String empname;
private String job;
private Integer mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
// private Integer deptno;
private Dept dept;//一的一方的对象
可以看到,我把Emp自动生成的deptno(部门编号)给去掉了,因为Dept中也有个deptno,去掉是为了避免冲突。或者在Emp类中将deptno改成别的,mapper文件也需要和你修改后的一一对应。如果你两张表的主键和外键不同名,只需加一的一方的属性。我的重名了,所以选择直接去掉了。
Dept实体类不用做任何修改
修改EmpMapper.xml文件,实现多对一
在mapper文件中我也把自带的deptno属性给去掉了,与Emp对应。association标签中property属性值为Emp中多的一方(Dept)的对象名,javaType属性值为多的一方类的完整限定名。
修改部分增删该查的语句,一对多的目的就是操作两张表。
两表查询
添加数据
insert into emp
empno,
empname,
job,
mgr,
hiredate,
sal,
comm,
deptno,
#{empno,jdbcType=INTEGER},
#{empname,jdbcType=VARCHAR},
#{job,jdbcType=VARCHAR},
#{mgr,jdbcType=INTEGER},
#{hiredate,jdbcType=TIMESTAMP},
#{sal,jdbcType=INTEGER},
#{comm,jdbcType=INTEGER},
#{dept.deptno,jdbcType=INTEGER},
修改
update emp
empname = #{empname,jdbcType=VARCHAR},
job = #{job,jdbcType=VARCHAR},
mgr = #{mgr,jdbcType=INTEGER},
hiredate = #{hiredate,jdbcType=TIMESTAMP},
sal = #{sal,jdbcType=INTEGER},
comm = #{comm,jdbcType=INTEGER},
deptno = #{dept.deptno,jdbcType=INTEGER},
where empno = #{empno,jdbcType=INTEGER}
批量删除
在dao层添加 int daleteAll(Integer array[]);实现批量删除
delete from emp
where empno in
#{id}
以上只列出了部分修改 。在添加多对一后,mapper文件中之间传入的depeno都要改成dept.deptno,语句中出现的deptno不需要修改,原因还是因为实现多对一后,我的Dept类中没有deptno属性,只能用一的一方(Dept)中的deptno代替,所以要使用dept.deptno。
每日鸡汤:“不要让别人告诉你,你不能做什么。 只要有梦想,就要去追求。 那些做不到的人总要告诉你,你也不行。 想要
什么就得去努力,去追求。 ——《当幸福来敲门》“
Over!