1.<*select>标签中查询出来的类名要和<resultMap>中的column属性值一致。但规定<resultMap>*的column属性值不能写成“表名.列名”,而是直接写数据库中的列名或别名。
2.如果两个表中都有ID属性,但因为规定<*resultMap>*的column属性值不能写成“表名.列名”,这时候要怎么办呢?可以用别名来代替。
3.在主表类的Sql配置文档的<*resultMap>标签下需要添加一个<collection>标签来指明我当前主表这个类里包含着子表类的集合。其中<collection>标签下存在property属性与resultMap属性,没有column属性,因为在数据库表中不会额外创建一个此集合的字段。property属性表示主表类中哪个属性名,resultMap属性要指明包含的子表类的Sql配置文件的<resultMap>*标签的id值。
例:
<resultMap type="com.imooc.Command" id="Command">
<id column="CID" jdbcType="Integer" property="id"/>
<result column="Name" jdbcType="VARCHAR" property="name"/>
//因为是跨文件所以要namespace.id
<collection property="contentlist" resultMap="Content.content"/>
注意:
特别要注意的是column属性对应数据库表的字段名与select子句选择的字段名匹配起来。如果select u.name as username from User as u; 虽然在数据库表中的字段名是name,但是select子句为name字段设置了别名,即username,因此在<**resultMap>标签下的<result>标签的**column属性要等于username而并非name,是与select子句中的名称匹配,要注意当设置了别名那么column属性也为别名!!!
4.且当select u.name from User as u,column**<resultMap>标签下的<result>的column属性不能写成u.name,不能带表名。因为在jdbc的ResultSet接口根据列名获取数据的方法中,根据的列名是没有表名前缀的,因此表名前缀会失效。所以在Mybatis一对多关联的Sql配置文档下的<**select>标签的sql语句不能出现两个字段名相同的查询,否则在相关联的不同Sql配置文件的<resultMap>标签下的其他标签的**column属性就会重复,Mybatis并不知道这个重复的字段是属于哪个表的。所以要么起别名,要么设计数据库不同表之间不能出现同名的列名。