目录
1、Mybatis获取参数的两种方式
MyBatis获取参数值的两种方式:${} 和 #{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号
1.1、单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型
此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
/**
* 根据用户名查询用户信息
* @param username
* @return
*/
User getUserByUsername(String username);
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="user">
select * from t_user where username = '${username}';
</select>
或者
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="user">
select * from t_user where username = #{username};
</select>
此时在配置文件中的参数可任意写
1.2、多个字面量类型的参数
此时Mybatis会将参数放在map集合中,以两种方式存储数据
(1)以arg0 arg1...为键,以参数为值
(2)以param1,param2...为键,以参数为值
因此只需要通过#{} 和${} 访问map集合的键,就可以访问数据,一定要注意${}单引号问题
/**
* 验证登录
* @param username
* @param password
* @return
*/
User checkLogin(String username,String password);
<!-- User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="user">
select * from t_user where username = #{param1} and password =#{param2}
</select>
1.3、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
/**
* 验证登录(以map集合作为参数)
* @param map
* @return
*/
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 testCheckLoginByMap(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String ,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = mapper.checkLoginByMap(map);
System.out.println(user.toString());
}
运行结果
DEBUG 08-25 23:24:28,884==> Preparing: select * from t_user where username = ? and password = ?; (BaseJdbcLogger.java:137)
DEBUG 08-25 23:24:28,916==> Parameters: root(String), 123(String) (BaseJdbcLogger.java:137)
DEBUG 08-25 23:24:28,931<== Total: 1 (BaseJdbcLogger.java:137)
User{id=1, username='root', password='123', age=23, gender='男', email='123456@qq你.com'}
1.4、实体类类型的参数
只需要通过#{} 和${} 访问实体2类中的属性名,就可以获取相应的属性值,一定要注意${}单引号问题
属性名与实体的属性名没有关系,将实体类的get/set方法去掉get/set后将首字母变为小写就是所取的属性名,取值找get,赋值找set
/**
* 添加用户功能
* @param user
*/
void insertUser(User user);
<!-- void insertUser(User user);-->
<insert id="insertUser">
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
</insert>
1.5、使用@Param标识参数
可以在mapper接口方法的参数上设置@Param注解
此时Mybatis会将参数放在map集合中,以两种方式存储数据
(1)以@Param注解的Value属性值为键,以参数为值
(2)以param1,param2...为键,以参数为值
/**
* 验证登录(使用@param注解)
* @param username
* @param password
* @return
*/
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
<!-- 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>
1.6.总结
在获取参数时,我将其分为两种,一种是实体类型的参数,一种是其他参数
对于实体类型的参数,只需要通过#{} 和${} 访问实体2类中的属性名,就可以获取相应的属性值
对于其他类型的参数,我们可以使用@Param注解设置参数的别名,再使用别名来获取参数
2、MyBatis的各种查询功能
2.1、查询一个实体对象
/**
* 根据id查询用户信息
* @param id
* @return
*/
User getUserById(@Param("id") Integer id);
<!-- User getUserById(@Param("id") Integer id);-->
<select id="getUserById" resultType="user">
select * from t_user where id = #{id};
</select>
2.2、查询一个list集合
/**
* 查询全部
* @return
*/
List<User> getAllUser();
<!-- List<User> getAllUser();-->
<select id="getAllUser" resultType="user">
select * from t_user;
</select>
2.3、查询单个数据
/**
* 查询用户的总数量
* @return
*/
Integer getCount();
<!-- Integer getCount();-->
<!--
Mybatis中为java中常用的类型设置了类型别名
Integer:Integer int
int:_int,_integer
Map:map
String:string
-->
<select id="getCount" resultType="java.lang.Integer">
select count(*) from t_user;
</select>
2.4、查询一条数据为map集合
/**
* 根据id查询用户,放在一个Map集合中
* @param id
* @return
*/
Map<String ,Object> getUserByIdMap(@Param("id") Integer id);
<!-- Map<String ,Object> getUserByIdMap(@Param("id") Integer id);-->
<select id="getUserByIdMap" resultType="map">
select * from t_user where id = #{id};
</select>
2.5、查询多条数据为map集合
查询所用的用户信息为map集合
若查询的数据有多条时,并且要将每条数据转换为map集合
此时有两种解决方案
1、将mapper接口方法的返回值设置为泛型是map的list集合
2.可以将每条数据转换的map集合放在一个大的map中,但是必须要通过@MapKey注解将查询的某个字段的值作为大的map的键
一般使用方式一
(1)方式一
/**
* 查询所有用户信息为map集合
* @return
* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取
*/
List<Map<String, Object>> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>
(2)方式二
/**
* 查询所有用户信息为map集合
* @return
* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
*/
@MapKey("id")
Map<String, Object> getAllUserToMap();
<!-- Map<String,Object> getUserByIdMapAll();-->
<select id="getUserByIdMapAll" resultType="map">
select * from t_user;
</select>