现有数据库表:
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的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语句,而只是一个很小的部分而已。