MyBatis实用技巧

本文探讨了MyBatis中Mapper接口的继承机制,如何在不修改原始Mapper的情况下进行扩展,以及Mapper.xml中如何配置以支持这种继承。此外,还介绍了使用IN语句的SQL语法、插入记录时返回主键ID的方法、SQL列名取别名的技巧以及批量更新数据的高效写法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mapper的继承

在不改动原来的Mapper.xml情况下,进行扩展,很实用。

Mapper接口继承:

@MybatisMapperpublic interface ItemMapper {

  Item getById(@Param("id") Long id);

}

@MybatisMapper
public interface ItemExMapper extends ItemMapper {

}

Mapper.xml中:

<mapper namespace="com.test.ItemMapper">

  <select id="getById" resultMap="Item">
    select
      *
    from item where id = #{id}
  </select>

  <resultMap id="Item" type="com.test.Item" autoMapping="true">
    <id property="id" column="id" />
  </resultMap>
</mapper>
<mapper namespace="com.test.ItemExMapper">

  <!-- 如果这里不写一遍,就会用到ItemMapper.getById的定义,resultMap就不会是ItemEx-->
  <select id="getById" resultMap="Item">
    select
    *
    from item where id = #{id}
  </select>

  <resultMap id="Item" type="com.test.ItemEx" autoMapping="true">
    <id property="id" column="id" />
  </resultMap>
</mapper>

 

多个字段用IN时的语法

 SELECT * FROM mydata_table
 WHERE (id,`type`) IN ((1,'2'),(2,'2'));

 

添加单一记录时返回主键ID

获取新插入的数据返回的主键:

Integer rows = sqlSession.getMapper(TestMapper.class).insertOneTest(test);

System.out.println("rows = " + rows);

// 添加操作返回记录数

System.out.println("id = " + test.getId()); // 执行添加操作之后通过Java对象获取主键属性值

 

1、在XML映射器中配置(在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。

<!-- 插入数据:返回记录主键id值 --> 
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test"
 useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
 insert into test(name,descr,url,create_time,update_time)
 values(#{name},#{descr},#{url},now(),now()) 
</insert> 

2、接口映射器中:

// 返回主键字段id值 @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
 @Insert("insert into test(name,descr,url,create_time,update_time)
 values(#{name},#{descr},#{url},now(),now())") 
Integer insertOneTest(Test test);

3、添加批量记录时返回主键ID:

<!-- 批量添加数据,并返回主键字段 -->
<insert id="insertBatchTest" useGeneratedKeys="true" keyProperty="id"> 
    INSERT INTO test(name,descr,url,create_time,update_time) 
    VALUES 
    <foreach collection="list" separator="," item="t"> 
        (#{t.name},#{t.descr},#{t.url},now(),now()) 
    </foreach> 
</insert>

 

SQL列明取别名(方便多表联接)

sql标签中可以这样写,用${alias}当变量:

<!-- 别名 -->
  <sql id="Base_Column_List_Alias">
    ${alias}.dept_id, ${alias}.dept_name
  </sql>

然后这样进行引入:

select 
<include refid="Base_Column_List_Alias">
       <property name="alias" value="e" />
</include>
from mytable1 e left join mytable2 f on e.type=f.type

 

update批量更新高效的一种写法

mapper.xml中这样写:

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="status =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                     when id=#{item.id} then #{item.status}
                </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
    </update>
<trim>

实际SQL如下:

UPDATE 
  mydata_table 
SET
  `status` = 
  CASE
    WHEN id = 1 
    THEN 'N' 
    WHEN id = 2 
    THEN 'Y' 
    END
    ...
 WHERE id IN ('1','2')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值