5、MyBatis获取参数值的两种方式
- MyBatis获取参数值的两种方式:${}和#{}
- ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号;
5.1、单个字面量类型的参数
- 若mapper接口中的方法参数为单个的字面量类型
- 此时可以使用${}和#{}以任意的名称获取参数的值,注意{}需要手动加单引号
- mapper接口,此时只有一个参数
public interface UserMapper {
User getUserByUsername(String username);
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="user">
SELECT * FROM t_user WHERE username = #{
username}
</select>
public class ParameterTest {
@Test
public void testGetUserByUsername(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserByUsername("admin");
System.out.println(user);
}
5.2、多个字面量类型的参数
- 若mapper接口中的方法参数为多个时
- 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,注意{}需要手动加单引号
- mapper接口,此时有两个参数
public interface UserMapper {
User checkLogin(String username,String password);
}
<!--checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
SELECT * FROM t_user WHERE #{
param1} and password = #{
param2}
</select>
@Test
public void checkLogin(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLogin("admin", "123456");
sqlSession.close();
}
5.3、map集合类型的参数
- 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中
- 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意{}需要手动加单引号
- mapper接口,用map集合去自定义
public interface UserMapper {
User checkLoginByMap(Map<String,Object>map);
}
<!--User checkLoginByMap(Map<String,Object>map);-->
<select id="checkLoginByMap" resultType="user">
SELECT * FROM t_user WHERE username =#{
username} AND password =#{
password}
</select>
@Test
public void checkLoginByMap(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
mapper.checkLoginByMap(map);
sqlSession.close();
}
5.4、实体类类型的参数
- 若mapper接口中的方法参数为实体类对象时
- 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意{}需要手动加单引号
- mapper接口
public interface UserMapper {
void insertUser(User user);
}
<!-- void insertUser(User user);-->
<insert id="insertUser" >
INSERT INTO t_user VALUES(NULL,#{
username},#{
password},#{
age},#{
sex},#{
email})
</insert>
@Test
public void testInsertUser(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"root","112345",3,"男","1545@qq.com");
mapper.insertUser(user);
sqlSession.close();
}
5.5、使用@Param标识参数
public interface UserMapper {
User CheckLoginByParam(@Param("username") String username, @Param("password") String password);
}
<!--(使用param注解)
User CheckLoginByParam(@Param("username") String username, @Param("password") String password);-->
<select id="CheckLoginByParam" resultType="user">
SELECT * FROM t_user WHERE username = #{
username} AND password = #{
password}
</select>
@Test
public void testCheckLoginByParam(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.CheckLoginByParam("admin", "123456");
sqlSession.close();
}
- 可以通过@Param注解标识mapper接口中的方法参数
- 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以 param1,param2...为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应 的值,注意{}需要手动加单引号
5.6、总结
Mybatis获取参数值的两种方式:#{} ${}
#{}的本质是占位符赋值,${}的本质是字符串拼接
1、若mapper接口方法的参数为单个的字面量类型
此时#{}和{mathJaxContainer[0]}{}的单引号问题
2、若mapper接口方法的参数为多个的字面量类型
此时mybatis会将参数放在map集合中,以两种方式存储数据
1)以arg0,arg1...为键,以参数为值
2)以param1,param2,...为键,以参数为值
因此,只需要通过#{}访问map的键来获取map的值。也可${},注意单引号
下面省略说明{mathJaxContainer[1]}{}实现,且注意加单引号
3、若mapper接口方法的参数为一个map集合类型的参数
只需要通过#{}访问map集合的键来获取map的值。
4、若mapper接口方法的参数为实体类类型的参数
只需要通过#{}访问实体类中的属性名,就可以获取响应的属性值
什么是属性:是get方法去掉‘get’之后的字符串,首字母小写的名称。
因为有时候没有声明成员变量,但是可以在get,set方法中去访问到对应的属性的
5、可以在mapper接口方法的参数上设置@param注解
此时Mybatis会将这些参数放在map中,以两种方式进行存储
1)以@Param注解的value属性值为键,以参数为值
2)以param1,param2...为键,以参数为值
真正使用的就是两种情况:
1.使用注解(包括了情况1,2,3,5 这些情况下建议都用注解)
2.使用实体类对象,直接通过实体类属性获取值就可
6、MyBatis的各种查询功能
6.1、查询一个实体类对象
User getUserById(@Param("id") Integer id);
<select id="getUserById" resultType="User">
select * from t_user where id = #{id}
</select>
6.2、查询一个list集合
List<User> getUserList();
<select id="getUserList" resultType="User">
select * from t_user
</select>
- 当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常
- TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值
6.3、查询单个数据
int getCount();
<select id="getCount" resultType="_integer">
select count(id) from t_user
</select>
6.4、查询一条数据为map集合
Map<String, Object> getUserToMap(@Param("id") int id);
<select id="getUserToMap" resultType="map">
select * from t_user where id = #{id}
</select>
6.5、查询多条数据为map集合
List<Map<String, Object>> getAllUserToMap();
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>
@MapKey("id")
Map<String, Object> getAllUserToMap();
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>