有时候在对数据库操作的时候,需要用到表之间的关系。多对一,一对多。一对一,多对多。今天我们来使用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文件,实现多对一
<resultMap id="BaseResultMap" type="com.test.pojo.Emp">
<id column="empno" jdbcType="INTEGER" property="empno"/>
<result column="empname" jdbcType="VARCHAR" property="empname"/>
<result column="job" jdbcType="VARCHAR" property="job"/>
<result column="mgr" jdbcType="INTEGER" property="mgr"/>
<result column="hiredate" jdbcType="TIMESTAMP" property="hiredate"/>
<result column="sal" jdbcType="INTEGER" property="sal"/>
<result column="comm" jdbcType="INTEGER" property="comm"/>
<!--<result column="deptno" jdbcType="INTEGER" property="deptno"/>-->
<association property="dept" javaType="com.test.pojo.Dept">
<id column="deptno" jdbcType="INTEGER" property="deptno"/>
<result column="deptname" jdbcType="VARCHAR" property="deptname"/>
<result column="loc" jdbcType="VARCHAR" property="loc"/>
</association>
</resultMap>
在mapper文件中我也把自带的deptno属性给去掉了,与Emp对应。association标签中property属性值为Emp中多的一方(Dept)的对象名,javaType属性值为多的一方类的完整限定名。
修改部分增删该查的语句,一对多的目的就是操作两张表。
两表查询
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
SELECT
dept.deptno,
dept.deptname,
dept.loc,
emp.empno,
emp.empname,
emp.job,
emp.mgr,
emp.hiredate,
emp.sal,
emp.comm
FROM
dept
INNER JOIN emp ON emp.deptno = dept.deptno
where emp.empno = #{empno,jdbcType=INTEGER}
</select>
添加数据
<insert id="insertSelective" parameterType="com.test.pojo.Emp">
insert into emp
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="empno != null">
empno,
</if>
<if test="empname != null">
empname,
</if>
<if test="job != null">
job,
</if>
<if test="mgr != null">
mgr,
</if>
<if test="hiredate != null">
hiredate,
</if>
<if test="sal != null">
sal,
</if>
<if test="comm != null">
comm,
</if>
<if test="dept.deptno != null">
deptno,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="empno != null">
#{empno,jdbcType=INTEGER},
</if>
<if test="empname != null">
#{empname,jdbcType=VARCHAR},
</if>
<if test="job != null">
#{job,jdbcType=VARCHAR},
</if>
<if test="mgr != null">
#{mgr,jdbcType=INTEGER},
</if>
<if test="hiredate != null">
#{hiredate,jdbcType=TIMESTAMP},
</if>
<if test="sal != null">
#{sal,jdbcType=INTEGER},
</if>
<if test="comm != null">
#{comm,jdbcType=INTEGER},
</if>
<if test="dept.deptno != null">
#{dept.deptno,jdbcType=INTEGER},
</if>
</trim>
</insert>
修改
<update id="updateByPrimaryKeySelective" parameterType="com.test.pojo.Emp">
update emp
<set>
<if test="empname != null">
empname = #{empname,jdbcType=VARCHAR},
</if>
<if test="job != null">
job = #{job,jdbcType=VARCHAR},
</if>
<if test="mgr != null">
mgr = #{mgr,jdbcType=INTEGER},
</if>
<if test="hiredate != null">
hiredate = #{hiredate,jdbcType=TIMESTAMP},
</if>
<if test="sal != null">
sal = #{sal,jdbcType=INTEGER},
</if>
<if test="comm != null">
comm = #{comm,jdbcType=INTEGER},
</if>
<if test="dept.deptno != null">
deptno = #{dept.deptno,jdbcType=INTEGER},
</if>
</set>
where empno = #{empno,jdbcType=INTEGER}
</update>
批量删除
在dao层添加 int daleteAll(Integer array[]);实现批量删除
<!--批量删除-->
<delete id="daleteAll">
delete from emp
where empno in
<foreach collection="array" open="(" close=")" separator="," item="id" >
#{id}
</foreach>
</delete>
以上只列出了部分修改 。在添加多对一后,mapper文件中之间传入的depeno都要改成dept.deptno,语句中出现的deptno不需要修改,原因还是因为实现多对一后,我的Dept类中没有deptno属性,只能用一的一方(Dept)中的deptno代替,所以要使用dept.deptno。
每日鸡汤:“不要让别人告诉你,你不能做什么。 只要有梦想,就要去追求。 那些做不到的人总要告诉你,你也不行。 想要
什么就得去努力,去追求。 ——《当幸福来敲门》“
Over!