美文网首页
Mybatis实例整理记录

Mybatis实例整理记录

作者: 怕冻的南方人 | 来源:发表于2019-02-12 21:48 被阅读0次

    前言

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

    配置问题收录

    233

    mapperXml收录

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

    业务代码示例

    // dao文件的目标接口
    public interface ImageDao {
        // 返回值int为本次操作影响的数据条数,返回值0代表插入失败
        public int saveIgnorePK(Image image);
    }
    
    // mapper映射的实现方法1,通过中间表建立子查询(MySQL特殊)
    <insert id="saveIgnorePK" useGeneratedKeys="true" keyProperty="imageId" >
        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})
    </insert>
    
    // mapper映射的实现方法2,使用<selectKey>的通用解决方案
    <insert id="saveIgnorePK" useGeneratedKeys="true" keyProperty="imageId" >
        <!-- 这里的id会覆盖原参数的 -->
        <selectKey order="BEFORE" resultType="java.lang.Integer" keyProperty="imageId" statementType="">
            select max(image_id)+1 from t_image;
        </selectKey>
        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});
    </insert>
    

    测试代码示例

    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的<selectKey>标签来辅助建立查询,其常用的4个属性在示例中已经给出了。
    • 在实际操作中,由于我们传参全部都是引用传递且使用了单例模式,所以在执行到mapper的过程中,当我们为image对象设置image_id的时候,其实就为image对象调用了setImageId方法,并将我们生成的主键值注入了image对象,所以在方法完成后,我们可以直接使用image.getImageId()获取数据。

    业务SQL收录

    233

    相关文章

      网友评论

          本文标题:Mybatis实例整理记录

          本文链接:https://www.haomeiwen.com/subject/rtkleqtx.html