开发者

MyBatis新增数据时自增id的两种写法小结

目录
  • 一、单个插入
    • 1.1 方式一
    • 1.2 方式二
  • 二、批量插入
    • 三、注意

      一、单个插入

      • 接口方法:
          public interface PlayerDao {
              int insertOnePlayer(Player player);
              int inse编程rtOnePlayer2(Player player);
          }
      

      1.1 方式一

         public void testInsertGenerateId1() throws IOException {
                 // 2.获取sqlSession
                 SqlSession sqlSession = sqlSessionFactory.openSession();
                 // 3.获取对应mapper
                 PlayerDao mapper = sqlSession.getMapper(PlayerDao.class);
                 // 4.执行查询语句并返回结果
                 Player player = new Player();
                 player.setPlayName("Allen Iverson");
                 player.setPlayNo(3);
                 player.setTeam("76ers");
                 player.setHeight(1.83F);
                 mapper.insertOnePlayer(player);
                 sqlSession.commit();
                 System.out.println(player.getId());
             }
      
      • Mapper文php件:
            <insert id="insertOnePlayer" parameterType="Player" useGeneratedKeys="true" keyProperty="id">
           		insert into tb_player (id, playName, playNo,team, height)
           		values (
                       #{id,jdbcType=INTEGER},
                       #{playName,jdbcType=VARCHAR},
                       #{playNo,jdbcType=INTEGER},
                       #{team,jdbcType=VARCHAR},
                       #{height,jdbcType=DECIMAL}
           		)
           	</insert>
      
      • 方式一配置:useGeneratedKeys=“true” keyProperty=“id” 即可

      1.2 方式二

          public void testInsertGenerateId2() throws IOException {
                  // 2.获取sqlSession
                  SqlSession sqlSession = sqlSessionFactory.openSession();
                  // 3.获取对应mapper
                  PlayerDao mapper = sqlSession.getMapper(PlayerDao.class);
                  // 4.执行查询语句并返回结果
                  Player player = new Player();
                  player.setPlayName("Tony Parker");
                  player.setPlayNo(9);
                  player.setTeam("spurs");
                  player.setHeight(1.88F);
                  mapper.insertOnePlayer2(player);
                  sqlSession.commit();
                  System.out.println(player.getId());
              }
          
          
          Mapper文件:
         <insert id="insertOnePlayer2" parameterType="Player">
                 <selectKey  keyPropert编程客栈y="id" order="AFTER" resultType="int">
                     select LAST_INSERT_ID()
                 </selectKey>
                 insert into t编程客栈b_player (id, playName, playNo,team, height)
                 values (
                 #{id,jdbcType=INTEGER},
                 #{playName,jdbcType=VARCHAR},
                 #{playNo,jdbcType=INTEGER},
                 #{team,jdbcType=VARCHAR},
                 #{height,jdbcType=DECIMAL}
                 )
             </insert>
      
      • 方式二通过 selectKey 标签完成 ,selectKey 更加灵活,支持一定程度的自定义

      二、批量插入

      • Java文件省略了,这里javascript直接给出Mapper文件, Mapper 文件如下,其实就是:useGeneratedKeys=“true” keyProperty=“id”,其中id是JavaBean的主键id
        <insert id="insertBATch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
         INSERT INTO partition_info (id, node_ip_id, init_schema_info_id,
         prefix_table_index, partition_num, start_time,
         end_time, create_time, is_delete
         )
         values
         <foreach collection="list" item="item" index="index" separator=",">
           (#{item.id,jdbcType=INTEGER}, #{item.nodeIpId,jdbcType=INTEGER}, #{item.initSchemaInfoId,jdbcType=INTEGER},
           #{item.prefixTableIndex,jdbcType=VARCHAR}, #{item.partitionNum,jdbcType=VARCHAR}, #{item.startTime,jdbcType=TIMESTAMP},
           #{item.endTime,jdbcType=TIMESTAMP}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.isDelete,jdbcType=TINYINT}
           )
         </foreach>
       </insert>
      
      • Java代码
              System.out.println("before insert ...");
              for (PartitionInfo p: list) {
                  System.out.println(p);
              }
      
              PartitionInfoMapper mapper = sqlSession.getMapper(PartitionInfoMapper.class);
              int i = mapper.insertBatch(list);
              System.out.println("The rows be affected :" + i);
      
              System.out.println("after insert ...");
              for (PartitionInfo p: list) {
                  System.out.println(p);
              }
      
      • 输出

      before insert ...

      PartitionInfo(id=null, nodeIpId=1, initSchemaInfoId=1, prefixTableIndex=1, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

      PartitionInfo(id=null, nodeIpId=2, initSchemaInfoId=2, prefixTableIndex=2, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

      PartitionInfo(id=null, nodeIpId=3, initSchemaInfoId=3, prefixTableIndex=3, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

      The rows be affected :3

      after insert ...

      PartitionInfo(id=701, nodeIpId=1, initSchemaInfoId=1, prefixTableIndex=1, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

      PartitionInfo(id=702, nodeIpId=2, initSchemaInfoId=2, prefixTableIndex=2, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

      PartitionInfo(id=703, nodeIpId=3, initSchemaInfoId=3, prefixTableIndex=3, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null) 

      • 这里其他的代码都省略了,基本上就是: useGeneratedKeys=“true” keyProperty=“id” 这两个标签起作用
      • 另外我用的mybatis版本是 3.4.1

      三、注意

      • 注意Mapper文件中的 insert into tb_player (id, playName, playNo,team, height),这里不要多了一个逗号,之前height后面还有一个逗号导致一直空指针的错误。

       到此这篇关于MyBatis新增数据时自增id的两种写法小结的文章就介绍到这了,更多相关MyBatis新增数据时自增id内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜