资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,/42,SQL,映射,文件,线上线下,平台预习,2,/42,本章任务,完成超市订单系统,-,用户管理功能模块之用户的增删改查实现,3,/,42,本章目标,掌握通过,SQL,映射文件进行增删改查,掌握参数的使用,掌握,resultMap,了解,Cache,的使用,4,/,42,SQL,映射的,XML,文件,MyBatis 真正的强大在于映射语句,专注于,SQL,,功能强大,SQL映射的配置却是相当简单,SQL,映射文件的几个顶级元素,(,按照定义的顺序,),mapper,namespace,cache,配置给定命名空间的缓存,cache-ref,从其他命名空间引用缓存配置,resultMap,用来描述数据库结果集和对象的对应关系,sql,可以重用的,SQL,块,也可以被其他语句引用,insert,映射插入语句,update,映射更新语句,delete,映射删除语句,select,映射查询语句,5,/,42,m,apper,元素,mapper,namespace,:命名空间,namespace,和子元素的,id,联合保证唯一,区别不同的,mapper,绑定,DAO,接口,namespace,的命名必须跟某个接口同名,接口中的方法与映射文件中,SQL,语句,id,一一,对应,select id=,getUserList,示例,6,/,42,select,7-1,select,是,MyBatis,中最常用的元素之一,select,语句有很多属性可以详细配置每一条语句,id,命名空间中唯一的标识符,接口中的方法与映射文件中的,SQL,语句,id,一一对应,parameterType,传入,SQL,语句的参数类型,resultType,SQL,语句返回值类型的完整类名或别名,演示示例,1,:根据用户名对用户表进行模糊查询,7,/,42,select 7-2,按条件查询用户表,若多条件情况下如何处理?,传入,多个参数进行入参,?,封装,成,User,对象进行入参?,提示,问题,8,/,42,select 7-3,parameterType,基础数据类型,int,、,String,、,Date,等,只能传入一个,,通过,#,参数名,即可获取传入的值,复杂数据类型,Java,实体类、,Map,等,通过,#,属性名,或者,#map,的,keyName,即可获取传入值,演示示例,2,:改造用户表的查询操作,-,封装对象入参,9,/,42,select 7-4,按条件查询得到用户表列表,需要显示指定字段,并显示用户角色(中文表述),用户表中的,userRole,字段记录的是角色,id,,不是其对应的名称,如何解决?,修改,User,的属性,增加,userRoleName,属性,修改查询,SQL,语句,连表查询,resultMap-,自定义映射结果,问题,提示,10,/,42,select 7-5,resultMap,描述如何将结果集映射到,Java,对象,select u.*,r.roleName from smbms_user u,smbms_role r,where u.userName like CONCAT(%,#userName,%),and u.userRole=#userRole and u.userRole=r.id,一个外部,resultMap,的,id,,表示返回结果映射到哪一个,resultMap,上,从数据库中查询的列名或者别名,表示查询出来的属性对应的值赋给实体对象的哪个属性,示例,演示示例,3,:使用,resultMap,实现用户信息查询,(,用户表和角色表查询,),11,/,42,select 7-6,resultType,:直接表示返回类型,基本数据类型,复杂数据类型,resultMap,:对外部,resultMap,的引用,应用场景:,数据库字段信息与对象属性不一致,复杂的联合查询,自由控制映射结果,二者不能同时存在,本质上都是,Map,数据结构,12,/,42,select 7-7,使用,resultMap,如何实现自由灵活的控制映射结果,从而达到只对关心的属性进行赋值填充?,resultMap,自动映射匹配前提:字段名与属性名一致,resultMap,的自动映射级别,-,autoMappingBehavior,PARTIAL,(默认):自动匹配所有,禁止自动匹配,问题,分析,演示示例,3,:使用,resultMap,实现用户信息查询,(,用户表和角色表查询,),13,/,42,学员操作,实现订单表的查询,需求说明:,实现按条件查询订单表,查询条件如下,商品名称(模糊查询),供应商(供应商,id,),是否付款,查询结果列显示:订单编码、商品名称、供应商名称、账单金额、是否付款、创建时间,修改,Bill.java,,增加属性,providerName,编写,SQL,查询语句(连表查询),创建,resultMap-,自定义映射结果,并在,select,中引用,完成时间:,30,分钟,练习,提示,14,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,15,/,42,select-,小结,属性,描述,id,在命名空间中唯一的标识符,可以被用来引用这条语句,parameterType,将会传入这条语句的参数类的完全限定名或别名,resultType,从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用,resultType,或,resultMap,,但不能同时使用,resultMap,命名引用外部的,resultMap,flushCache,将其设置为,true,,不论语句什么时候被调用,都会导致缓存被清空。默认值:,false,useCache,将其设置为,true,,将会导致本条语句的结果被缓存。默认值:,true,timeout,这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理),fetchSize,这是暗示驱动程序每次批量返回的结果行数,statementType,STATEMENT,PREPARED,或,CALLABLE,的一种。让,MyBatis,选择使用,Statement,,,PreparedStatement,或,CallableStatement,。默认值:,PREPARED,resultSetType,FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE,中的一种。默认是不设置(驱动自行处理),16,/,42,insert,元素,insert,id,parameterType,insert into smbms_user(userCode,userName,userPassword),values(#userCode,#userName,#userPassword),注意:,insert,、,update,、,delete,元素均没有,resultType,属性,!,示例,演示示例,4,:实现用户表的增加操作,17,/,42,学员操作,实现供应商表的增加,需求说明:,在上一个练习的基础上,实现供应商表的增加操作,insert,parameterType,:,Java,实体类,-Provider,DAO,层接口方法的返回类型:,int,需更新,createBy,和,creationDate,,,modifyDate,和,modifyBy,不需要更新,完成时间:,20,分钟,提示,练习,18,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,19,/,42,update,元素,2-1,update,id,parameterType,update smbms_user set userCode=#userCode,userName=#userName,userPassword=#userPassword where id=#id,演示示例,5,:实现用户表的修改操作,示例,20,/,42,学员操作,实现供应商表的修改,需求说明:,在上一个练习的基础上,实现根据供应商,id,修改供应商信息的操作,update,parameterType,:,Java,实体类,-Provider,DAO,层接口方法的返回类型:,int,需更新,modifyDate,和,modifyBy,,,createBy,和,creationDate,不需要更新,完成时间:,20,分钟,提示,练习,21,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,22,/,42,update,元素,2-2,需求说明,实现超市账单管理系统,-,修改个人密码功能,分析,传入参数,(,多个,),:用户,id,和新密码,使用注解,Param,来传入多个参数,超过,3,个以上的参数最好封装成对象入参,参数固定的业务方法,最好使用多参数入参,演示示例,6,:实现修改当前用户密码的功能,经验,23,/,42,delete,元素,delete,id,parameterType,delete from smbms_user where id=#id,演示示例,7,:根据用户,id,删除用户信息,示例,24,/,42,学员操作,根据,id,删除供应商信息,需求说明:,在上一个练习的基础上,实现根据供应商,id,删除供应商信息的操作,delete,Param,注解参数,DAO,层接口方法的返回类型:,int,完成时间:,10,分钟,提示,练习,25,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,26,/,42,小结,DAO,层接口方法常见的返回类型,Java,对象、,Map,、,List,等复杂数据类型,int,(,增删改,),更新操作时,影响的数据行数,MyBatis,参数入参,Param,注解参数,封装成对象入参,技巧,27,/,42,resultMap 5-1,resultMap,属性,id,:,resultMap,的唯一标识,type,:,Java,实体类,resultMap,子元素,id,一般对应数据库中该行的主键,id,,设置此项可提高,MyBatis,性能,result,映射到,JavaBean,的某个“简单类型”属性,association,映射到,JavaBean,的某个“复杂类型”属性,比如,JavaBean,类,collection,映射到,JavaBean,的某个“复杂类型”属性,比如集合,28,/,42,resultMap 5-2,association,复杂的类型关联,,一对一,内部嵌套,映射一个嵌套,JavaBean,属性,属性,property,:映射数据库列的实体对象的属性,javaType,:完整,Java,类名或者别名,resultMap,:引用外部,resultMap,子元素,id,result,property,:映射数据库列的实体对象的属性,column,:数据库列名或者别名,演示示例,8,:根据用户角色,id,获取用户列表,29,/,42,resultMap 5-3,上一个例子中,“userRoleResult”,联合一个,association,结果映射来加载,User,实例,,那么,association,的,role,结果映射是否可复用?,resultMap,演示示例,9,:根据用户角色,id,获取用户列表,-resultMap,问题,提示,30,/,42,学员操作,实现订单表的查询,(association),需求说明:,实现按条件查询订单表,查询条件如下:,商品名称(模糊查询),供应商(供应商,id,),是否付款,查询结果列显示:订单编码、商品名称、供应商编码、供应商名称、供应商联系人、供应商联系电话、订单金额、是否付款,resultMap,中使用,association,子元素完成内部嵌套,修改,Bill.java,,增加复杂类型属性:,Provider,编写,SQL,查询语句(连表查询),创建,resultMap-,自定义映射结果,并在,select,中引用,完成时间:,20,分钟,练习,提示,31,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,32,/,42,resultMap 5-4,collection,复杂类型集合,,一对多,内部嵌套,映射一个嵌套结果集到一个列表,属性,property,:映射数据库列的实体对象的属性,ofType,:完整,Java,类名或者别名,(,集合所包括的类型,),resultMap,:引用外部,resultMap,子元素,id,result,property,:映射数据库列的实体对象的属性,column,:数据库列名或者别名,演示示例,10,:获取指定用户的相关信息及其地址列表,33,/,42,resultMap 5-5,如何提高结果映射的可重用性?,collection,的,resultMap,属性,演示示例,11,:获取指定用户的相关信息及其地址列表,-resultMap,问题,分析,34,/,42,学员操作,获取供应商及其订单列表,(collection),需求说明:,根据指定的供应商(,id,)查询出其相关信息以及其下所有的订单列表,查询结果列显示:供应商,id,、供应商编码、供应商名称、供应商联系人、供应商联系电话、订单列表信息(订单编码、商品名称、订单金额、是否付款),resultMap,中使用,collection,子元素完成内部嵌套,修改,Provider.java,,增加集合类型属性:,List billList,编写,SQL,查询语句(连表查询),创建,resultMap-,自定义映射结果,并在,select,中引用,完成时间:,20,分钟,提示,练习,35,/,42,共性问题集中讲解,常见问题及解决办法,代码规范问题,调试技巧,共性问题集中讲解,36,/,42,小结,在,association,和,collection,两个演示示例的基础上进行测试,在控制台输出没有在,resultMap,中进行匹配的属性,并观察输出结果,resultMap,自动映射,(autoMappingBehavior),的三个匹配级别,NONE,禁止自动匹配,PARTIAL,(默认),自动匹配所有属性,,内部嵌套除外,FULL,自动匹配所有,答疑解惑,演示示例,12,:,resultMap,自动映射的匹配级别,知识分享,37,/,42,缓存,MyBatis,缓存,一级缓存,二级缓存,二级缓存的配置,MyBatis,的全局,cache,配置,在,Mapper XML,文件中设置缓存,默认情况下是没有开启缓存的,在,Mapper XML,文件配置支持,cache,后,如果需要对个别查询进行调整,可以单独设置,cache,38,/,42,总结,2-1,mapper,:,namespace,s,elect,id,parameterType,resultType/resultMap,insert,、,update,、,delete,id,parameterType,39,/,42,总结,2-2,resultMap,id,type,result,association,collection,40,/,42,问题及作业,集中问题,&,课后作业,41,/42,扫我有更多精彩课程呦,
展开阅读全文