亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis注解方式之@Update/@Delete使用詳解

 更新時(shí)間:2020年11月30日 10:34:16   作者:小小工匠  
這篇文章主要介紹了MyBatis注解方式之@Update/@Delete使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

@Update

1. RoleMapper接口增加接口方法

 /**
  * 
  * 
  * @Title: updateSysRoleById
  * 
  * @Description: updateSysRoleById
  * 
  * @param sysRole
  * @return
  * 
  * @return: int
  */
 @Update({ "update sys_role set role_name = #{roleName},enabled = #{enabled},create_by = #{createBy},create_time = #{createTime, jdbcType=TIMESTAMP} where id = #{id}" })
 int updateSysRoleById(SysRole sysRole);

2. 單元測(cè)試

@Test
 public void updateSysRoleByIdTest() {
  logger.info("updateSysRoleByIdTest");
  // 獲取SqlSession
  SqlSession sqlSession = getSqlSession();
  try {
   // 獲取RoleMapper接口
   RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);

   // 先根據(jù)ID查詢(xún)出對(duì)應(yīng)的sysRole
   SysRole sysRole = roleMapper.selectSysRoleById((long) 1);
   // roleName期望為管理員
   Assert.assertEquals("管理員", sysRole.getRoleName());

   // 修改RoleName
   sysRole.setRoleName("管理員Artisan");
   // 修改CreateBy
   sysRole.setCreateBy("Artisan");
   // 修改用戶 ,返回受影響的行數(shù)
   int result = roleMapper.updateSysRoleById(sysRole);

   // 只插入一條數(shù)據(jù) ,期望是1
   Assert.assertEquals(1, result);
   logger.info("受影響的行數(shù):" + result);

   // 期望的RoleName為管理員Artisan
   Assert.assertEquals("管理員Artisan", sysRole.getRoleName());
   // 期望的CreateBy為Artisan
   Assert.assertEquals("Artisan", sysRole.getCreateBy());

   logger.info("sysRole:" + sysRole);


  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   // 為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾
   // 由于默認(rèn)的sqlSessionFactory.openSession()是不自動(dòng)提交的
   // 除非顯式的commit,否則不會(huì)提交到數(shù)據(jù)庫(kù)
   sqlSession.rollback();
   logger.info("為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾,不寫(xiě)入mysql,請(qǐng)觀察日志,回滾完成");

   sqlSession.close();
   logger.info("sqlSession close successfully ");
  }
 }
2018-04-19 02:55:57,225 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 02:55:57,230 INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 02:55:57,233 INFO [main] (RoleMapperTest.java:229) - updateSysRoleByIdTest
2018-04-19 02:55:57,726 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.id, a.role_name roleName, a.enabled, a.create_by createBy, a.create_time createTime FROM sys_role a WHERE a.id = ? 
2018-04-19 02:55:57,799 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long)
2018-04-19 02:55:57,824 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, roleName, enabled, createBy, createTime
2018-04-19 02:55:57,825 TRACE [main] (BaseJdbcLogger.java:151) - <==  Row: 1, 管理員, 1, 1, 2018-04-13 21:12:46.0
2018-04-19 02:55:57,828 DEBUG [main] (BaseJdbcLogger.java:145) - <==  Total: 1
2018-04-19 02:55:57,829 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: update sys_role set role_name = ?,enabled = ?,create_by = ?,create_time = ? where id = ? 
2018-04-19 02:55:57,835 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 管理員Artisan(String), 1(Integer), Artisan(String), 2018-04-13 21:12:46.0(Timestamp), 1(Long)
2018-04-19 02:55:57,839 DEBUG [main] (BaseJdbcLogger.java:145) - <== Updates: 1
2018-04-19 02:55:57,840 INFO [main] (RoleMapperTest.java:250) - 受影響的行數(shù):1
2018-04-19 02:55:57,845 INFO [main] (RoleMapperTest.java:257) - sysRole:SysRole [id=1, roleName=管理員Artisan, enabled=1, createBy=Artisan, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]
2018-04-19 02:55:57,849 INFO [main] (RoleMapperTest.java:267) - 為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾,不寫(xiě)入mysql,請(qǐng)觀察日志,回滾完成
2018-04-19 02:55:57,851 INFO [main] (RoleMapperTest.java:270) - sqlSession close successfully 

@Delete

1. RoleMapper接口增加接口方法

/**
  * 
  * 
  * @Title: deleteSysRoleById
  * 
  * @Description: deleteSysRoleById
  * 
  * @param id
  * @return
  * 
  * @return: int
  */
 @Delete("delete from sys_role where id = #{id}")
 int deleteSysRoleById(Long id);

2. 單元測(cè)試

@Test
 public void deleteSysRoleByIdTest() {
  logger.info("deleteSysRoleByIdTest");
  // 獲取SqlSession
  SqlSession sqlSession = getSqlSession();
  try {
   // 獲取roleMapper接口
   RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);

   // 調(diào)用刪除接口
   int result = roleMapper.deleteSysRoleById((long) 1);
   // 期望影響的結(jié)果條數(shù)為 1
   Assert.assertEquals(1, result);

   // 再次查詢(xún)
   SysRole sysRole = roleMapper.selectSysRoleById((long) 1);
   // 期望查詢(xún)出來(lái)的sysRole 為 null
   Assert.assertNull(sysRole);
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   // 為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾
   // 由于默認(rèn)的sqlSessionFactory.openSession()是不自動(dòng)提交的
   // 除非顯式的commit,否則不會(huì)提交到數(shù)據(jù)庫(kù)
   sqlSession.rollback();
   logger.info("為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾,不寫(xiě)入mysql,請(qǐng)觀察日志,回滾完成");

   sqlSession.close();
   logger.info("sqlSession close successfully ");
  }
 }
2018-04-19 02:56:23,024 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 02:56:23,027 INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 02:56:23,030 INFO [main] (RoleMapperTest.java:276) - deleteSysRoleByIdTest
2018-04-19 02:56:23,517 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: delete from sys_role where id = ? 
2018-04-19 02:56:23,589 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long)
2018-04-19 02:56:23,596 DEBUG [main] (BaseJdbcLogger.java:145) - <== Updates: 1
2018-04-19 02:56:23,599 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.id, a.role_name roleName, a.enabled, a.create_by createBy, a.create_time createTime FROM sys_role a WHERE a.id = ? 
2018-04-19 02:56:23,599 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long)
2018-04-19 02:56:23,625 DEBUG [main] (BaseJdbcLogger.java:145) - <==  Total: 0
2018-04-19 02:56:23,628 INFO [main] (RoleMapperTest.java:299) - 為了保持測(cè)試數(shù)據(jù)的干凈,這里選擇回滾,不寫(xiě)入mysql,請(qǐng)觀察日志,回滾完成
2018-04-19 02:56:23,631 INFO [main] (RoleMapperTest.java:302) - sqlSession close successfully 

補(bǔ)充知識(shí):Mybatis注解大全 Mybatis支持的所有注解說(shuō)明

注解 使用對(duì)象 相對(duì)應(yīng)的XML 描述
@CacheNamespace 類(lèi) <cache> 為給定的命名空間(比如類(lèi))配置緩存。屬性有:implemetation, eviction, flushInterval, size, readWrite, blocking 和properties。
@Property N/A <property> 指定參數(shù)值或占位值(placeholder)(能被 mybatis-config.xml內(nèi)的配置屬性覆蓋)。屬性有:name, value。(僅在MyBatis 3.4.2以上版本生效)
@CacheNamespaceRef 類(lèi) <cacheRef> 參照另外一個(gè)命名空間的緩存來(lái)使用。屬性有:value, name。如果你使用了這個(gè)注解,你應(yīng)設(shè)置 value 或者 name 屬性的其中一個(gè)。value 屬性用于指定 Java 類(lèi)型而指定命名空間(命名空間名就是指定的 Java 類(lèi)型的全限定名),name 屬性(這個(gè)屬性?xún)H在MyBatis 3.4.2以上版本生效)直接指定了命名空間的名字。
@ConstructorArgs 方法 <constructor> 收集一組結(jié)果傳遞給一個(gè)結(jié)果對(duì)象的構(gòu)造方法。屬性有:value,它是形式參數(shù)數(shù)組。
@Arg N/A <arg>``<idArg> 單參數(shù)構(gòu)造方法,是 ConstructorArgs 集合的一部分。屬性有:id, column, javaType, jdbcType, typeHandler, select 和 resultMap。id 屬性是布爾值,來(lái)標(biāo)識(shí)用于比較的屬性,和<idArg> XML 元素相似。
@TypeDiscriminator 方法 <discriminator> 一組實(shí)例值被用來(lái)決定結(jié)果映射的表現(xiàn)。屬性有:column, javaType, jdbcType, typeHandler 和 cases。cases 屬性是實(shí)例數(shù)組。
@Case N/A <case> 單獨(dú)實(shí)例的值和它對(duì)應(yīng)的映射。屬性有:value, type, results。results 屬性是結(jié)果數(shù)組,因此這個(gè)注解和實(shí)際的 ResultMap 很相似,由下面的 Results 注解指定。
@Results 方法 <resultMap> 結(jié)果映射的列表,包含了一個(gè)特別結(jié)果列如何被映射到屬性或字段的詳情。屬性有:value, id。value 屬性是 Result 注解的數(shù)組。這個(gè) id 的屬性是結(jié)果映射的名稱(chēng)。
@Result N/A <result>``<id> 在列和屬性或字段之間的單獨(dú)結(jié)果映射。屬性有:id, column, javaType, jdbcType, typeHandler, one, many。id 屬性是一個(gè)布爾值,來(lái)標(biāo)識(shí)應(yīng)該被用于比較(和在 XML 映射中的<id>相似)的屬性。one 屬性是單獨(dú)的聯(lián)系,和 <association> 相似,而 many 屬性是對(duì)集合而言的,和<collection>相似。它們這樣命名是為了避免名稱(chēng)沖突。
@One N/A <association> 復(fù)雜類(lèi)型的單獨(dú)屬性值映射。屬性有:select,已映射語(yǔ)句(也就是映射器方法)的全限定名,它可以加載合適類(lèi)型的實(shí)例。fetchType會(huì)覆蓋全局的配置參數(shù) lazyLoadingEnabled。注意 聯(lián)合映射在注解 API中是不支持的。這是因?yàn)?Java 注解的限制,不允許循環(huán)引用。
@Many N/A <collection> 映射到復(fù)雜類(lèi)型的集合屬性。屬性有:select,已映射語(yǔ)句(也就是映射器方法)的全限定名,它可以加載合適類(lèi)型的實(shí)例的集合,fetchType 會(huì)覆蓋全局的配置參數(shù) lazyLoadingEnabled。注意 聯(lián)合映射在注解 API中是不支持的。這是因?yàn)?Java 注解的限制,不允許循環(huán)引用
@MapKey 方法 ?? 這是一個(gè)用在返回值為 Map 的方法上的注解。它能夠?qū)⒋娣艑?duì)象的 List 轉(zhuǎn)化為 key 值為對(duì)象的某一屬性的 Map。屬性有: value,填入的是對(duì)象的屬性名,作為 Map 的 key 值。
@Options 方法 映射語(yǔ)句的屬性 這個(gè)注解提供訪問(wèn)大范圍的交換和配置選項(xiàng)的入口,它們通常在映射語(yǔ)句上作為屬性出現(xiàn)。Options 注解提供了通俗易懂的方式來(lái)訪問(wèn)它們,而不是讓每條語(yǔ)句注解變復(fù)雜。屬性有:useCache=true, flushCache=FlushCachePolicy.DEFAULT, resultSetType=DEFAULT, statementType=PREPARED, fetchSize=-1, timeout=-1, useGeneratedKeys=false, keyProperty="", keyColumn="", resultSets=""。值得一提的是, Java 注解無(wú)法指定 null 值。因此,一旦你使用了 Options 注解,你的語(yǔ)句就會(huì)被上述屬性的默認(rèn)值所影響。要注意避免默認(rèn)值帶來(lái)的預(yù)期以外的行為。 注意: keyColumn 屬性只在某些數(shù)據(jù)庫(kù)中有效(如 Oracle、PostgreSQL等)。請(qǐng)?jiān)诓迦胝Z(yǔ)句一節(jié)查看更多關(guān)于 keyColumn和 keyProperty 兩者的有效值詳情。
@Insert @Update @Delete @Select 方法 <insert> <update> <delete> <select> 這四個(gè)注解分別代表將會(huì)被執(zhí)行的 SQL 語(yǔ)句。它們用字符串?dāng)?shù)組(或單個(gè)字符串)作為參數(shù)。如果傳遞的是字符串?dāng)?shù)組,字符串之間先會(huì)被填充一個(gè)空格再連接成單個(gè)完整的字符串。這有效避免了以 Java 代碼構(gòu)建 SQL 語(yǔ)句時(shí)的“丟失空格”的問(wèn)題。然而,你也可以提前手動(dòng)連接好字符串。屬性有:value,填入的值是用來(lái)組成單個(gè) SQL 語(yǔ)句的字符串?dāng)?shù)組。
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider 方法 <insert> <update> <delete> <select> 允許構(gòu)建動(dòng)態(tài) SQL。這些備選的 SQL 注解允許你指定類(lèi)名和返回在運(yùn)行時(shí)執(zhí)行的 SQL 語(yǔ)句的方法。(自從MyBatis 3.4.6開(kāi)始,你可以用 CharSequence 代替 String 來(lái)返回類(lèi)型返回值了。)當(dāng)執(zhí)行映射語(yǔ)句的時(shí)候,MyBatis 會(huì)實(shí)例化類(lèi)并執(zhí)行方法,類(lèi)和方法就是填入了注解的值。你可以把已經(jīng)傳遞給映射方法了的對(duì)象作為參數(shù),“Mapper interface type” 和 “Mapper method” and “Database ID” 會(huì)經(jīng)過(guò) ProviderContext (僅在MyBatis 3.4.5及以上支持)作為參數(shù)值。(MyBatis 3.4及以上的版本,支持多參數(shù)傳入) 屬性有: type, method。 type 屬性需填入類(lèi)。 method 需填入該類(lèi)定義了的方法名 (Since 3.5.1, you can omit method attribute, the MyBatis will resolve a target method via the ProviderMethodResolver interface. If not resolve by it, the MyBatis use the reserved fallback method that named provideSql)。 注意 接下來(lái)的小節(jié)將會(huì)討論類(lèi),能幫助你更輕松地構(gòu)建動(dòng)態(tài) SQL。
@Param 參數(shù) N/A 如果你的映射方法的形參有多個(gè),這個(gè)注解使用在映射方法的參數(shù)上就能為它們?nèi)∽远x名字。若不給出自定義名字,多參數(shù)(不包括 RowBounds 參數(shù))則先以 “param” 作前綴,再加上它們的參數(shù)位置作為參數(shù)別名。例如 #{param1}, #{param2},這個(gè)是默認(rèn)值。如果注解是 @Param("person"),那么參數(shù)就會(huì)被命名為 #{person}。
@SelectKey 方法 <selectKey> 這個(gè)注解的功能與 <selectKey> 標(biāo)簽完全一致,用在已經(jīng)被 @Insert 或 @InsertProvider 或 @Update 或 @UpdateProvider 注解了的方法上。若在未被上述四個(gè)注解的方法上作 @SelectKey 注解則視為無(wú)效。如果你指定了 @SelectKey 注解,那么 MyBatis 就會(huì)忽略掉由 @Options注解所設(shè)置的生成主鍵或設(shè)置(configuration)屬性。屬性有:statement填入將會(huì)被執(zhí)行的 SQL 字符串?dāng)?shù)組,keyProperty 填入將會(huì)被更新的參數(shù)對(duì)象的屬性的值,before 填入 true 或 false 以指明 SQL 語(yǔ)句應(yīng)被在插入語(yǔ)句的之前還是之后執(zhí)行。resultType 填入 keyProperty 的 Java 類(lèi)型和用 Statement、 PreparedStatement 和 CallableStatement中的 STATEMENT、 PREPARED 或 CALLABLE中任一值填入 statementType。默認(rèn)值是 PREPARED。
@ResultMap 方法 N/A 這個(gè)注解給 @Select 或者 @SelectProvider提供在 XML 映射中的 <resultMap> 的id。這使得注解的 select 可以復(fù)用那些定義在 XML 中的 ResultMap。如果同一 select 注解中還存在 @Results 或者 @ConstructorArgs,那么這兩個(gè)注解將被此注解覆蓋。
@ResultType 方法 N/A 此注解在使用了結(jié)果處理器的情況下使用。在這種情況下,返回類(lèi)型為 void,所以 Mybatis 必須有一種方式?jīng)Q定對(duì)象的類(lèi)型,用于構(gòu)造每行數(shù)據(jù)。如果有 XML 的結(jié)果映射,請(qǐng)使用 @ResultMap 注解。如果結(jié)果類(lèi)型在 XML 的 <select> 節(jié)點(diǎn)中指定了,就不需要其他的注解了。其他情況下則使用此注解。比如,如果 @Select 注解在一個(gè)將使用結(jié)果處理器的方法上,那么返回類(lèi)型必須是 void 并且這個(gè)注解(或者@ResultMap)必選。這個(gè)注解僅在方法返回類(lèi)型是 void 的情況下生效。
@Flush 方法 N/A 如果使用了這個(gè)注解,定義在 Mapper 接口中的方法能夠調(diào)用 SqlSession#flushStatements() 方法。(Mybatis 3.3及以上)

以上這篇MyBatis注解方式之@Update/@Delete使用詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你了解Java中的Object類(lèi)及類(lèi)中方法

    一文帶你了解Java中的Object類(lèi)及類(lèi)中方法

    Object是Java默認(rèn)提供的一個(gè)類(lèi)。Java里面除了Object類(lèi),所有的類(lèi)都是存在繼承關(guān)系的。默認(rèn)會(huì)繼承Object父?類(lèi)。即所有類(lèi)的對(duì)象都可以使用Object的引用進(jìn)行接收。本文就來(lái)為大家詳細(xì)講講Object類(lèi)及類(lèi)中方法,感興趣的可以了解一下
    2022-08-08
  • mybatis代碼生成+自定義注解+自定義注釋實(shí)例

    mybatis代碼生成+自定義注解+自定義注釋實(shí)例

    這篇文章主要介紹了mybatis代碼生成+自定義注解+自定義注釋實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java通過(guò)cglib動(dòng)態(tài)生成實(shí)體bean的操作

    java通過(guò)cglib動(dòng)態(tài)生成實(shí)體bean的操作

    這篇文章主要介紹了java通過(guò)cglib動(dòng)態(tài)生成實(shí)體bean的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java讀取文件內(nèi)容為string字符串的方法

    java讀取文件內(nèi)容為string字符串的方法

    今天小編就為大家分享一篇java讀取文件內(nèi)容為string字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • win10下配置java環(huán)境變量的方法

    win10下配置java環(huán)境變量的方法

    這篇文章主要介紹了win10下配置java環(huán)境變量的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java空集合使用場(chǎng)景與填坑記錄

    Java空集合使用場(chǎng)景與填坑記錄

    這篇文章主要給大家介紹了關(guān)于Java空集合使用場(chǎng)景與填坑的相關(guān)資料,并且給大家介紹了java判斷集合是否為空的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • SpringMVC @RequestBody Date類(lèi)型的Json轉(zhuǎn)換方式

    SpringMVC @RequestBody Date類(lèi)型的Json轉(zhuǎn)換方式

    這篇文章主要介紹了SpringMVC @RequestBody Date類(lèi)型的Json轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 解決Spring中@Value注解取值為null問(wèn)題

    解決Spring中@Value注解取值為null問(wèn)題

    近期應(yīng)用中因業(yè)務(wù)迭代需要接入 user 客戶端,接入后總是啟動(dòng)失敗,報(bào)注冊(cè) user bean 依賴(lài)的配置屬性為 null,所以接下來(lái)小編就和大家一起排查分析這個(gè)問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08
  • java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串

    java實(shí)現(xiàn)字符串匹配求兩個(gè)字符串的最大公共子串

    這篇文章主要介紹了java實(shí)現(xiàn)求兩個(gè)字符串最大公共子串的方法,詳細(xì)的描述了兩個(gè)字符串的最大公共子串算法的實(shí)現(xiàn),需要的朋友可以參考下
    2016-10-10
  • 使用itextpdf操作pdf的實(shí)例講解

    使用itextpdf操作pdf的實(shí)例講解

    下面小編就為大家分享一篇使用itextpdf操作pdf的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論