Mybatis映射文件sql语句学习心得

时间:2022-02-23 01:00:09

现有数据库表:

CREATE TABLE `dept_p` (
  `DEPT_ID` varchar(40) NOT NULL,
  `DEPT_NAME` varchar(50) DEFAULT NULL,
  `PARENT_ID` varchar(40) DEFAULT NULL COMMENT '自关联,多对一',
  `STATE` int(11) DEFAULT NULL COMMENT '1启用0停用',
  `CREATE_BY` varchar(40) DEFAULT NULL COMMENT '登录人编号',
  `CREATE_DEPT` varchar(40) DEFAULT NULL COMMENT '登录人所属部门编号',
  `CREATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `UPDATE_BY` varchar(40) DEFAULT NULL,
  `UPDATE_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`DEPT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


 

截图如下:

Mybatis映射文件sql语句学习心得



下面是映射文件(即mybatis的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="cn.jinshang.mapper.DeptMapper">

<!--sql编写的思路
需要显示部门的全部信息,并且需要显示上级部门的ID和上级部门的名称
-->
<select id="findDeptList" resultMap="deptRM">
SELECT * FROM 
(SELECT * FROM dept_p)d
LEFT JOIN
(SELECT dept_id AS p_id,dept_name AS p_name FROM dept_p)p
ON d.parent_id=p.p_id
ORDER BY dept_id
</select>

<!--封装结果集 -->
<resultMap type="Dept" id="deptRM" autoMapping="true">
<id property="deptId" column="DEPT_ID"/>
<id property="deptName" column="DEPT_NAME"/>
<id property="state" column="STATE"/>
<id property="createTime" column="CREATE_TIME"/>
<id property="updateTime" column="UPDATE_TIME"/>

<!--封装上级部门 一对一 -->
<association property="parentDept" javaType="Dept">
<id property="deptId" column="P_ID"/>
<result property="deptName" column="P_NAME"/>
</association>
</resultMap>

<!--修改状态 -->
<update id="updateState">
update dept_p set state=#{state} where dept_id in (
<foreach collection="deptIds" item="deptId" separator=",">
#{deptId}
</foreach>
)
</update>


<!--批量删除 -->
<delete id="deleteDepts">
delete from dept_p where dept_id in (
<foreach collection="array" item="deptId" separator=",">
#{deptId}
</foreach>
)
</delete>

<!--添加部门信息 简化 只添加有效数据 -->
<insert id="saveDept">
insert into dept_p
(dept_id,dept_name,parent_id,state,create_time,update_time)
values(#{deptId},
#{deptName},
#{parentDept.deptId},
#{state},
#{createTime},
#{updateTime}
)
</insert>


<!--根据部门ID查询信息 -->
<select id="findDeptByID" resultMap="deptRM">
SELECT * FROM 
(SELECT * FROM dept_p)d
LEFT JOIN
(SELECT dept_id AS p_id,dept_name AS p_name FROM dept_p)p
ON d.parent_id=p.p_id
WHERE dept_id=#{deptId}
</select>

</mapper>


我们注意到,在对数据库查数据的时候,没有用到<foreach>标签。

  这是因为我们在查询数据时,直接用 select * from dept_p 查询出有一条或多条记录的结果集。而mybatis会自动解析这个结果集,完成到pojo的映射。 它在这里有循环的机制吗???????????

而在对数据库进行修改、删除的时候我们用到了<foreach>标签。

  这是因为在上面的修改和删除表时,sql语句里in()里面要填入具体的一个或多个数值,而这一个或多个数值我们不能写死,我们把这些数值放到了一个数组中,这时候就需要用到循环来获取数组里的数值。

  通俗一点说,在查询的时候我们的语句是写好的;但在修改和删除表中记录的时候,sql语句要通过<foreach>标签来给定条件,sql语句才能写好。

  需要注意的是,虽然在修改、删除的时候,我们用到了<foreach>标签,但整个sql语句只是一条语句而已。我们通过<foreach>循环的不是整条sql语句,而只是一个很小的部分而已。