- 基于OGNL表达式
- 完成多条件查询等逻辑实现
- 用于实现动态SQL的元素主要有
if:利用if实现简单的条件选择,满足if属性test的表达式的条件即进入其包围的SQL语句。
<!-- if元素示例-->
<select id="getUserList" resultMap="userList">
select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole=r.id
<if test="userRole!=null ">
and u.userRole =#{userName}
</if>
<if test="userName!=null and userName!=''">
and u.userName like CONCAT ('%',#{userName},'%')
</if>
order by creationDate DESC limit #{from},#{pageSize}
</select>
choose(when,otherwise):相当于Java中的switch语句,通常与when和otherwise搭配。
when元素:当其test属性中的条件满足的时候,就会输出when元素中的内容。
otherwise元素:当when中的所有条件都不满足的时候,就会自动输出otherwise元素中的内容。
<!-- 查询用户列表(chose) -->
<select id="getUserList_choose" resultType="User">
select * from smbms_user where 1=1
<choose>
<when test="userName != null and userName!=''">
and userName like CONCAT ('%',#{userName},'%')
</when>
<when test="userCode !=null and userCode!='' ">
and userCode like CONCAT ('%',#{userCode},'%')
</when>
<when test="userRole != null">
and userRole=#{userRole}
</when>
<otherwise>
and YEAR(creationDate)=YEAR(#{creationDate})
</otherwise>
</choose>
</select>
where:简化SQL语句中的where的条件判断,where元素标签会自动识别其标签内是否有返回值,若有,就插入一个where。此外,若标签返回的内容是以and或者or开头的,会自动剔除。
<!-- 查询出供应商的全部信息(where) -->
<select id="getProviderList" resultType="Provider">
SELECT * FROM smbms_provider
<where>
<if test="proName!=null and proName!='' ">
and proName LIKE CONCAT('%',#{proName},'%')
</if>
<if test="createdBy!=null">
and createdBy=#{createdBy}
</if>
</where>
ORDER BY creationDate DESC LIMIT #{from},#{pageSize}
</select>
set:解决动态更新语句,set元素会在起包含的内容前输出 一个set,若包含的语句是以逗号结束的,会自动把逗号忽略掉。
<!-- 修改用户(set) -->
<update id="modify" parameterType="User">
UPDATE `smbms_user`
<set>
<if test="userCode!=null">userCode=#{userCode},</if>
<if test="userName!=null">userName=#{userName},</if>
<if test="userPassword!=null">userPassword=#{userPassword},</if>
<if test="gender!=null">gender=#{gender},</if>
<if test="birthday!=null">birthday=#{birthday},</if>
<if test="phone!=null">phone=#{phone},</if>
<if test="address!=null">address=#{address},</if>
<if test="userRole!=null">userRole=#{userRole},</if>
<if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
<if test="modifyDate!=null">modifyDate=#{modifyDate}</if>
</set>
WHERE id=#{id}
</update>
trim:可以灵活地去除多余的关键字,trim元素会自动识别其标签内是否有返回值,若有返回值,会在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;也可把包含内容的首部某些内容覆盖(即忽略),或者把尾部的某些内容覆盖,与之对应的属性是prefixOverrides 和suffixOverrides。
<!-- 根据角色名称查询角色信息列表(模糊查询)(trim) -->
<select id="getRoleListByRoleName" resultType="Role">
SELECT * FROM smbms_role
<trim prefix="WHERE" >
<if test="roleName!=null and roleName!='' ">
roleName LIKE CONCAT ('%',#{roleName},'%')
</if>
</trim>
order by creationDate DESC limit #{from},#{pageSize}
</select>
foreach:迭代一个集合,通常用于in条件
foreach的基本元素:
- item:表示集合中每一个元素迭代时的别名
- index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置
- open:表示表示该语句以什么开始 (in条件中为 “(“)
- separator:表示在每次进行迭代之间以什么符号作为分隔符 (in条件中为 “,” )
- close:表示该语句以什么结束 (in条件中为 “)”
- collection:最关键并最容易出错的的属性,需格外注意,该属性必须指定,不同情况下,该属性的值是不一样的。主要有三种情况 :
- 若入参为单参且参数类型是一个List的时候,collection属性值为list。
- 若入参为单参且参数类型是一个数组的时候,collection属性值为array。
- 若传入参数为多参数,就要需要把它们封装为一个Map进行处理。
<!-- 根据用户角色列表,获取该角色列表下用户列表信息-foreach-array -->
<select id="getUserListByRoleId_foreach_array" resultMap="userMapByRole">
select * from smbms_user where userRole in
<foreach collection="array" item="roleIds" open="(" separator=","
close=")">
#{roleIds}
</foreach>
</select>
<!-- 根据用户角色列表,获取该角色列表下用户列表信息-foreach_list -->
<select id="getUserListByRoleId_foreach_list" resultMap="userMapByRole">
select * from smbms_user where userRole in
<foreach collection="list" item="roleList" open="(" separator=","
close=")">
#{roleList}
</foreach>
</select>
<!-- 根据用户角色列表和性别(多参数),获取该角色列表下指定性别的用户列表信息-foreach_map -->
<select id="getUserByConditionMap_foreach_map" resultMap="userMapByRole">
SELECT * FROM smbms_user WHERE gender=#{gender} AND userRole IN
<foreach collection="roleIds" item="roleMap" open="("
separator="," close=")">
#{roleMap}
</foreach>
</select>
/**
* 根据用户角色列表,获取该角色列表下用户列表信息-foreach-array
* @return
*/
public List<User> getUserListByRoleId_foreach_array(Integer[] roleIds);
/**
* 根据用户角色列表,获取该角色列表下用户列表信息-foreach_list
* @return
*/
public List<User> getUserListByRoleId_foreach_list(List<Integer> roleList);
/**
* 根据用户角色列表和性别(单参数),获取该角色列表下指定性别的用户列表信息-foreach_map
* @param conditionMap
* @return
*/
public List<User> getUserByRoleIdMap_foreach_map(Map<String,Object> conditionMap);
小结:
1. MyBatis接收的参数类型:基本类型、对象、List、数组、Map。
2. 无论MyBatis的入参是那种参数类型,MyBatis都会讲参数放在一个Map中,对于单参入参的情况:
- 若入参为基本类型:变量名作为Key,变量值为Value,此时生成的Map只有一个元素。
- 若入参为对象:对象的属性名作为Key,属性值为Value。
- 若入参为List:默认“list”作为Key,该List即为Value。
- 若入参为数组:默认“array”作为Key,该数组即为Value。
- 若入参为Map:键值未变。
MyBatis分页
MySQL的分页功能是基于内存的分页,即查出来所有记录,在按起始位置和页面容量取出结果。
获得总记录数
/**
* 查询用户表记录数
* @return
*/
public int count();
/**
* 查询用户列表(分页显示)
* @param userName
* @param userRole
* @return
*/
public List<User> getUserList(
@Param("userName")String userName,
@Param("userRole")Integer roleId,
@Param("from")Integer currentPageNo,
@Param("pageSize")Integer pageSize
);
实现分页
<!-- 查询用户列表 -->
<select id="getUserList" resultMap="userList">
select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole=r.id
<if test="userRole!=null ">
and u.userRole =#{userName}
</if>
<if test="userName!=null and userName!=''">
and u.userName like CONCAT ('%',#{userName},'%')
</if>
order by creationDate DESC limit #{from},#{pageSize}
</select>
测试
@Test
public void testGetUserList() {
SqlSession sqlSession = null;
List<User> userList = new ArrayList<User>();
try {
sqlSession = MyBatisUtil.createSqlSession();
String userName = "";
Integer roleId = null;
Integer currentPageNo=5;
Integer pageSize=5;
userList = sqlSession.getMapper(UserMapper.class).getUserList(userName, roleId, currentPageNo, pageSize);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug("userList.size:"+userList.size());
for (User user : userList) {
logger.debug("testGetUserList=======>id:" + user.getId()
+ " and userCode:" + user.getUserCode()
+ " and userName:"+ user.getUserName()
+ " and userRole:"+user.getUserRole()
+" and roleName:"+user.getUserRoleName()
+" and phone:"+user.getPhone()
+" and age:"+user.getAge()
+" and gender:"+user.getGender()
);
}
}