1. 程式人生 > >MyBatis插入和批量插入

MyBatis插入和批量插入

注意事項:

批量插入的時候,需要注意動態SQL的寫法:即拼接出來的SQL語句和常規的SQL語句語法一致。

批量插入的時候,需要注意,在後臺要寫成user.name或者map.name,否則會出錯

插入返回主鍵需要通過entity.getId()來進行返回。

概述

使用sqlsession來進行刪除的時候,只有兩個過載的方法 insert(String statement); int insert(String statement, Object parameter);,兩者均返回受影響的條數,底層使用的是update方法(這個在後面會有說明)

本例項包含以下插入:

  1. 沒有引數
  2. 根據實體類插入(一個引數,實體類)
  3. 根據Map插入(一個引數,是Map型別)
  4. 批量插入(一個引數,引數是陣列List。使用了動態SQL)
  5. 批量插入(一個引數,引數是List<map)

動態SQL說明:

<!-- 批量插入 ,傳遞過來的引數是list型別 -->
 <foreach collection="list" item="user" separator=",">(
     #{user.name} ,#{user.age})
   </foreach>

最後拼接的sql語句是:

insert into user(name,age) values     (    ?    ,?)    , (    ?    ,?)    , (    ?    ,?)

mybatis-config.xml: 在src/main/resources/chapter03/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="jdbc.properties"
>
</properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/chapter03/UserMapper.xml" /> </mappers> </configuration>

注意,在批量插入的時候,有一點不好的地方在於,如果傳過來的是List<map> 型別,在進行插入的時候,兩邊的欄位型別不對等,不好搞。因為trim的語法不好在上面用。

對映檔案UserMapper.xml: src/main/resources/mapper/chapter03/UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.liuyiyou.mybatis.mapper.chapter03.UserMapper">

  <!-- 沒有引數的插入 -->
  <insert id="insertUser">
    insert into user(name) values ('test')
  </insert>

  <!-- 引數是實體 -->
  <insert id="insertUserEntity" parameterType="cn.liuyiyou.mybatis.domain.chapter03.User">
    insert into
    user(name,age) values (#{name},#{age})
  </insert>

  <!-- 插入返回主鍵1: -->
  <insert id="insertReturnId" parameterType="cn.liuyiyou.mybatis.domain.chapter03.User">
    insert into
    user(name,age) values (#{name},#{age})
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      SELECT
      LAST_INSERT_ID()
    </selectKey>
  </insert>

  <!-- 插入返回主鍵2: -->
  <insert id="insertReturnId2" parameterType="cn.liuyiyou.mybatis.domain.chapter03.User" useGeneratedKeys="true">
    insert into
    user(name,age) values (#{name},#{age})
  </insert>


  <!-- 引數是Map -->
  <insert id="insertUserMap" parameterType="java.util.Map">
    insert into
    user(name,age) values (#{name},#{age})
  </insert>

  <!-- 批量插入,傳遞過來的引數是List<User> -->
  <insert id="batchInsertList" parameterType="cn.liuyiyou.mybatis.domain.chapter03.User">
    insert into user(name,age) values
    <foreach collection="list" item="user" separator=",">(
      #{user.name} ,#{user.age})
    </foreach>

  </insert>

  <!-- 批量插入,傳遞過來的引數是List<Map<String,Object> -->
  <insert id="batchInsertMap">
    insert into user(name,age) values
    <foreach collection="map" item="map" separator=",">
      (
      #{map.name}<!-- 不能直接是name,因為myBatis無法識別 -->
      ,#{map.age}   )
    </foreach>

  </insert>

 </mapper>

測試類:UserMapperTest

package cn.liuyiyou.mybatis.chapter03;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import cn.liuyiyou.mybatis.domain.chapter02.User;

public class UserMapperTest {

  private static SqlSessionFactory sqlSessionFactory;

  @Before
  public void setUp() throws Exception {
    String resource = "chapter03/mybatis-config.xml";
    InputStream inputStream = null;
    try {
      inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
      e.printStackTrace();
    }
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

  }

  /**
    * 沒有引數
   */
  @Test
  public void insertUserTest() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
      int result = session.update("cn.liuyiyou.mybatis.mapper.chapter03.UserMapper.insertUser");
      Assert.assertEquals(1, result);
      session.commit();
    } finally {
      session.close();
    }
  }

  /**
    * 引數是實體型別:
   */
  @Test
  public void insertUserEntityTest() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
      User user =new User();
      user.setName("insert1");
      user.setAge(
            
           

相關推薦

mybatis單條批量插入返回插入成功後的主鍵id

有些時候我們在新增記錄成功後希望能直接獲取到該記錄的主鍵id值,而不需要再執行一次查詢操作。在使用mybatis作為ORM元件時,可以很方便地達到這個目的。鑑於mybatis目前已經支援xml配置和註解2種方式,所以分別給予詳細介紹。使用xml配置方式1.xml配置:<!-- 插入資料:返回記錄的id值

MyBatis插入批量插入

注意事項: 批量插入的時候,需要注意動態SQL的寫法:即拼接出來的SQL語句和常規的SQL語句語法一致。 批量插入的時候,需要注意,在後臺要寫成user.name或者map.name,否則會出錯 插入返回主鍵需要通過entity.getId()來進行返回。 概述

java連線mysql資料庫實現單條插入批量插入

1、連線資料庫 package com.njupt.ymh; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connection; public

mybatis 框架使用之批量刪除批量插入列子

  <!-- 批量刪除 -->         <delete id="deleteSectionsByIds" parameterType="java.util.Arrays">    &n

mybatis+mysql批量插入批量更新

一、批量插入 批量插入資料使用的sql語句是: insert into table (aa,bb,cc) values(xx,xx,xx),(oo,oo,oo)   mybatis中mapper.xml的程式碼如下:   <!-- 批量插入資料 -->

記錄 - mybatis @Param引數繫結批量插入

需求:要在同一個groupId下批量插入單品。 資料庫如下: CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '單品id', `url` varchar(300) NOT NULL

mybatis 獲取insert 返回的主鍵 批量插入insert

mybatis 獲取insert 返回的主鍵 id <insert id="insertSelective" parameterType="com.vip.collection.manager.sms.entity.SmsTask" > insert into s

maven+mybatis+mybatis-generator+sql server 2005自動生成程式碼,加上自定義分頁外掛批量插入更新外掛

第一步:準備需要的jar包。由於maven只要配置pom.xml就可以從倉庫下載jar包。因此我們首先配置pom.xml。 注意com.microsoft.sqlserver需要自己加入maven倉庫的。 <dependencies> ......

MyBatis Insert返回主鍵批量插入

一、 insert元素 屬性詳解                               其屬性如下:    parameterType ,入參的全限定類名或類型別名    keyColumn ,設定資料表自動生成的主鍵名。對特定資料庫(如PostgreSQL

關於mybatis批量插入批量查詢的sql語句查詢

批量查詢 <select id="findJobInfoByIds" parameterType="java.util.List" resultType="jobInfoDO"> <include refid="jobinfo-select-c

sql Server如何執行批量插入批量刪除

emc pcs -- frog bps eno bbu ads spc 平時我們sql server執行查詢語句都是通過 insert into 表名(字段名,字段名) values(插入值,插入值) --單條插入語句--- insert into Reader(read

jdbcTemplate高效批量插入批量更新 模擬原生jdbc批量10s插入10萬條到mysql

1.專案中親測一次性插入10萬條資料差不多用了10s,這時候只能使用原生jdbc,spring框架為我們薄薄的封裝了個jdbcTemplate 思路就是準備插入資料庫的分隔成1萬條(自己根據資料包或網路定具體數量),將sql拼成字串(減少mysql多次訪問的壓力,拿連線和mysql日誌生成的數量

mybatis 當需要批量插入並更新主鍵相同的資料時的處理方法

該方法 如果表中沒有沒有主鍵對應的資料就新增一條 如果有的話就更新該條資料 <insert id="insertBatch"> REPLACE into representatives_and_principal_personnel (id,examine_and_a

Mybatis 插入批量插入以及多引數批量刪除

實體類: import java.io.Serializable; public class AttachmentTable implements Serializable { private static final long serialVersionUID

MaBatis:使用foreach進行批量插入批量刪除

MaBatis:使用foreach進行批量插入和批量刪除 foreach可以在SQL語句中通過拼接的方式進行集合迭代。foreach元素的屬性主要有collection,item,index,separator,open,close。 1.item屬性:表示迴

mybatis三種批量插入方式對比

準備:  1.表結構 CREATE TABLE `t_user` (  `id` varchar(32) CHARACTER SET utf8 NOT NULL COMMENT '主鍵',  `name` varchar(50) CHARACTER SET utf8 DEFAULT NULL CO

關於Neo4jCypher批量更新批量插入優化的5個建議

原文連結: http://jexp.de/blog/2017/03/5-tips-tricks-for-fast-batched-updates-of-graph-structures-with-neo4j-and-cypher 注:我在測試後,對原文中的部分Cypher語句進行修改,使得其

MyBatis 三種批量插入操作對比

每當使用 ORM 框架進行資料庫操作的時候,就會遇到批量插入操作,如果不對批量插入操作深入瞭解的話就會出現各種各樣的問題,比如操作異常,效能低下,繫結變數超過限制,甚至出現數據庫宕機等各種問題。 本 Chat 主要貢獻內容如下: MyBatis 三種執行器介紹; MyBatis 三種批

Jeesite 批量更新批量插入

Jeesite 批量更新和批量插入 xml配置 <insert id="batchInsertList"> INSERT INTO t_dc_bug( zt_bug_id, product_id ) VALUES <foreach item="item

Mybatis 實現Mysql批量插入資料,判斷資料是否存在

常見插入資料的SQL insert into 插入資料庫時會檢查主鍵是否存在,存在會報錯 replace into 替換資料庫記錄,需要表中有主鍵或者unique索引,如果資料庫已存在的資料,會先刪除該資料然後新增。不存在的資料效果和insert into