Mybatis实例整理记录

前言

这篇博文收录了我平时工作和学习中关于Mybatis使用中的常见的一些操作,包括配置问题和具体mapperXml的编写等,用于回顾和技术积累。

配置问题收录

233

mapperXml收录

1. 为插入的一条数据手动生成主键并将其返回

业务代码示例

// dao文件的目标接口
public interface ImageDao {
    // 返回值int为本次操作影响的数据条数,返回值0代表插入失败
    public int saveIgnorePK(Image image);
}

// mapper映射的实现方法1,通过中间表建立子查询(MySQL特殊)

    INSERT INTO t_image( image_id, image_name, image_type, image_size, image_location,
                         like_count, download_count, uploader_id, upload_time, update_time)
    VALUES ( (select id from (select max(image_id)+1 as id from t_image) as a),
             #{imageName}, #{imageType}, #{imageSize}, #{imageLocation}, 
             #{likeCount}, #{downloadCount}, #{uploaderId}, #{uploadTime}, #{updateTime})


// mapper映射的实现方法2,使用的通用解决方案

    
    
        select max(image_id)+1 from t_image;
    
    INSERT INTO t_image( image_id, image_name, image_type, image_size, image_location,
                         like_count, download_count, uploader_id, upload_time, update_time)
    VALUES ( #{imageId}, #{imageName}, #{imageType}, #{imageSize}, #{imageLocation},
             #{likeCount}, #{downloadCount}, #{uploaderId}, #{uploadTime}, #{updateTime});

测试代码示例

public void testSQL(){
    Image image = new Image();
    image.setAll();
      
    Integer res = imageDao.saveIgnoreAndReturnPK(image);
    System.out.println(res);  // 输出 1
    System.out.println(image.getImageId());  // 输出 10071
}

相关解析

  • mapper方案1中,建立一个子查询,在插入的时候手动摘出当前表的最大值,由于MySQL的读写安全策略,其不允许在同一条SQL中同时读和写,所以建立一个中间表来绕过读写安全策略。
  • mapper方案2中,使用Mybatis的标签来辅助建立查询,其常用的4个属性在示例中已经给出了。
  • 在实际操作中,由于我们传参全部都是引用传递且使用了单例模式,所以在执行到mapper的过程中,当我们为image对象设置image_id的时候,其实就为image对象调用了setImageId方法,并将我们生成的主键值注入了image对象,所以在方法完成后,我们可以直接使用image.getImageId()获取数据。

业务SQL收录

233

你可能感兴趣的:(Mybatis实例整理记录)