mybatis_ResultMap

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:自动匹配所有属性

mybatis_ResultMap

上一篇:时间盲注


下一篇:手把手教centos安装企业级redis集群