MyBatis的增删改查操作(基于xml)


一、注意事项

1、注释

/* 不能注释标签 */

<!-- 注释带有标签的代码比较好,不能嵌套,里面可以包裹/* */-->

2、占位符

  1. #{}
    1. 传入的参数当成一个字符串,会给传入的参数加单引号
    2. 能够很大程度上防止sql注入
    3. 一般用于替换某个值
  2. ${}
    1. 将传入的参数直接显示生成在sql中,不会添加引号
    2. 预编译之前已经被变量替换,无法防止sql注入
    3. 一般用于替换表名、字段名
  • 能用#{}的地方尽量别用${}

3、增、删、改的返回值

  • 返回值固定为Integer,表示受影响的行数

4、查询操作

  1. 必须指定resultType 或者 resultMap

    • 不配置别名时,值为类的全限定名
    • 返回值是集合,只需要指定集合的泛型即可
      List<User>、Set<Integer>、Integer、Long、String
    resultType="com.sgp.User"、resultType="java.lang.Integer"
    
    • 内部类
      resultType="com.sgp.SysUser$Dept"Dept内部类必须是static修饰的静态内部类
  2. 数据库字段与POJO类属性不一致时

    • 查询列加别名 = POJO类属性,否则注入不进去
    • 或者resultMap
  3. 通用的返回结果

    • List<Map>一个Map对应一条数据,key对应字段名,value对应值
    <select id="queryQustNum" resultType="map">
    </select>
    
    List<Map<String,Integer>> queryQustNum();
    
  4. 返回值Map、实体类区别

    1. Map
      • 返回的类型是固定的,比如Number返回的是BigDecimal,无法泛型成自定义类型,所以只能使用<String,Object>泛型接受
      • 若返回值都为String类型,则可以<>
    2. 实体类
      • 会将查询结果转换成属性定义的类型
  5. 返回单条记录

    • 用Map、实体类接收
    • 字段全是null时,返回的实体类、Map=null
    • 存在字段=空串时,实体类、Map!=null({beginRunTime=})
  6. 返回多条记录

    • 用集合接收
    • 无记录时,集合!=null,而是=empty(list.isEmpty()=true)
    • 用Set接收会自动去重
  7. Mapper接口方法的入参

    1. 单个:接口方法只有一个参数时,xml中的参数就是它一个
    2. 多个:需要添加@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>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kimi-001

只想在有限的时间分享更多的知识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值