版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第3章Mybatis复杂查询框架程序设计(Java)2学习目标mybatis的关联查询2mybatis的集合查询3mybatis的鉴别器4自定义映射关系132mybatis的关联查询-目录1)联合查询2)构造查询3)子查询42.2构造查询【可选】回顾上节课自定义映射关系resultMap的配置:<resultMaptype="domain.User"id="user"><idproperty="name"column="username"/><resultproperty="pass"column="password"/></resultMap>id、result是用来配置实体类(domain.User)中的属性与数据库字段的映射关系的。id、result的本质其实是mybatis根据我们自定义的映射关系使用反射将数据库查询结果中字段的值填充到实体类对应的属性中的以上是使用id、result的方式定义映射,还有一种方式是使用构造函数的方式来定义映射52.2构造查询【可选】首先在domain.User加入构造方法:publicclassUser{ privateStringname; privateStringpass;
publicUser(Stringname,Stringpass){ =name; this.pass=pass; }省略get、set方法}62.2构造查询【可选】修改resultMap标签:<resultMapid="user"type="domain.User">
<constructor> <argcolumn="username"javaType="String"/> <argcolumn="password"javaType="String"/> </constructor> </resultMap>constructor标签的含义就是使用构造函数来定义映射关系注意参数的顺序以及为每一个参数指定javaType72.3子查询-任务描述例子3:在例子1的基础上,进行子查询表名employee(雇员信息表)username用户名字符串10位主键password密码字符串6位非空deptid部门id整型外键表名department(部门信息表)id部门id整型自动递增主键deptname部门名称字符串10位非空数据要求用mybatis框架编程,mysql数据库,查询employee表的所有记录,输出用户名和该用户所在的部门名称82.3子查询-分析子查询过程二阶段查询阶段1:查询雇员表所有记录select*fromemployee阶段2:从阶段1的查询结果中循环取出每条记录的deptid字段值,查询department表中id=deptid字段值的记录for(inti=0;i<雇员表的记录数;i++){intdeptid=阶段1中查询结果的下一条记录的deptid字段值;select*fromdepartmentwhereid=deptid}综合阶段1和2的结果就能够得到本例子要求的结果这种二阶段查询的方式称之为子查询92.3子查询-分析子查询过程上面的分析中涉及两个SQL语句select*fromemployee---查询出所有用户select*fromdepartmentwhereid=#{deptid}--根据部门id获取部门因此,首先我们在SQL配置文件中加入这两个SQl的配置102.3子查询-分析子查询过程select*fromemployee---查询出所有雇员配置如下:<resultMapid="employee"type="domain.Employee">
<idproperty="name"column="username"/> <resultproperty="pass"column="password"/> <resultproperty="deptid"column="deptid"/></resultMap><selectid="findAllEmployees"resultMap="employee"> select*fromemployee </select>112.3子查询-分析子查询过程select*fromdepartmentwhereid=#{deptid}--根据部门id获取部门配置如下:<resultMapid="department"type="domain.Department">
<idproperty="id"column="id"/> <resultproperty="name"column="deptname"/> </resultMap><selectid="findDeptById"parameterType="int"resultMap="department"> select*fromdepartmentwhereid=#{deptid}</select>122.3子查询-分析子查询过程select*fromemployee---查询出所有用户配置如下:<resultMapid="employee"type="domain.Employee"> <idproperty="name"column="username"/> <resultproperty="pass"column="password"/> <resultproperty="deptid"column="deptid"/><associationproperty="dept"javaType="domain.Department"column="deptid"select="findDeptById"> </association></resultMap><selectid="findAllEmployees"resultMap="employee"> select*fromemployee </select>13技巧学习:如何在eclipse中使用调试在需要调试代码的地方打断点14技巧学习:如何在eclipse中使用调试Debug方式运行程序15技巧学习:如何在eclipse中使用调试F6:运行至下一句代码F8:直接运行跳转到下一个断点将鼠标移至变量上查看运行中的值或者将变量添加到窗口中查看16技巧学习:如何在eclipse中使用调试17技巧学习:如何在eclipse中使用调试183集合查询-任务描述例子4:集合查询表名employee(雇员信息表)username用户名字符串10位主键password密码字符串6位非空deptid部门id整型外键表名department(部门信息表)id部门id整型自动递增主键deptname部门名称字符串10位非空数据要求用mybatis框架编程,mysql数据库,查询employee表的所有记录,输出用户名和该用户所在的部门名称,使用1对多查询的方式。193集合查询-分析一个雇员属于一个部门一个部门包含多个雇员因此,雇员和部门是多对一的关系、部门和雇员是一对多的关系如果题目要求我们使用多对一的查询,我们站在雇员的角度,Employee中包含一个Department如果题目要求我们使用一对多的查询,我们站在部门的角度,一个Department包含多个Employee因此,实体类代码结构修改如下:203集合查询-分析domain.Employee实体类:publicclassEmployee{ privateStringname; privateStringpass; privateintdeptid;省略get,set方法}213集合查询-分析domain.Department实体类:publicclassDepartment{ privateintid; privateStringname;
privateList<Employee>employees;//多个雇员(是个集合)省略get,set方法}223集合查询-步骤1在<mapper>里修改查询结果类型映射resultMap标签配置<resultMapid="deptMap"type="domain.Department"> <idproperty="id"column="id"/> <resultproperty="name"column="deptname"/>
<collectionproperty="employees"javaType="ArrayList"ofType="domain.Employee"> <idproperty="name"column="username"/> <resultproperty="pass"column="password"/> <resultproperty="deptid"column="deptid"/> </collection> </resultMap>说明:collection标签是用来配置集合的collectionproperty=“employees“对应于java实体类中employees属性,显而易见,它是arraylist集合类型javaType=”ArrayList”,里边的类型必定是Employee,则ofType="domain.Employee“233集合查询-步骤2修改SQL配置中的resultMap属性值<selectid="findDepts"resultMap="deptMap"> select*from employee,department whereemployee.deptid=department.id </select>243集合查询-调试运行及探讨在app.Test类中执行如下代码//3.执行sql语句List<Department>list=sqlSession.selectList("findDepts");//4.输出结果for(Departmentdept:list){ List<Employee>employees=dept.getEmployees(); for(Employeeitem:employees){System.out.println(item.getName()+":"+dept.getName()); } }最后结果与例1没有任何区别25扩展:使用接口方式完成数据操作【可选】回顾以前使用mybatis进行数据操作的方式:List<Employee>list=sqlSession.selectList("findEmployees");下面给大家介绍另外一种方式:使用接口完成数据操作——或者说在以前的基础上增加了一个接口层26扩展:使用接口方式完成数据操作【可选】第一步:创建一个接口publicinterfaceUserDao{ List<Map<String,Object>>findAllUser();}接口中方法定义的规则:接口中的方法名和sql配置文件中定义的id一致接口方法输入参数类型要和配置文件中定义的parameterType一致接口返回数据类型要和配置文件中定义的resultType一致27扩展:使用接口方式完成数据操作【可选】第二步:通过namespace关联接口和配置文件<mappernamespace="dao.UserDao">第三步:调用接口访问数据UserDaodao=sqlSession.getMapper(UserDao.class);List<Map<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 33521.32-2021机械振动 轨道系统产生的地面诱导结构噪声和地传振动 第32部分:大地的动态性能测量》
- 深度解析(2026)《GBT 33418-2016环氧乙烷灭菌化学指示物检验方法》
- 2024年湖北十堰郧阳中学自主招生数学试题真题(含答案详解)
- 临床缝合与拆线注意事项
- 第5章 跨境电商营销
- 医疗数据安全治理:区块链技术图谱
- 医疗数据安全治理:加密策略的组织落地
- 医疗数据安全投入:区块链成本效益分析
- 胸痛的观察及护理
- 医疗数据安全合规管理中的行业自律机制研究
- 南通市2024届高三第二次调研测试(二模)语文试卷(含官方答案)
- YS/T 277-2009氧化亚镍
- YS/T 1109-2016有机硅用硅粉
- 教师的信仰与价值(合师院讲座)
- GB/T 10609.2-2009技术制图明细栏
- 汽车制造工程的核心技术及四大工艺流程开发体系-
- 上海地理高二等级考 第7讲 岩石和地貌1
- 安徽省合肥市各县区乡镇行政村村庄村名明细及行政区划代码
- 视神经胶质瘤-影像科
- 公园绿化养护景观绿化维护项目迎接重大节会活动的保障措施
- 贵州省双控系统企业端操作手册
评论
0/150
提交评论