select :
返回對象:
<select id = " " resultType= "對象的全類名" />
List:
<select id = " " resultType = "list泛型中的值" />
Map:
1.返回一條記錄 Map<String,Object>
key -> 字段
value -> 值
<select id = " " resultType="map" />
2.返回多條記錄 Map<Integer,Employee>
key -> @MapKey("column")標注在接口方法上,表名哪個字段作為Key
value -> 對象
<select id = " " resultTyppe="對象的全類名" />
ResultMap:
一對一:
1.級聯屬性
<resultMap id="myEmpAndDept" type="org.maple.pojo.Employee"> <id column="id" property="id"/> <result column="last_name" property="name"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <result column="did" property="dept.id"/> <result column="deptName" property="dept.deptName"/> </resultMap>
<select id="getEmpAndDeptById" resultMap="myEmpAndDept">
2.association
<resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee"> <id column="id" property="id"/> <result column="last_name" property="name"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <association property="dept" javaType="org.maple.pojo.Department"> <id column="did" property="id"/> <result column="deptName" property="deptName"/> </association> </resultMap>
3.association 分布查詢
<association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>
一對多
collection查詢
<!-- 要通過id查詢部門信息和所有員工 --> <resultMap id="myDept" type="org.maple.pojo.Department"> <id column="id" property="id"/> <result column="dept_name" property="deptName"/> <!--定義集合時,使用collection屬性--> <collection property="emps" ofType="org.maple.pojo.Employee"> <id column="eId" property="id"/> <result column="last_name" property="name"/> <result column="gender" property="gender"/> <result column="email" property="email"/> </collection> </resultMap>
collection分部查詢
<resultMap id="myDeptStep" type="org.maple.pojo.Department"> <id column="id" property="id"/> <result column="dept_name" property="deptName"/> <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection> </resultMap>
update,delete,insert:返回Integer,Long,Boolean,void
1.返回List
返回集合類型,resultType中寫集合中元素的類型
/** * 返回List集合 */ List<Employee> getEmpsByNameLike(String name);
<!--如果返回的是集合,resultType需要寫集合中元素的類型--> <select id="getEmpsByNameLike" resultType="org.maple.pojo.Employee"> SELECT id,last_name name,email,gender FROM tbl_employee WHERE last_name like concat('%',#{name},'%'); </select>
Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'} Employee{id=8, name='rose', gender=1, email='rose@qq.com'} Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'} Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}
2.返回Map
1.返回的一條記錄的map
key:字段名
value:表中的名字
/** * 返回一條記錄map,key就是列名,值就是表中的值 */ Map<String,Object> getEmpByIdReturnMap(Integer id);
<!--如果返回的是map,resultType需要寫map,mybatis為常用類起了別名--> <select id="getEmpByIdReturnMap" resultType="map"> SELECT id,last_name name,email,gender FROM tbl_employee WHERE id = #{id} </select>
{gender=0, name=tom, id=1, email=tom@atguigu.com}
2.返回多條記錄的map
Map<column,Employee>
key:哪個字段作為key,使用@MapKey("column")
value:封裝對象
/** * 多條記錄封裝Map,Map<Integer,Employee> * @MapKey 告訴mybaits使用哪個屬性封裝成map的key */ @MapKey("id") Map<Integer,Employee> getEmpByNameLikeReturnMap(String name);
<!--如果返回的是map,封裝成emp,resultType需要寫Employee--> <select id="getEmpByNameLikeReturnMap" resultType="org.maple.pojo.Employee"> SELECT id,last_name name,email,gender FROM tbl_employee WHERE last_name like concat('%',#{name},'%'); </select>
{1=Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'}, 8=Employee{id=8, name='rose', gender=1, email='rose@qq.com'},
9=Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'}, 12=Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}}
3.ResultMap
1.簡單的使用
/** * 根據id查詢員工 */ Employee getEmpById(Integer id);
<mapper namespace="org.maple.mapper.EmployeeMapperPlus"> <!--resultMap 自定義封裝規則--> <!-- id:唯一id,方便引用 type:自定義規則的java類型 --> <resultMap id="MyEmp" type="org.maple.pojo.Employee"> <!-- id 主鍵的封裝規則,底層會有優化 column 數據庫中字段 property javaBean中的字段 --> <id column="id" property="id"/> <result column="last_name" property="name"/> <!--其他不指定的列,如果名字一樣,會自動封裝。但是寫resultMap建議都寫上--> <result column="email" property="email"/> <result column="gender" property="gender"/> </resultMap> <!--簡單的使用resultMap--> <select id="getEmpById" resultMap="MyEmp"> SELECT id,last_name,email,gender FROM tbl_employee WHERE id = #{id} </select> </mapper>
2.多表使用(一對一)
public class Employee { private Integer id; private String name; private Character gender; private String email; private Department dept; }
public class Department { private Integer id; private String deptName; }
2.1 第一種規則
級聯屬性的方式
/** * 根據id查出員工和部門信息 */ Employee getEmpAndDeptById(Integer id);
<!--1.級聯屬性的方式-->
<resultMap id="myEmpAndDept" type="org.maple.pojo.Employee"> <id column="id" property="id"/> <result column="last_name" property="name"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <result column="did" property="dept.id"/> <result column="deptName" property="dept.deptName"/> </resultMap> <select id="getEmpAndDeptById" resultMap="myEmpAndDept"> SELECT e.id,e.last_name,e.email,e.gender,d.id did,d.dept_name deptName FROM tbl_employee e INNER JOIN tbl_dept d ON e.d_id = d.id WHERE e.id = #{id} </select>
2.2 第二種規則(association定義對象)
association: property 是 Employee對象中的屬性,javaType是指該屬性屬於哪個javaBean
<!--2.使用association--> <resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee"> <id column="id" property="id"/> <result column="last_name" property="name"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <association property="dept" javaType="org.maple.pojo.Department"> <id column="did" property="id"/> <result column="deptName" property="deptName"/> </association> </resultMap>
2.3 第三種規則(分部查詢,association)
假設之前部門的mapper中已經定義了通過部門id查找部門信息,那么我們就可以通過分部查詢來查詢出員工信息和部門信息
/** * 根據id查出員工和部門信息,分部查詢 */ Employee getEmpAndDeptByIdStep(Integer id);
<!--使用association進行分布查詢--> <resultMap id="myEmpAndDeptStep" type="org.maple.pojo.Employee"> <id column="id" property="id" /> <result column="last_name" property="name"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <!--property:Employee中的屬性 select:調用DepartmentMapper中的查詢方法 命名空間+方法 column:傳給select 方法哪個參數 --> <association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/> </resultMap> <select id="getEmpAndDeptByIdStep" resultMap="myEmpAndDeptStep"> select id,last_name,gender,email,d_id from tbl_employee where id = #{id} </select>
分部查詢的好處,可以實現懶加載:當只需要調用員工的信息時,第二條sql語句就不會發出,知道需要調用部門的信息,才會發sql語句
通過在全局配置文件中添加:
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
3.多表的使用(一對多)
public class Department { private Integer id; private String deptName; private List<Employee> emps; }
1. 嵌套結果集的方式
/** * 根據id查詢部門信息和所有員工 */ Department getDeptAndEmpsById(Integer id);
<!-- 要通過id查詢部門信息和所有員工 --> <resultMap id="myDept" type="org.maple.pojo.Department"> <id column="id" property="id"/> <result column="dept_name" property="deptName"/> <!--定義集合時,使用collection屬性--> <collection property="emps" ofType="org.maple.pojo.Employee"> <id column="eId" property="id"/> <result column="last_name" property="name"/> <result column="gender" property="gender"/> <result column="email" property="email"/> </collection> </resultMap> <select id="getDeptAndEmpsById" resultMap="myDept"> SELECT d.id,d.dept_name,e.id eId,e.last_name,e.gender,e.email FROM tbl_dept d LEFT JOIN tbl_employee e ON d.id = e.d_id WHERE d.id = #{id} </select>
2.分部查詢的方式
/** * 根據id 分部查詢出部門信息和所有員工 */ Department getDeptAndEmpsByIdStep(Integer id);
<!--分部查詢--> <resultMap id="myDeptStep" type="org.maple.pojo.Department"> <id column="id" property="id"/> <result column="dept_name" property="deptName"/> <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection> </resultMap> <select id="getDeptAndEmpsByIdStep" resultMap="myDeptStep"> SELECT id,dept_name FROM tbl_dept WHERE id = #{id} </select>