软件学校网站模板,去除wordpress阅读更多字段,网站公众号建设工具,奢侈品手表网站SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace#xff0c;一般定义为对应的接口类的路径。写好SQL语句映射文件后#xff0c;需要在MyBAtis配置文件mappers标签中引用#xff0c;例如#xff1a; Xml代码 mappers mapper resource一般定义为对应的接口类的路径。写好SQL语句映射文件后需要在MyBAtis配置文件mappers标签中引用例如 Xml代码 mappers mapper resourcecom/liming/manager/data/mappers/UserMapper.xml / mapper resourcecom/liming/manager/data/mappers/StudentMapper.xml / mapper resourcecom/liming/manager/data/mappers/ClassMapper.xml / mapper resourcecom/liming/manager/data/mappers/TeacherMapper.xml / /mappers 当Java接口与XML文件在一个相对路径下时可以不在myBatis配置文件的mappers中声明。 SQL 映射XML 文件一些初级的元素 1. cache – 配置给定模式的缓存2. cache-ref – 从别的模式中引用一个缓存3. resultMap – 这是最复杂而却强大的一个元素了它描述如何从结果集中加载对象4. sql – 一个可以被其他语句复用的SQL 块5. insert – 映射INSERT 语句6. update – 映射UPDATE 语句7. delete – 映射DELEETE 语句8. select - 映射SELECT语句 2.1 resultMap resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码也可以让你做许多JDBC 不支持的事。现实上要写一个等同类似于交互的映射这样的复杂语句可能要上千行的代码。ResultMaps 的目的就是这样简单的语句而不需要多余的结果映射更多复杂的语句除了只要一些绝对必须的语句描述关系以外再也不需要其它的。 resultMap属性type为java实体类id为此resultMap的标识。 resultMap可以设置的映射 1. constructor – 用来将结果反射给一个实例化好的类的构造器 a) idArg – ID 参数将结果集标记为ID以方便全局调用b) arg –反射到构造器的通常结果 2. id – ID 结果将结果集标记为ID以方便全局调用 3. result – 反射到JavaBean 属性的普通结果 4. association – 复杂类型的结合多个结果合成的类型 a) nested result mappings – 几resultMap 自身嵌套关联也可以引用到一个其它上 5. collection –复杂类型集合a collection of complex types 6. nested result mappings – resultMap 的集合也可以引用到一个其它上 7. discriminator – 使用一个结果值以决定使用哪个resultMap a) case – 基本一些值的结果映射的case 情形 i. nested result mappings –一个case 情形本身就是一个结果映射因此也可以包括一些相同的元素也可以引用一个外部resultMap。 2.1.1 id、result id、result是最简单的映射id为主键映射result其他基本数据库表字段到实体类属性的映射。 最简单的例子 Xml代码 resultMap typeliming.student.manager.data.model.StudentEntity idstudentResultMap id propertystudentId columnSTUDENT_ID javaTypeString jdbcTypeVARCHAR/ result propertystudentName columnSTUDENT_NAME javaTypeString jdbcTypeVARCHAR/ result propertystudentSex columnSTUDENT_SEX javaTypeint jdbcTypeINTEGER/ result propertystudentBirthday columnSTUDENT_BIRTHDAY javaTypeDate jdbcTypeDATE/ result propertystudentPhoto columnSTUDENT_PHOTO javaTypebyte[] jdbcTypeBLOB typeHandlerorg.apache.ibatis.type.BlobTypeHandler / /resultMap id、result语句属性配置细节 属性 描述 property 需要映射到JavaBean 的属性名称。 column 数据表的列名或者标签别名。 javaType 一个完整的类名或者是一个类型别名。如果你匹配的是一个JavaBean那MyBatis 通常会自行检测到。然后如果你是要映射到一个HashMap那你需要指定javaType 要达到的目的。 jdbcType 数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项但MyBatis 不需要。如果你是直接针对JDBC 编码且有允许空的列而你要指定这项。 typeHandler 使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名也可以是一个类型别名。 支持的JDBC类型 为了将来的引用MyBatis 支持下列JDBC 类型通过JdbcType 枚举BITFLOATCHARTIMESTAMPOTHERUNDEFINEDTINYINTREALVARCHARBINARYBLOBNVARCHARSMALLINTDOUBLELONGVARCHARVARBINARYCLOBNCHARINTEGERNUMERICDATELONGVARBINARYBOOLEANNCLOBBIGINTDECIMALTIMENULLCURSOR 2.1.2 constructor 我们使用id、result时候需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射这个时候是通过构造方法参数的书写的顺序来进行赋值的。 使用construcotr功能有限例如使用collection级联查询。 上面使用id、result实现的功能就可以改为 Xml代码 resultMap typeStudentEntity idstudentResultMap constructor idArg javaTypeString columnSTUDENT_ID/ arg javaTypeString columnSTUDENT_NAME/ arg javaTypeString columnSTUDENT_SEX/ arg javaTypeDate columnSTUDENT_BIRTHDAY/ /constructor /resultMap 当然我们需要定义StudentEntity实体类的构造方法 Java代码 public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){ this.studentID studentID; this.studentName studentName; this.studentSex studentSex; this.studentBirthday studentBirthday; } 2.1.3 association联合 联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性属性的javaType通常MyBatis 自己会识别。对应的数据库表的列名称。如果想覆写的话返回结果的值需要指定typeHandler。不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载 1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集映射成Java实体类型。 例如一个班级对应一个班主任。 首先定义好班级中的班主任属性 Java代码 private TeacherEntity teacherEntity; 2.1.3.1使用select实现联合 例班级实体类中有班主任的属性通过联合在得到一个班级实体时同时映射出班主任实体。 这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句只需要直接修改resultMap即可。 ClassMapper.xml文件部分内容 Xml代码 resultMap typeClassEntity idclassResultMap id propertyclassID columnCLASS_ID / result propertyclassName columnCLASS_NAME / result propertyclassYear columnCLASS_YEAR / association propertyteacherEntity columnTEACHER_ID selectgetTeacher/ /resultMap select idgetClassByID parameterTypeString resultMapclassResultMap SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID #{classID}; /select TeacherMapper.xml文件部分内容 Xml代码 resultMap typeTeacherEntity idteacherResultMap id propertyteacherID columnTEACHER_ID / result propertyteacherName columnTEACHER_NAME / result propertyteacherSex columnTEACHER_SEX / result propertyteacherBirthday columnTEACHER_BIRTHDAY/ result propertyworkDate columnWORK_DATE/ result propertyprofessional columnPROFESSIONAL/ /resultMap select idgetTeacher parameterTypeString resultMapteacherResultMap SELECT * FROM TEACHER_TBL TT WHERE TT.TEACHER_ID #{teacherID} /select 2.1.3.2使用resultMap实现联合 与上面同样的功能查询班级同时查询器班主任。需在association中添加resultMap在teacher的xml文件中定义好的新写sql查询班级表left join教师表不需要teacher的select。 修改ClassMapper.xml文件部分内容 Xml代码 resultMap typeClassEntity idclassResultMap id propertyclassID columnCLASS_ID / result propertyclassName columnCLASS_NAME / result propertyclassYear columnCLASS_YEAR / association propertyteacherEntity columnTEACHER_ID resultMapteacherResultMap/ /resultMap select idgetClassAndTeacher parameterTypeString resultMapclassResultMap SELECT * FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID TT.TEACHER_ID WHERE CT.CLASS_ID #{classID}; /select 其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。 2.1.4 collection聚集 聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性属性的javaType一般为ArrayList列表中对象的类型ofTypeJava实体类对应的数据库表的列名称不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载 1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集映射成Java实体类型。 例如一个班级有多个学生。首先定义班级中的学生列表属性 Java代码 private ListStudentEntity studentList; 2.1.4.1使用select实现聚集 用法和联合很类似区别在于这是一对多所以一般映射过来的都是列表。所以这里需要 定义javaType为ArrayList还需要定义列表中对象的类型ofType以及必须设置的select的语句名称需要注意的是这里的查询 student的select语句条件必须是外键classID。 ClassMapper.xml文件部分内容 Xml代码 resultMap typeClassEntity idclassResultMap id propertyclassID columnCLASS_ID / result propertyclassName columnCLASS_NAME / result propertyclassYear columnCLASS_YEAR / association propertyteacherEntity columnTEACHER_ID selectgetTeacher/ collection propertystudentList columnCLASS_ID javaTypeArrayList ofTypeStudentEntity selectgetStudentByClassID/ /resultMap select idgetClassByID parameterTypeString resultMapclassResultMap SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID #{classID}; /select StudentMapper.xml文件部分内容 Xml代码 !-- java属性数据库表字段之间的映射定义 -- resultMap typeStudentEntity idstudentResultMap id propertystudentID columnSTUDENT_ID / result propertystudentName columnSTUDENT_NAME / result propertystudentSex columnSTUDENT_SEX / result propertystudentBirthday columnSTUDENT_BIRTHDAY / /resultMap !-- 查询学生list根据班级id -- select idgetStudentByClassID parameterTypeString resultMapstudentResultMap include refidselectStudentAll / WHERE ST.CLASS_ID #{classID} /select 2.1.4.2使用resultMap实现聚集 使用resultMap就需要重写一个sqlleft join学生表。 Xml代码 resultMap typeClassEntity idclassResultMap id propertyclassID columnCLASS_ID / result propertyclassName columnCLASS_NAME / result propertyclassYear columnCLASS_YEAR / association propertyteacherEntity columnTEACHER_ID resultMapteacherResultMap/ collection propertystudentList columnCLASS_ID javaTypeArrayList ofTypeStudentEntity resultMapstudentResultMap/ /resultMap select idgetClassAndTeacherStudent parameterTypeString resultMapclassResultMap SELECT * FROM CLASS_TBL CT LEFT JOIN STUDENT_TBL ST ON CT.CLASS_ID ST.CLASS_ID LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID TT.TEACHER_ID WHERE CT.CLASS_ID #{classID}; /select 其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。 2.1.5discriminator鉴别器 有时一个单独的数据库查询也许返回很多不同但是希望有些关联数据类型的结果集。鉴别器元素就是被设计来处理这个情况的还有包括类的继承层次结构。鉴别器非常容易理解因为它的表现很像Java语言中的switch语句。 定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型尽管字符串在很多情形下都会有用。 下面这个例子为当classId为20000001时才映射classId属性。 Xml代码 resultMap typeliming.student.manager.data.model.StudentEntity idresultMap_studentEntity_discriminator id propertystudentId columnSTUDENT_ID javaTypeString jdbcTypeVARCHAR/ result propertystudentName columnSTUDENT_NAME javaTypeString jdbcTypeVARCHAR/ result propertystudentSex columnSTUDENT_SEX javaTypeint jdbcTypeINTEGER/ result propertystudentBirthday columnSTUDENT_BIRTHDAY javaTypeDate jdbcTypeDATE/ result propertystudentPhoto columnSTUDENT_PHOTO javaTypebyte[] jdbcTypeBLOB typeHandlerorg.apache.ibatis.type.BlobTypeHandler / result propertyplaceId columnPLACE_ID javaTypeString jdbcTypeVARCHAR/ discriminator columnCLASS_ID javaTypeString jdbcTypeVARCHAR case value20000001 resultTypeliming.student.manager.data.model.StudentEntity result propertyclassId columnCLASS_ID javaTypeString jdbcTypeVARCHAR/ /case /discriminator /resultMap 转载于:https://www.cnblogs.com/charlexu/archive/2013/03/15/2961118.html