# 4.MyBatis-获取参数的方式以及查询功能
MyBatis-获取参数的两种方式:
${}本质字符串拼接
#{}本质占位符赋值
# 1.MyBatis获取参数值的各种情况
# 1.mapper接口的方法参数为单个字面量类型
可以通过${}和#{}以任意的名称获取参数值,但需注意方式一的单引号问题
示例:
接口方法:
//根据用户名查询
User getUserByUsername(String username);
2
方式一:
<select id="getUserByUsername" resultType="User">
select * from t_user where username='${username}'
</select>
2
3

方式二:
<select id="getUserByUsername" resultType="User">
select * from t_user where username=#{username}
</select>
2
3

# 2.mapper接口的方法参数为多个时
此时会将参数放在一个map中,以两种方式进行存储:
1)以arg0,arg1为键,参数为值进行存储
2)以param1,param2为键,参数为值进行存储
以键的方式通过${}和#{}访问值即可
同样需要注意sql拼接问题
示例:
接口方法:
User checkLogin(String username, String password);
方式一:
<select id="checkLogin" resultType="User">
select * from t_user where username='${arg0}' and password='${arg1}'
</select>
2
3
select * from t_user where username='admin' and password='123455'
方式二:
<select id="checkLogin" resultType="User">
select * from t_user where username=#{arg0} and password=#{arg1}
</select>
2
3
select * from t_user where username=? and password=?
# 3.mapper接口的方法参数为多个时-手动创建map存储
以键的方式通过${}和#{}访问值即可
示例:
接口方法:
User checkLoginByMap(Map<String, Object> map);
创建map存储
@Test
public void testCheckLoginByMap() {
SqlSession session = SessionUtil.getSession();
ParamMapper mapper = session.getMapper(ParamMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123455");
User admin = mapper.checkLoginByMap(map);
System.out.println(admin);
}
2
3
4
5
6
7
8
9
10
xml文件中编写sql语句(${}和#{}均可)
<select id="checkLoginByMap" resultType="User">
select * from t_user where username=#{username} and password=#{password}
</select>
2
3
# 4.mapper接口的方法参数为实体对象
以属性的方式通过${}和#{}访问值即可
示例:
接口方法:
void addUser(User user);
xml编写sql语句
<insert id="addUser">
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
</insert>
2
3
# 5.使用@Param注解命名参数
此时会将参数放在一个map中,以两种方式进行存储:
1)以@Param注解的值为键,参数为值进行存储
2)以param1,param2为键,参数为值进行存储
以键的方式通过${}和#{}访问值即可
示例:
接口方法:
User checkLoginByParam(@Param("username") String username,@Param("password") String password);
xml编写sql语句
<select id="checkLoginByParam" resultType="User">
select * from t_user where username=#{username} and password=#{password}
</select>
2
3
# 2.Mybatis的各种查询功能
查询结果只有一条数据时
a) 实体类对象接收:直接将查询结果映射为一个实体类对象。
b) List 集合接收:将单条数据封装为一个只包含一个元素的 List 集合。
c) Map 接收:将查询结果的字段名作为 key,字段值作为 value,封装为一个 Map 对象。
结果:{password=123455, sex=男, id=2, age=11, email=123@qq.com, username=张三}
查询结果有多条数据时
- a) List 集合接收:将多条数据封装为一个 List 集合,集合中的每个元素对应一条记录,可以是实体类对象或 Map。
- b) Map集合接收:将多条数据封装到Map集合,需要使用@Mapkey注解将查询出的其中一个字段作为key,整条数据作为值。
- 注意:一定不能通过实体类对象接收,否则 MyBatis 会抛出
TooManyResultsException异常,因为它期望一个结果却得到了多个。
查询功能(1)
查询多条数据
示例:
接口方法:
public interface SelectedMapper {
//User selectAllUser(); 会报错
List<User> selectAllUser();
}
2
3
4
xml
<select id="selectAllUser" resultType="User">
select * from t_user
</select>
2
3
结果:[User{id=2, username='张三', password='123455', age=11, sex='男', email='123@qq.com'}, User{id=3, username='admin', password='123455', age=11, sex='男', email='123@qq.com'}, User{id=12, username='lily', password='12345', age=18, sex='男', email='qq.1234'}]
查询功能(2)
查询单行单列数据
示例:
接口方法:
Integer selectAllUserCount();
xml
<select id="selectAllUserCount" resultType="Integer">
select count(*) from t_user
</select>
2
3
resultType可以写int,Int,integer等等,因为这是Mybatis根据typeAliases自己起的别名
| 别名 | 对应的 Java 类型 | 说明 |
|---|---|---|
| byte | byte | 基本类型 |
| short | short | 基本类型 |
| int | int | 基本类型(最常用) |
| long | long | 基本类型 |
| float | float | 基本类型 |
| double | double | 基本类型 |
| boolean | boolean | 基本类型 |
| char | char | 基本类型 |
| byte | java.lang.Byte | 包装类型(与基本类型同名) |
| short | java.lang.Short | 包装类型 |
| int/integer | java.lang.Integer | 包装类型(两个别名都可用) |
| long | java.lang.Long | 包装类型 |
| float | java.lang.Float | 包装类型 |
| double | java.lang.Double | 包装类型 |
| boolean | java.lang.Boolean | 包装类型 |
| char | java.lang.Character | 包装类型 |
| string | java.lang.String | 字符串类型(最常用) |
查询功能(3)
查询map集合
示例:
接口方法:
Map<String,Object> selectUserByIdToMap(@Param("id") Integer id);
xml
<select id="selectUserByIdToMap" resultType="Map">
select * from t_user where id=#{id}
</select>
2
3
结果:{password=123455, sex=男, id=2, age=11, email=123@qq.com, username=张三}
查询功能(4)
查询多条数据封装成map
接口方法:
@MapKey("id")
Map<String,Object> selectAllUserToMap();
2
xml
<select id="selectAllUserToMap" resultType="Map">
select * from t_user
</select>
2
3
结果
{2={password=123455, sex=男, id=2, age=11, email=123@qq.com, username=张三}, 3={password=123455, sex=男, id=3, age=11, email=123@qq.com, username=admin}, 12={password=12345, sex=男, id=12, age=18, email=qq.1234, username=lily}}