MyBatis查询接收数据 批量删除
- 查询出的数据只有一条
- 通过实体类对象接收
- 通过List集合接收
- 通过map集合接收
- 查询出的数据有多条
- 通过list集合接收
- 通过map类型的list集合接收
- @MapKey注解
- 模糊查询
- 批量删除
- ${}和#{}的区别
查询出的数据只有一条
通过实体类对象接收
mapper接口代码:
映射文件:
<!--TUser getUserById(@Param("id") Integer id);-->
<select id="getUserById" resultType="tUser">
select * from t_user where id = #{id}
</select>
通过List集合接收
mapper接口代码:
映射文件:
<!--List<TUser> getUserById(@Param("id") Integer id);-->
<select id="getUserById" resultType="tUser">
select * from t_user where id = #{id}
</select>
resultType属性里面此时是想将接收过来的数据库取来的字段转换成对应实体类的名称,但既然要转换成实体类对象,那肯定是有前提的,这个前提就是字段名与实体类属性一一对应
那么问题来了?
如果此时我们没有创建实体类来接收数据,那么接收数据该由谁来完成呢
通过map集合接收
mapper接口代码:
映射文件:
<!-- Map<String,Object> getUserByIdToMap();-->
<select id="getUserByIdToMap" resultType="java.util.Map">
select * from t_user where id = #{id}
</select>
查询出的数据有多条
通过list集合接收
mapper接口代码:
映射文件:
<!--List<TUser> getAllUser();-->
<select id="getAllUser" resultType="tUser">
select * from t_user
</select>
通过map类型的list集合接收
mapper接口代码:
映射文件:
<!--List<Map<String,Object>> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user;
</select>
看到这里不知道大家有没有发现什么问题
我们明明没有在配置文件里面给Map类的全类名设置别名,为什么可以直接给这写成map呢?
MyBatis中设置了默认的类型别名
java.lang.Integer-->int,integer
int-->_int,_Integer
Map-->map
String-->string
@MapKey注解
如果接受多个数据时,我们没有实体类也不想用list集合
可以在mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转换的map集合作为值,以某个字段的值作为键,放在同一个map集合中
mapper接口:
映射文件:
<!--Map<String,Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user;
</select>
模糊查询
mapper接口:
映射文件:
<!--List<TUser> getUserByLike(@Param("username")String username);-->
<select id="getUserByLike" resultType="com.yc.mybatis.pojo.TUser">
select * from t_user where username like '%${username}%'
<!-- select * from t_user where username like concat('%',#{username},'%')-->
<!--select * from t_user where username like "%"#{username}"%"-->
</select>
批量删除
mapper接口:
映射文件:
<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
delete from t_user where id in(${ids})
</delete>
${}和#{}的区别
#{}相当于事先给sql语句形成占位符,之后将占位符拿参数依次替换掉占位符
${}就可以想象成我们最开始学JDBC的时候sql语句拼接一样
所以为了防止SQL注入,一般都会选择#{}
但在模糊查询和批量删除的时候,却选择的时
因为
如果是#{}那sql语句会先变成’%?%‘,但在?被’‘包裹着,所以就起不到占位符的作用了
如果是#{}那么value值就会变为’1,2,3’,不符合参数条件