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=‘[email protected]‘} Employee{id=8, name=‘rose‘, gender=1, email=‘[email protected]‘} Employee{id=9, name=‘zhaozhihao‘, gender=1, email=‘[email protected]‘} Employee{id=12, name=‘nihao‘, gender=1, email=‘[email protected]‘}
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 protected]}
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=‘[email protected]‘}, 8=Employee{id=8, name=‘rose‘, gender=1, email=‘[email protected]‘}, 9=Employee{id=9, name=‘zhaozhihao‘, gender=1, email=‘[email protected]‘}, 12=Employee{id=12, name=‘nihao‘, gender=1, email=‘[email protected]‘}}
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>
原文地址:https://www.cnblogs.com/mapleins/p/10115233.html