1、数据库字段信息和对象属性不一致
? 01、我觉得还是要有必要说一下
? 1,字段信息(数据表中的类名)
? 2,对象属性(实体类中的属性)
? 02、若不一致的字段较少,可以在sql语句使用别名处理
? SELECT 字段1,
? 数据库的字段2 AS 实体类的属性
? FROM 表名
SELECT sid , sName AS name FROM stu
? 03、若不一致的字段较多,可以使用resultMap
<resultMap type="Stu" id="stuMap">
(type: 中放的是实体类的全线定名,如果有别名可以使用别名)
(id: 给这哥ResultMap起个名字,但是要唯一)
<id property="sid" column="sid"/>
(property: 中方的是实体类中的id属性)
(column: 中方的是数据库表中的主键)
<result property="name" column="sname"/>
(property: 中方的是实体类中的name属性)
(column: 中方的是数据库表中对应的字段)
</resultMap>
<select id="selectByMap" resultMap="stuMap">
(id: 还是接口中的方法名)
(resultMap: 这个时候就不能在使用resultType了
因给使用 resultMap 里面给的是你的 <resultMap>上的id值)
SELECT * FROM stu
</select>
2、复杂的联合查询,可以*控制结果
? 21、一对多:一个部门有多个用户
? 1、在实体类中添加:用户集合,并且添加了封装方法
/*我的是emp和dept表,上面那个是stu表*/
private List<Emp> empMap;
public List<Emp> getEmpMap() {
return empMap;
}
public void setEmpMap(List<Emp> empMap) {
this.empMap = empMap;
}
? 2、在emp接口中添加、通过部门id 查询
List<Emp> selectById(@Param("deptno") Integer deptno);
? 3、在对应的映射文件里实现方法
<select id="selectById" resultMap="entity/Emp.java">
(resultMap中放的是实体类路径)
SELECT * FROM emp WHERE deptno = #{deptno}
</select>
? 4、在dept接口中放 查询全部的方法
List<Dept> selectAll();
? 5、在dept实现类中
注: 如果在resultMap中使用了collection 标签就必须把所有实体类中的属性多要添加上 result标签
? 方法一
<resultMap type="Dept" id="deptMaps">
<id property="deptno" column="deptno"/>
<result property="dname" column="dname"/>
<result property="loc" column="loc"/>
<collection property="empMap" column="deptno"
select="mapper.EmpMapper.selectById"/>
(property: 对应的是你在dept中封装的 对象集合)
(column: 数据库中的外键名 [A表中的列名和B表中的列名])
(select: 放的是你emp接口中的通过id查寻的方法
一定要是接口的全线定名点你的方法名)
</resultMap>
<select id="selectAll" resultMap="deptMaps">
SELECT * FROM dept
</select>
? (以上是需要两个表的操作)
方法二 (在一个表中操作)
? 实体类:
private List<Emp> empMap;
public List<Emp> getEmpMap() {
return empMap;
}
public void setEmpMap(List<Emp> empMap) {
this.empMap = empMap;
}
? 接口中:
List<Dept> selectAllDeptMap();
? 映射文件中:
<resultMap type="Dept" id="deptMap">
<id property="deptno" column="deptno"/>
<result property="dname" column="dname"/>
<result property="loc" column="loc"/>
(在 collection 中放的是第二张表的所有属性)
<collection property="empMap" ofType="Emp">
<id property="empno" column="empno" />
<result property="ename" column="ename"/>
<result property="job" column="job"/>
<result property="mgr" column="mgr"/>
<result property="hiredata" column="hiredata"/>
<result property="sal" column="sal"/>
<result property="COMM" column="COMM"/>
<result property="deptno" column="deptno"/>
</collection>
</resultMap>
<select id="selectAllDeptMap" resultMap="deptMap">
SELECT d.*,e.empno,e.ename,e.job,e.mgr,e.hiredata,e.sal,e.COMM,e.deptno
FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno
</select>
3、配置自动映射级别
?
<setting name="autoMappingBehavior" value="PARTIAL"/>
? 级别:
? NONE:禁止自动匹配(必须手动匹配)
? PARTIAL:默认,会自动匹配属性
? (就像我在第一个写的例子中我就没有把所有的字段写全)
? (除了resultMap中包含了collection、association不能自动匹配,必须每个列都 需要手动匹配)
? FULL:自动匹配所有属性