日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

MyBatis-04 MyBatis XML方式之insert元素

發(fā)布時(shí)間:2025/3/21 asp.net 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis-04 MyBatis XML方式之insert元素 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • insert概述
    • 簡單的insert用法
      • 1. UserMapper中添加接口方法
      • 2. UserMapper.xml 添加節(jié)點(diǎn)
      • 3. 編寫單元測試
    • 使用JDCB方式返回主鍵自增的值
      • 1.UserMapper接口增加接口方法
      • 2.UserMapper.xml 配置
      • 3.單元測試
    • 使用selectKey返回主鍵的值
      • 1.UserMapper接口增加接口方法
      • 2.UserMapper.xml 配置
      • 3.單元測試
    • Mysql使用 uuid實(shí)現(xiàn)主鍵

insert概述

和 MyBatis-03 MyBatis XML方式之select元素比起來,insert要簡單的多。 只有讓它返回主鍵值時(shí),由于不同的數(shù)據(jù)庫的主鍵生成方式不同,這種情況會(huì)復(fù)雜一點(diǎn)。


簡單的insert用法

1. UserMapper中添加接口方法

/*** * * @Title: insertSysUser* * @Description: 增加SysUser* * @param sysUser* @return* * @return: int 受影響的行數(shù)*/int insertSysUser(SysUser sysUser);

2. UserMapper.xml 添加節(jié)點(diǎn)

<!-- 添加SysUser --><insert id="insertSysUser" >insert into sys_user(id,user_name, user_password, user_email, user_info, head_img, create_time)values(#{id},#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP})</insert>

先看下insert元素標(biāo)簽包含的屬性

  • id:命名空間中的唯一標(biāo)示符

  • parameterType:傳入的語句參數(shù)的全限定類名或者別名,因?yàn)?MyBatis可以推斷傳入語句的具體參數(shù),因此不建議配置該屬性

  • flushCache :默認(rèn)true,任何時(shí)候只要語句被調(diào)用,都會(huì)清空一級(jí)緩存和二級(jí)緩存

  • timeout:設(shè)置在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫返回請(qǐng)求結(jié)果的秒數(shù)

  • statementType : 默認(rèn)PREPARED

  • useGenerateKeys: 默認(rèn)false. 如果設(shè)置為true , MyBatis會(huì)使用JDBC的getGeneratedKeys方法取出由數(shù)據(jù)庫內(nèi)部生成的主鍵

  • keyProperty: MyBatis通過getGeneratedKeys獲取組建后要將輔助的屬性名。

  • keyColumn:僅對(duì)UPDATE和INSERT又有,通過生成的鍵值設(shè)置表中的列名。

  • databaseId:如果配置了databaseIdProvider, MyBatis會(huì)加載所有的不帶databaseId或者匹配當(dāng)前databaseId的語句。 如果同時(shí)存在帶databaseId和不帶databaseId的語句,后者將被忽略。

此外,insert中的sql語句就是一個(gè)簡單的insert語句,將所有的列都列舉出來,在value中通過#{property}方式從參數(shù)中取出屬性的值

為了防止類型錯(cuò)誤,對(duì)于一些特殊的數(shù)據(jù)類型,建議指定具體的jdbcType值#{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP}


3. 編寫單元測試

@Testpublic void insertSysUserTest() {logger.info("insertSysUserTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);SysUser sysUser = new SysUser();sysUser.setUserName("artisanTest");sysUser.setUserPassword("123456");sysUser.setUserEmail("test@artisan.com");sysUser.setUserInfo("測試用戶");// 模擬頭像sysUser.setHeadImg(new byte[] { 1, 2, 3 });sysUser.setCreateTime(new Date());// 新增用戶 ,返回受影響的行數(shù)int result = userMapper.insertSysUser(sysUser);// 只插入一條數(shù)據(jù) ,期望是1Assert.assertEquals(1, result);// id 為null , 因?yàn)闆]有給ID賦值,也沒有配置回寫id的值 ,期望是nullAssert.assertNull(sysUser.getId());logger.info("受影響的行數(shù):" + result);} catch (Exception e) {e.printStackTrace();} finally {// 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾// 由于默認(rèn)的sqlSessionFactory.openSession()是不自動(dòng)提交的// 除非顯式的commit,否則不會(huì)提交到數(shù)據(jù)庫sqlSession.rollback();logger.info("為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成");sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-15 18:32:49,378 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-15 18:32:49,383 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-15 18:32:49,386 INFO [main] (UserMapperTest.java:152) - insertSysUserTest 2018-04-15 18:32:49,970 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: insert into sys_user( id,user_name, user_password, user_email, user_info, head_img, create_time) values( ?,?, ?, ?, ?, ?, ?) 2018-04-15 18:32:50,060 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: null, artisanTest(String), 123456(String), test@artisan.com(String), 測試用戶(String), java.io.ByteArrayInputStream@50a14c18(ByteArrayInputStream), 2018-04-15 18:32:49.403(Timestamp) 2018-04-15 18:32:50,066 DEBUG [main] (BaseJdbcLogger.java:142) - <== Updates: 1 2018-04-15 18:32:50,067 INFO [main] (UserMapperTest.java:174) - 受影響的行數(shù):1 2018-04-15 18:32:50,078 INFO [main] (UserMapperTest.java:182) - 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成 2018-04-15 18:32:50,080 INFO [main] (UserMapperTest.java:185) - sqlSession close successfully

使用JDCB方式返回主鍵自增的值

在使用主鍵自增(比如MySql 、SQLServer數(shù)據(jù)庫)時(shí),插入數(shù)據(jù)庫后可以需要得到自增的主鍵值,然后使用這個(gè)值進(jìn)行一些其他的操作。

1.UserMapper接口增加接口方法

// 演示使用JDBC方式返回主鍵的自增長值 int insertSysUser2(SysUser sysUser);

2.UserMapper.xml 配置

<!-- 添加SysUser 使用JDBC的方式返回自增長的主鍵的值--><insert id="insertSysUser2" useGeneratedKeys="true" keyProperty="id">insert into sys_user(user_name, user_password, user_email, user_info, head_img, create_time)values(#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP})</insert>

和insertSysUser比較, insertSysUser2主要的變化是在insert 標(biāo)簽上配置了兩個(gè)屬性

useGeneratedKeys="true" keyProperty="id"

useGeneratedKeys設(shè)置為true后, MyBatis會(huì)使用JDBC的getGeneratedKeys方法來取由數(shù)據(jù)庫內(nèi)部生成的主鍵。 獲取主鍵值后將其賦值給keyProperty配置的id屬性。

當(dāng)需要設(shè)置多個(gè)屬性時(shí),使用逗號(hào)分開,這種情況下通常還需要設(shè)置keyColunm屬性,按順序指定數(shù)據(jù)庫的列,這里的列的值會(huì)和keyProperty配置的屬性一一對(duì)應(yīng)。

由于使用數(shù)據(jù)庫返回的主鍵值,所以SQL上線兩部分中的列去掉了id列和對(duì)應(yīng)的#{id}屬性。


3.單元測試

@Testpublic void insertSysUser2Test() {logger.info("insertSysUser2Test");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);SysUser sysUser = new SysUser();sysUser.setUserName("artisanTest");sysUser.setUserPassword("123456");sysUser.setUserEmail("test@artisan.com");sysUser.setUserInfo("測試用戶");// 模擬頭像sysUser.setHeadImg(new byte[] { 1, 2, 3 });sysUser.setCreateTime(new Date());// 新增用戶 ,返回受影響的行數(shù)int result = userMapper.insertSysUser2(sysUser);// 只插入一條數(shù)據(jù) ,期望是1Assert.assertEquals(1, result);// id不為null ,因?yàn)槭褂昧?useGeneratedKeys="true" keyProperty="id"Assert.assertNotNull(sysUser.getId());logger.info("受影響的行數(shù):" + result);logger.info("userId:" + sysUser.getId());} catch (Exception e) {e.printStackTrace();} finally {// 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾// 由于默認(rèn)的sqlSessionFactory.openSession()是不自動(dòng)提交的// 除非顯式的commit,否則不會(huì)提交到數(shù)據(jù)庫sqlSession.rollback();logger.info("為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成");sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-16 00:36:27,508 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-16 00:36:27,511 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-16 00:36:27,514 INFO [main] (UserMapperTest.java:191) - insertSysUser2Test 2018-04-16 00:36:28,049 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: insert into sys_user( user_name, user_password, user_email, user_info, head_img, create_time) values( ?, ?, ?, ?, ?, ?) 2018-04-16 00:36:28,112 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: artisanTest(String), 123456(String), test@artisan.com(String), 測試用戶(String), java.io.ByteArrayInputStream@4021065(ByteArrayInputStream), 2018-04-16 00:36:27.526(Timestamp) 2018-04-16 00:36:28,124 DEBUG [main] (BaseJdbcLogger.java:142) - <== Updates: 1 2018-04-16 00:36:28,125 INFO [main] (UserMapperTest.java:213) - 受影響的行數(shù):1 2018-04-16 00:36:28,125 INFO [main] (UserMapperTest.java:214) - userId:1002 2018-04-16 00:36:28,127 INFO [main] (UserMapperTest.java:222) - 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成 2018-04-16 00:36:28,129 INFO [main] (UserMapperTest.java:225) - sqlSession close successfully

使用selectKey返回主鍵的值

上面這種寫法只適用于支持組件自增的數(shù)據(jù)庫,有些數(shù)據(jù)庫比如Oracle不提供主鍵自增的功能,而是使用序列得到一個(gè)值,然后將這個(gè)值賦給id ,然后再插入數(shù)據(jù)庫。

對(duì)應(yīng)這種情況,可以使用 selectKey標(biāo)簽來獲取主鍵的值,這種方式不僅使用不提供主鍵自增功能的數(shù)據(jù)庫,同時(shí)也適用于提供主鍵自增功能的數(shù)據(jù)庫

1.UserMapper接口增加接口方法

// 演示使用selectKey的方式返回主鍵的自增長值 int insertSysUser3(SysUser sysUser);

2.UserMapper.xml 配置

<!-- 添加SysUser 使用selectKey的方式返回自增長的主鍵的值--><insert id="insertSysUser3">insert into sys_user(user_name, user_password, user_email, user_info, head_img, create_time)values(#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP})<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">select last_insert_id()</selectKey></insert>
  • selectKey標(biāo)簽的keyColum、keyProperty
    和上面useGeneratedKeys的用法含義相同。

  • resultType用于設(shè)置返回值的類型。

  • order屬性的設(shè)置和數(shù)據(jù)庫有關(guān)。

    Mysql中,order屬性設(shè)置為AFTER。因?yàn)楫?dāng)前記錄的主鍵值是在insert語句執(zhí)行成功后才獲取到的。
    Oracle數(shù)據(jù)庫中,order的值設(shè)置為BEFORE,這是因?yàn)镺RCLE數(shù)據(jù)庫需要先從序列中獲取中,然后將值作為主鍵插入數(shù)據(jù)庫中

ORACLE的寫法如下

<insert id="insertUser" > <selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id">SELECT 自定義序列.NEXTVAL FROM DUAL </selectKey>insert into ******* </insert> 注意這里使用的order是“BEFORE”

3.單元測試

@Testpublic void insertSysUser3Test() {logger.info("insertSysUser3Test");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);SysUser sysUser = new SysUser();sysUser.setUserName("artisanTest");sysUser.setUserPassword("123456");sysUser.setUserEmail("test@artisan.com");sysUser.setUserInfo("測試用戶");// 模擬頭像sysUser.setHeadImg(new byte[] { 1, 2, 3 });sysUser.setCreateTime(new Date());// 新增用戶 ,返回受影響的行數(shù)int result = userMapper.insertSysUser3(sysUser);// 只插入一條數(shù)據(jù) ,期望是1Assert.assertEquals(1, result);// id不為null ,因?yàn)槭褂昧?useGeneratedKeys="true" keyProperty="id"Assert.assertNotNull(sysUser.getId());logger.info("受影響的行數(shù):" + result);logger.info("userId:" + sysUser.getId());} catch (Exception e) {e.printStackTrace();} finally {// 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾// 由于默認(rèn)的sqlSessionFactory.openSession()是不自動(dòng)提交的// 除非顯式的commit,否則不會(huì)提交到數(shù)據(jù)庫sqlSession.rollback();logger.info("為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成");sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-16 00:44:17,807 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-16 00:44:17,811 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-16 00:44:17,814 INFO [main] (UserMapperTest.java:231) - insertSysUser3Test 2018-04-16 00:44:18,278 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: insert into sys_user( user_name, user_password, user_email, user_info, head_img, create_time) values( ?, ?, ?, ?, ?, ?) 2018-04-16 00:44:18,353 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: artisanTest(String), 123456(String), test@artisan.com(String), 測試用戶(String), java.io.ByteArrayInputStream@18a52c57(ByteArrayInputStream), 2018-04-16 00:44:17.833(Timestamp) 2018-04-16 00:44:18,359 DEBUG [main] (BaseJdbcLogger.java:142) - <== Updates: 1 2018-04-16 00:44:18,361 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: select last_insert_id() 2018-04-16 00:44:18,362 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 2018-04-16 00:44:18,386 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: last_insert_id() 2018-04-16 00:44:18,386 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1003 2018-04-16 00:44:18,389 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 1 2018-04-16 00:44:18,391 INFO [main] (UserMapperTest.java:253) - 受影響的行數(shù):1 2018-04-16 00:44:18,391 INFO [main] (UserMapperTest.java:254) - userId:1003 2018-04-16 00:44:18,396 INFO [main] (UserMapperTest.java:262) - 為了保持測試數(shù)據(jù)的干凈,這里選擇回滾,不寫入mysql,請(qǐng)觀察日志,回滾完成 2018-04-16 00:44:18,398 INFO [main] (UserMapperTest.java:265) - sqlSession close successfully

Mysql使用 uuid實(shí)現(xiàn)主鍵

需要增加通過select uuid()得到uuid值

<insert id="insertUser"><selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">select uuid()</selectKey>insert into sys_user(user_name, user_password, user_email, user_info, head_img, create_time)values(#{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP}) </insert>

注意這里使用的order是“BEFORE” , 比較簡單就不再測試了。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的MyBatis-04 MyBatis XML方式之insert元素的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。