媒介
MyBatis是基于“数据库组织不可控”的头脑竖立的,也就是我们愿望数据库遵照第三范式或BCNF,但实际适得其反,那末效果集映照就是MyBatis为我们供应这类抱负与实际间转换的手腕了,而resultMap就是效果集映照的设置标签了。
在深切ResultMap标签前,我们需要相识从SQL查询效果集到JavaBean或POJO实体的历程。
从SQL查询效果到范畴模子实体
经由过程JDBC查询获得ResultSet对象
遍历ResultSet对象并将每行数据暂存到HashMap实例中,以效果集的字段名或字段别号为键,以字段值为值
依据ResultMap标签的type属性经由过程反射实例化范畴模子
依据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到范畴模子实例中并返回
一、resultMap
1、属性申明
id属性 ,resultMap标签的标识。
type属性 ,返回值的全限制类名,或范例别号。
autoMapping属性 ,值局限true(默认值)|false, 设置是不是启动自动映照功用,自动映照功用就是自动查找与字段名小写同名的属性名,并挪用setter要领。而设置为false后,则需要在
resultMap
内明白说明映照关联才会挪用对应的setter要领。
2、基础作用:竖立SQL查询效果字段与实体属性的映照关联
示例1:经由过程setter组织范畴模子
public class EStudent{ private long id; private String name; private int age; // getter,setter要领 /** * 必需供应一个无参数的组织函数 */ public EStudent(){} }
<select id="getStudent" resultMap="getStudentRM"> SELECT ID, Name, Age FROM TStudent </select> <resultMap id="getStudentRM" type="EStudnet"> <id property="id" column="ID"/> <result property="studentName" column="Name"/> <result property="studentAge" column="Age"/> </resultMap>
子元素申明:
id元素 ,用于设置主键字段与范畴模子属性的映照关联
result元素 ,用于设置平常字段与范畴模子属性的映照关联
id、result语句属性设置细节:
属性 | 形貌 |
---|---|
property | 需要映照到JavaBean 的属性称号。 |
column | 数据表的列名或许标签别号。 |
javaType | 一个完全的类名,或许是一个范例别号。假如你婚配的是一个JavaBean,那MyBatis 平常会自行检测到。然后,假如你是要映照到一个HashMap,那你需要指定javaType 要到达的目标。 |
jdbcType | 数据表支撑的范例列表。这个属性只在insert,update 或delete 的时刻针对许可空的列有效。JDBC 需要这项,但MyBatis 不需要。假如你是直接针对JDBC 编码,且有许可空的列,而你要指定这项。 |
typeHandler | 运用这个属性能够覆写范例处置惩罚器。这项值能够是一个完全的类名,也能够是一个范例别号。 |
示例2:经由过程组织函数组织范畴模子
<select id="getStudent" resultMap="getStudentRM"> SELECT ID, Name, Age FROM TStudent</select><resultMap id="getStudentRM" type="EStudnet"> <constructor> <idArg column="ID" javaType="_long"/> <arg column="Name" javaType="String"/> <arg column="Age" javaType="_int"/> </constructor></resultMap>
子元素申明:
constructor元素 ,指定运用指定参数列表的组织函数来实例化范畴模子。注重:其子元素递次必需与参数列表递次对应
idArg子元素 ,标记该入参为主键
arg子元素 ,标记该入参为平常字段(主键运用该子元素设置也是能够的)
3、一对一关联、一对多关联查询
注重:在采纳嵌套效果的体式格局查询一对一、一对多关联时,必需要经由过程resultMap下的id或result标签来显式设置属性/字段映照关联,否则在查询多条纪录时会仅仅返回末了一条纪录的状况。
association团结
团结元素用来处置惩罚“一对一”的关联。需要指定映照的Java实体类的属性,属性的javaType(平常MyBatis 本身会辨认)。对应的数据库表的列称号。假如想覆写的话返回效果的值,需要指定typeHandler。
差别状况需要通知MyBatis 怎样加载一个团结。MyBatis 能够用两种体式格局加载:
select: 实行一个别的映照的SQL 语句返回一个Java实体范例。较天真;
resultsMap: 运用一个嵌套的效果映照来处置惩罚经由过程join查询效果集,映照成Java实体范例。
比方,一个班级对应一个班主任。
起首定义好班级中的班主任 private TeacherEntity teacherEntity;
运用select完成团结
例:班级实体类中有班主任的属性,经由过程团结在获得一个班级实体时,同时映照出班主任实体。
如许能够直接复用在TeacherMapper.xml文件中定义好的查询teacher依据其ID的select语句。而且不需要修正写好的SQL语句,只需要直接修正resultMap即可。
ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> </resultMap> <select id="getClassByID" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID = #{classID}; </select>
TeacherMapper.xml文件部分内容:
<resultMap type="TeacherEntity" id="teacherResultMap"> <id property="teacherID" column="TEACHER_ID" /> <result property="teacherName" column="TEACHER_NAME" /> <result property="teacherSex" column="TEACHER_SEX" /> <result property="teacherBirthday" column="TEACHER_BIRTHDAY"/> <result property="workDate" column="WORK_DATE"/> <result property="professional" column="PROFESSIONAL"/> </resultMap> <select id="getTeacher" parameterType="String" resultMap="teacherResultMap"> SELECT * FROM TEACHER_TBL TT WHERE TT.TEACHER_ID = #{teacherID} </select>
运用resultMap完成团结
与上面一样的功用,查询班级,同时查询器班主任。需在association中增加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。
修正ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> </resultMap> <select id="getClassAndTeacher" parameterType="String" resultMap="classResultMap"> 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文件部分内容中。
collection群集
群集元素用来处置惩罚“一对多”的关联。需要指定映照的Java实体类的属性,属性的javaType(平常为ArrayList);列表中对象的范例ofType(Java实体类);对应的数据库表的列称号;
差别状况需要通知MyBatis 怎样加载一个群集。MyBatis 能够用两种体式格局加载:
1. select: 实行一个别的映照的SQL 语句返回一个Java实体范例。较天真;
2. resultsMap: 运用一个嵌套的效果映照来处置惩罚经由过程join查询效果集,映照成Java实体范例。
比方,一个班级有多个门生。
起首定义班级中的门生列表属性:private List<StudentEntity> studentList;
运用select完成群集
用法和团结很相似,区分在于,这是一对多,所以平常映照过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的范例ofType,以及必需设置的select的语句称号(需要注重的是,这里的查询student的select语句前提必需是外键classID)。
ClassMapper.xml文件部分内容:
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/> </resultMap> <select id="getClassByID" parameterType="String" resultMap="classResultMap"> SELECT * FROM CLASS_TBL CT WHERE CT.CLASS_ID = #{classID}; </select>
StudentMapper.xml文件部分内容:
<!-- java属性,数据库表字段之间的映照定义 --> <resultMap type="StudentEntity" id="studentResultMap"> <id property="studentID" column="STUDENT_ID" /> <result property="studentName" column="STUDENT_NAME" /> <result property="studentSex" column="STUDENT_SEX" /> <result property="studentBirthday" column="STUDENT_BIRTHDAY" /> </resultMap> <!-- 查询门生list,依据班级id --> <select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap"> <include refid="selectStudentAll" /> WHERE ST.CLASS_ID = #{classID} </select>
运用resultMap完成群集
运用resultMap,就需要重写一个sql,left join门生表。
<resultMap type="ClassEntity" id="classResultMap"> <id property="classID" column="CLASS_ID" /> <result property="className" column="CLASS_NAME" /> <result property="classYear" column="CLASS_YEAR" /> <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/> <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/> </resultMap> <select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap"> 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文件部分内容中。
4. 动态映照关联
经由过程 discriminator子元素 (鉴别器)能够完成动态映照关联信息的设置。细致示比方下:
public class EStudent{ private long id; private String name; private String juniorHighSchool; private String seniorHighSchool; private int during; // 在本校就读时候 // getter,setter要领 /** * 必需供应一个无参数的组织函数 */ public EStudent(){} }
情形:查询门生信息的seniorHighSchool信息,若就读时候during字段值为4、5、6时,则以juniorHighSchool字段作所为seniorHighSchool信息。
<select id="getStundent" resultMap="rm"> SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during FROM TStudent</select><resultMap id="rm" type="EStudent"> // 若不加这句,则当将juniorHighSchool给予给seniorHighSchool属性时,juniorHighSchool属性将为null <result column="juniorHighSchool" property="juniorHighSchool"/> <discriminator column="during" javaType="_int"> // 情势1:经由过程resultType设置动态映照信息 <case value="4" resultType="EStudent"> <result column="juniorHighSchool" property="seniorHighSchool"/> </case> // 情势2: 经由过程resultMap设置动态映照信息 <case value="5" resultMap="dynamicRM"/> <case value="6" resultMap="dynamicRM"/> </discriminator></resultMap><resultMap id="dynamicRM" type="EStudent"> <result column="juniorHighSchool" property="seniorHighSchool"/></resultMap>
注重:上面关于 discriminator子元素 的 case元素 的 resultType属性 和 resultMap元素 的 type属性 ,均不是直指返回的范畴模子范例,而是指定依据推断前提后获得映照关联,可经由过程 id子元素 和 result子元素 重写映照关联。
5. id元素,result元素,idArg元素,arg元素,discriminator元素的配合属性
javaType属性 :Java类的全限制名,或别号
jdbcType属性 :JDBC范例, JDBC范例为CUD操纵时列可能为空时举行处置惩罚
typeHandler属性 :指定范例处置惩罚器的全限制类名或范例别号
column属性 :指定SQL查询效果的字段名或字段别号。将用于JDBC的 resultSet.getString(columnName)
本文讲解了mybatis属性详解,更多相干内容请关注ki4网。
相干引荐:
MySQL数据库多表操纵
MySQL数据库单表查询
Oracle数据库输出输入
以上就是mybatis属性详解的细致内容,更多请关注ki4网别的相干文章!