MyBatis插入和批量插入
注意事項:
批量插入的時候,需要注意動態SQL的寫法:即拼接出來的SQL語句和常規的SQL語句語法一致。
批量插入的時候,需要注意,在後臺要寫成user.name或者map.name,否則會出錯
插入返回主鍵需要通過entity.getId()來進行返回。
概述
使用sqlsession來進行刪除的時候,只有兩個過載的方法 insert(String statement); int insert(String statement, Object parameter);,兩者均返回受影響的條數,底層使用的是update方法(這個在後面會有說明)
本例項包含以下插入:
- 沒有引數
- 根據實體類插入(一個引數,實體類)
- 根據Map插入(一個引數,是Map型別)
- 批量插入(一個引數,引數是陣列List。使用了動態SQL)
- 批量插入(一個引數,引數是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" |
注意,在批量插入的時候,有一點不好的地方在於,如果傳過來的是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( |