文章目录
一、注意事项
1、注释
/* 不能注释标签 */
<!-- 注释带有标签的代码比较好,不能嵌套,里面可以包裹/* */-->
2、占位符
- #{}
- 传入的参数当成一个字符串,会给传入的参数加单引号
- 能够很大程度上防止sql注入
- 一般用于替换某个值
- ${}
- 将传入的参数直接显示生成在sql中,不会添加引号
- 预编译之前已经被变量替换,无法防止sql注入
- 一般用于替换表名、字段名
- 能用#{}的地方尽量别用${}
3、增、删、改的返回值
- 返回值固定为Integer,表示受影响的行数
4、查询操作
-
必须指定resultType 或者 resultMap
- 不配置别名时,值为类的全限定名
- 返回值是集合,只需要指定集合的泛型即可
List<User>、Set<Integer>、Integer、Long、String
resultType="com.sgp.User"、resultType="java.lang.Integer"
- 内部类
resultType="com.sgp.SysUser$Dept"
Dept内部类必须是static修饰的静态内部类
-
数据库字段与POJO类属性不一致时
- 查询列加别名 = POJO类属性,否则注入不进去
- 或者resultMap
-
通用的返回结果
List<Map>
一个Map对应一条数据,key对应字段名,value对应值
<select id="queryQustNum" resultType="map"> </select>
List<Map<String,Integer>> queryQustNum();
-
返回值Map、实体类区别
- Map
- 返回的类型是固定的,比如Number返回的是BigDecimal,无法泛型成自定义类型,所以只能使用<String,Object>泛型接受
- 若返回值都为String类型,则可以<>
- 实体类
- 会将查询结果转换成属性定义的类型
- Map
-
返回单条记录
- 用Map、实体类接收
- 字段全是null时,返回的实体类、Map=null
- 存在字段=空串时,实体类、Map!=null({beginRunTime=})
-
返回多条记录
- 用集合接收
- 无记录时,集合!=null,而是=empty(list.isEmpty()=true)
- 用Set接收会自动去重
-
Mapper接口方法的入参
- 单个:接口方法只有一个参数时,xml中的参数就是它一个
- 多个:需要添加@Param
Integer updateAgeByName(@Param("name") String name,@Param("age") Integer age);
<update id="updateAgeByName"> update t_user set age=#{age} where name=#{name} </update>
- 这里的#{name}、#{age}对应@Param(“name”)、@Param(“age”),而不是对应参数名
- 通用的参数:Map<String,Object>,一个键值对应一个参数
二、操作
1、新增
1)单条
Integer insert(User bean);
<insert id="insert">
insert into t_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test='username!=null and username!=""'>
username,
</if>
<if test='password!=null and password!=""'>
password,
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test='username!=null and username!=""'>
#{username},
</if>
<if test='password!=null and password!=""'>
#{password},
</if>
</trim>
</insert>
2)批量
Integer insertBatch(List<User> beans);
<insert id="insertBatch">
insert into t_user
(username,password,age)
values
<foreach collection="list" item="bean" separator=",">
(#{bean.username},#{bean.password},#{bean.phone})
</foreach>
</insert>
2、查询
1)多条记录-多字段
List<User> queryAll();
<select id="queryAll" resultType="User">
select id,name,age from t_user
</select>
2)多条记录-单字段
Set<Long> queryIds();
<select id="queryIds" resultType="int">
select id from t_user
</select>
3)单条记录
User queryById(Integer id);
<select id="queryById" resultType="User">
select
id,name,age
from t_user
where id=#{id}
</select>
4)模糊查询
List<User> query(String name);
<select id="queryIds" resultType="User">
select
id,name,age
from t_user
<!-- name like concat(#{name},'_') -->
where name like concat('%',#{name},'%')
</select>
5)聚合值
Integer queryCount();
<select id="queryCount" resultType="int">
select count(id) from t_user
</select>
6)返回列中包含查询参数
select
name,#{date} date
from t_user
where date=#{date}
3、修改
1)单条
Integer updateById(User bean);
<update id="updateById">
update t_user
set
name=#{name},
age=#{age}
where id=#{id}
</update>
2)批量
- 相当于执行多条sql,MyBatis默认执行一条sql,需要在数据库连接url中添加
allowMultiQueries=true
Integer updateBatch(List<User> beans);
<update id="updateBatch">
<foreach collection="list" item="bean" separator=";">
update t_user
set name=#{bean.name},age=#{bean.age}
where id=#{bean.id}
</foreach>
</update>
4、删除
1)单条
Integer deleteById(Integer id);
<delete id="deleteById" >
delete from t_user
where id=#{id}
</delete>
2)批量
Integer deleteByIds(Set<Integer> ids);
<delete id="deleteByIds" >
delete from t_user
where id in
<foreach collection="collection" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>