img

7、特殊SQL的执行

  • 模糊查询(追加%的方式)
  • 查询返回结果集的处理(结果集返回)
  • 特殊字符处理
  • 获取自增主键

**总览 **

SpecialSqlMapper.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface SpecialSqlMapper {
// 模糊查询
List<User> getUserByLike(@Param("ambiguous") String ambiguous);

void deleteMoreUser(@Param("ids") String ids);

// 单个字面量类型 的形参 建议加上 @Param("tableName")

/**
* 动态设置表名
* @param tableName
* @return
*/
List<User> getUserList(@Param("tableName")String tableName);

//添加用户的信息 并获取自增的主键
void insertUser(User user);
}

SpecialSqlMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="pers.dhx_.mapper.SpecialSqlMapper">

<!-- List<User> getUserByLike(@Param("ambiguous") String ambiguous);-->

<select id="getUserByLike" resultType="User">
<!-- select *from t_user where username like '%#{ambiguous}%'; 这里如果 用#{} 就会被理解为? 无法解析
,因为被'' 包裹了, 会被当成普通的字符串-->
<!-- select *from t_user where username like concat('%',#{ambiguous},'%'); 使用concat 函数-->
select *from t_user where username like '%${ambiguous}%';
</select>

<!--void deleteMoreUser(@Param("ids") String ids); // ids ; 107,108-->
<delete id="deleteMoreUser" >
delete from t_user where id in (${ids})
</delete>
<!-- List<User> getUserList(@Param("tableName")String tableName);-->
<select id="getUserList" resultType="User">
select *from ${tableName};
</select>

<!-- void insertUser(User user);
获取自增的主键
useGeneratedKeys 表示当前的添加功能使用了自增的主键, keyProperty 表示将添加的数据的自增主键赋值 > 为实体类 类型的参数的属性赋值-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
</insert>

</mapper>

7.1、模糊查询

  • 需要注意SQL语句的 引号问题
1
2
3
4
5
6
7
8
<!--接口方法: List<User> getUserByLike(@Param("ambiguous") String ambiguous);-->

<select id="getUserByLike" resultType="User">
<!-- select *from t_user where username like '%#{ambiguous}%'; 这里如果 用#{} 就会被理解为? 无法解析
,因为被'' 包裹了, 会被当成普通的字符串-->
<!-- select *from t_user where username like concat('%',#{ambiguous},'%'); 使用concat 函数-->
select *from t_user where username like '%${ambiguous}%';
</select>

如果使用#{}获取参数,'%#{ambiguous}%',这里如果 用#{} 就会被理解为 ? 无法解析 ,因为被’ '包裹了,会被当成普通的字符串,无法获取到参数

因此需要写两个引号,或者使用concat链接字符串

也可以使用${}

select * from t_user where username like "%"#{mohu}"%"

select *from t_user where username like concat('%',#{ambiguous},'%');

select *from t_user where username like '%${ambiguous}%'

7.2、批量删除

  • 因为 # 有默认逗号隔开的作用,所以只能使用$
1
int deleteMore(@Param("ids") String ids);  
  • 传入的数据 的形式是 “107,108,13,6,87”
1
2
3
<delete id="deleteMoreUser" >
delete from t_user where id in (${ids})
</delete>
  • 这里直接使用${}, 不用再考虑#{}引号的问题

7.3、动态设置表名

  • 没有什么高深的,就是把tableName当做参数
1
2
3
4
<!--    List<User> getUserList(@Param("tableName")String tableName);-->
<select id="getUserList" resultType="User">
select *from ${tableName};
</select>

7.4、添加功能获取自增的主键

  • 这里主要就是用到了 insert标签的 两个属性 :useGeneratedKeyskeyProperty
  1. useGeneratedKeys:设置使用自增的主键

  2. keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中

    表示将添加的数据的自增主键赋值为实体类 类型的参数的属性赋值

1
2
3
4
5
6
<!--    void insertUser(User user);获取自增的主键
useGeneratedKeys 表示当前的添加功能使用了自增的主键,
keyProperty 表示将添加的数据的自增主键赋值 > 为实体类 类型的参数的属性赋值-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
</insert>

8、自定义映射resultMap

8.1、resultMap处理字段和属性的映射关系

若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射