<!-- User getUserById(@Param("id") Integer id)--> <selectid="getUserById"resultType="user"> select * from t_user where id = #{id}; </select> <!-- List<User> GetAllUser()--> <selectid="GetAllUser"resultType="user"> select * from t_user; </select>
<!-- User getUserByName(String username)--> <selectid="getUserByName"resultType="User"> <!-- select * from t_user where username = #{username};--> select * from t_user where username = '${username}'; </select>
多个字面量类型的参数
MyBatis会自动将这些参数放在一个map集合中,
以arg0,arg1…为键,以参数为值;以 param1,param2…为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,但需注意${}需要手动加单引号
1 2 3 4 5
<!-- User checkLogin(String username,String password)--> <selectid="checkLogin"resultType="User"> <!-- select * from t_user where username = '${arg0}' and password = '${arg1}' ;--> select * from t_user where username = #{arg0} and password = #{param2}; </select>
<!-- User checkLoginByMap(Map<String,Object> map);--> <selectid="checkLoginByMap"resultType="User"> select * from t_user where username = #{username} and password = #{password}; </select>
实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
1 2 3 4
<!-- int addUser(User user)--> <insertid="addUser" > insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email}); </insert>
<!-- User checkUserByAnnotation(@Param("username") String username, @Param("password")String password);--> <selectid="checkUserByAnnotation"resultType="User"> select * from t_user where username = #{ttt} and password = #{password}; </select>
特殊SQL语句
1.模糊查询
只能使用${}
若使用#{},占位符会被解析成?,当中参数里面的一部分,而不是起填充的作用
1 2 3 4 5 6 7
<!--List<User> getUserByFuzzy()--> <selectid="getUserByFuzzy"resultType="User"> <!-- select * from t_user where username like '%${username}%'--> <!-- select * from t_user where username like concat('%',#{username},'%');--> select * from t_user where username like "%"#{username}"%"; </select> </mapper>
<!-- 分步查询第二步--> <!--Dept getDeptByEmpDidStep2(@Param("did") Integer did)--> <!-- 使用resultType 需要配置全局信息,自动把_转换为驼峰命名的方式--> <selectid="getDeptByEmpDidStep2"resultType="dept"> select * from t_dept where did = #{did}; </select>
一对多映射关系处理
一对多 对应的是 集合
方式一:collection标签
目的:设置字段和属性的映射关系
从ofType中获取集合的泛型参数类型,进而获取该类型属性,
将查询得到的字段和属性建立映射关系,创建该类型对象并将每一个对象放进集合中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<!-- Dept getDeptAndEmps(@Param("did") Integer did)--> <resultMapid="emp1"type="dept"> <idproperty="did"column="did"/> <resultproperty="deptName"column="dept_name"/> <!--collection:处理一对多的映射关系 ofType:表示该属性的泛型 --> <collectionproperty="emps"ofType="emp"> <idproperty="eid"column="eid"/> <resultproperty="empName"column="emp_name"/> <resultproperty="age"column="age"/> <resultproperty="sex"column="sex"/> <resultproperty="email"column="email"/> </collection> </resultMap> <selectid="getDeptAndEmps"resultMap="emp1"> select * from t_dept left join t_emp on t_dept.did = t_emp.did where t_dept.did = #{did}; </select>
方式二:分步查询
collection标签用于处理一对多的映射关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<!-- 分步查询第一步--> <!-- Dept getDeptAndEmpStep1(@Param("did") Integer did)--> <resultMapid="emp2"type="dept"> <idproperty="did"column="did"/> <resultproperty="deptName"column="dept_name"/> <collectionproperty="emps" select="mybatis.mapper.EmpMapper.getDeptAndEmpStep2" column="did" fetchType="eager"></collection> </resultMap> <selectid="getDeptAndEmpStep1"resultMap="emp2"> select * from t_dept where did = #{did}; </select>
<!-- 分步查询第二步--> <!--List<Emp> getDeptAndEmpStep2(@Param("did") Integer did)--> <selectid="getDeptAndEmpStep2"resultType="emp"> select * from t_emp where t_emp.did = #{did}; </select>
动态SQL
动态SQL是由MyBatis框架提供的一种根据特定条件动态拼接SQL语句的功能
1.if标签
where 后的 1=1 是一个恒成立的条件,目的是确保当第一个test不成立的时候sql语句的拼接不出错
1 2 3 4 5 6 7 8 9 10
<!--List<Emp> getEmpByCondition(Emp emp)--> <!-- if:根据标签中的test属性所对象的表达式决定标签中的内容是否需要拼接到SQL中 --> <selectid="getEmpByCondition"resultType="emp"> select * from t_emp where 1=1 <iftest="empName != null and empName != ''"> and emp_name = #{empName} </if> <iftest="age != null and age != ''"> and age = #{age} </if>
2.where标签
①where标签中由内容时,会自动生成where关键字,并且将内容前多余的and 或 or去掉
②where标签中没有内容时,此时where标签没有任何效果
where标签不能将内容后多余的and 或 or去掉
1 2 3 4 5 6 7 8 9 10 11
<selectid="getEmpByCondition"resultType="emp"> select * from t_emp <where> <iftest="empName != null and empName != ''"> emp_name = #{empName} </if> <iftest="age != null and age != ''"> and age = #{age} </if> </where> </select>
<selectid="getEmpByCondition"resultType="emp"> select * from t_emp <trimprefix="where"suffixOverrides="and|or"> <iftest="empName != null and empName != ''"> emp_name = #{empName} and </if> <iftest="age != null and age != ''"> age = #{age} or </if> </trim> </select>
<!-- choose、when、otherwise标签--> <selectid="getEmpByChoose"resultType="emp"> select * from t_emp <where> <choose> <whentest="empName != null and empName != ''"> emp_name = #{empName} </when> <whentest="age != null and age != ''"> age = #{age} </when> <otherwise> did = 1 </otherwise> </choose> </where> </select>
5.foreach标签
collection属性值:当前要遍历的数组或集合对象
item属性:数组或集合当次遍历获取到的表示对象
separator属性:遍历数据以什么分隔
open属性:foreach标签所有循环内容从什么开始
close属性:foreach标签所有循环内容到什么结束
①批量删除操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!--方式一 --> <!-- int deleteByArray(@Param("eids") Integer[] eids)--> <deleteid="deleteByArray"> delete from t_emp where eid in <foreachcollection="eids"item="eid"separator=","open="("close=")"> #{eid} </foreach> </delete>
<!-- 方式二--> <deleteid="deleteByArray"> delete from t_emp where <foreachcollection="eids"item="eid"separator="or"> eid = #{eid} </foreach> </delete>
②批量添加操作:
1 2 3 4 5 6 7
<!-- int insertEmpByList(@Param("emps") List<Emp> emps)--> <insertid="insertEmpByList"> insert into t_emp values <foreachcollection="emps"item="emp"separator=","> (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null) </foreach> </insert>