MyBatis注解⽅式之@Update@Delete使⽤详解
@Update
1. RoleMapper接⼝增加接⼝⽅法
/**
*
*
* @Title: updateSysRoleById
*
* @Description: updateSysRoleById
*
* @param sysRole
* @return
*
sql 字符串转数组* @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. 单元测试
@Test
public void updateSysRoleByIdTest() {
logger.info("updateSysRoleByIdTest");
// 获取SqlSession
SqlSession sqlSession = getSqlSession();
try {
// 获取RoleMapper接⼝
RoleMapper roleMapper = Mapper(RoleMapper.class);
// 先根据ID查询出对应的sysRole
SysRole sysRole = roleMapper.selectSysRoleById((long) 1);
// roleName期望为管理员
Assert.assertEquals("管理员", RoleName());
// 修改RoleName
sysRole.setRoleName("管理员Artisan");
// 修改CreateBy
sysRole.setCreateBy("Artisan");
// 修改⽤户 ,返回受影响的⾏数
int result = roleMapper.updateSysRoleById(sysRole);
// 只插⼊⼀条数据 ,期望是1
Assert.assertEquals(1, result);
logger.info("受影响的⾏数:" + result);
// 期望的RoleName为管理员Artisan
Assert.assertEquals("管理员Artisan", RoleName());
// 期望的CreateBy为Artisan
Assert.assertEquals("Artisan", CreateBy());
logger.info("sysRole:" + sysRole);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 为了保持测试数据的⼲净,这⾥选择回滚
// 由于默认的sqlSessionFactory.openSession()是不⾃动提交的
// 除⾮显式的commit,否则不会提交到数据库
logger.info("为了保持测试数据的⼲净,这⾥选择回滚,不写⼊mysql,请观察⽇志,回滚完成");
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) - 受影响的⾏数: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) - 为了保持测试数据的⼲净,这⾥选择回滚,不写⼊mysql,请观察⽇志,回滚完成
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. 单元测试
@Test
public void deleteSysRoleByIdTest() {
logger.info("deleteSysRoleByIdTest");
// 获取SqlSession
SqlSession sqlSession = getSqlSession();
try {
// 获取roleMapper接⼝
RoleMapper roleMapper = Mapper(RoleMapper.class);
// 调⽤删除接⼝
int result = roleMapper.deleteSysRoleById((long) 1);
// 期望影响的结果条数为 1
Assert.assertEquals(1, result);
// 再次查询
SysRole sysRole = roleMapper.selectSysRoleById((long) 1);
// 期望查询出来的sysRole 为 null
Assert.assertNull(sysRole);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 为了保持测试数据的⼲净,这⾥选择回滚
// 由于默认的sqlSessionFactory.openSession()是不⾃动提交的
// 除⾮显式的commit,否则不会提交到数据库
logger.info("为了保持测试数据的⼲净,这⾥选择回滚,不写⼊mysql,请观察⽇志,回滚完成");
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) - 为了保持测试数据的⼲净,这⾥选择回滚,不写⼊mysql,请观察⽇志,回滚完成
2018-04-19 02:56:23,631 INFO [main] (RoleMapperTest.java:302) - sqlSession close successfully
补充知识:Mybatis注解⼤全 Mybatis⽀持的所有注解说明
注解使
⽤
对
象
相对应的XML描述
@CacheNamespace类<cache>为给定的命名空间(⽐如类)配置缓存。属性有:implemetation, eviction, flushInterval, size, readWrite, blocking 和properties。
@Property N/A<property>指定参数值或占位值(placeholder)(能被 l内的配置属性覆盖)。属性有:name, value。(仅在MyBatis 3.4.2以
上版本⽣效)
@CacheNamespaceRef类<cacheRef>参照另外⼀个命名空间的缓存来使⽤。属性有:value, name。如果你使⽤了这个注解,你应设置 value 或者 name 属性的其中⼀个。value 属性⽤于指定 Java 类型⽽指定命名空间(命名空间名就是指定的 Java 类型的全限定名),name 属性(这个属性仅在MyBatis 3.4.2以上版本⽣效)直接指定了命名空间的名字。
@ConstructorArgs⽅
法
<constructor>收集⼀组结果传递给⼀个结果对象的构造⽅法。属性有:value,它是形式参数数组。
@Arg N/A<arg>``<idArg>单参数构造⽅法,是 ConstructorArgs 集合的⼀部分。属性有:id, column, javaType, jdbcType, typeHandler, select 和 resultMap。id
属性是布尔值,来标识⽤于⽐较的属性,和<idArg> XML 元素相似。
@TypeDiscriminator⽅
法
<discriminator>⼀组实例值被⽤来决定结果映射的表现。属性有:column, javaType, jdbcType, typeHandler 和 cases。cases 属性是实例数组。
@Case N/A<case>单独实例的值和它对应的映射。属性有:value, type, results。results 属性是结果数组,因此这个注解和实际的 ResultMap 很相似,由
下⾯的 Results 注解指定。
@Results⽅
法<resultMap>结果映射的列表,包含了⼀个特别结果列如何被映射到属性或字段的详情。属性有:value, id。value 属性是 Result 注解的数组。这个 id 的属性是结果映射的名称。
@Result N/A<result>``<id>在列和属性或字段之间的单独结果映射。属性有:id, column, javaType, jdbcType, typeHandler, one, many。id 属性是⼀个布尔值,来标识应该被⽤于⽐较(和在 XML 映射中的<id>相似)的属性。one 属性是单独的联系,和 <association> 相似,⽽ many 属性是对集合⽽⾔的,和<collection>相似。它们这样命名是为了避免名称冲突。
@One N/A<association>复杂类型的单独属性值映射。属性有:select,已映射语句(也就是映射器⽅法)的全限定名,它可以加载合适类型的实例。fetchType会覆盖全局的配置参数 lazyLoadingEnabled。
注意联合映射在注解 API中是不⽀持的。这是因为 Java 注解的限制,不允许循环引⽤。
@Many N/A<collection>映射到复杂类型的集合属性。属性有:select,已映射语句(也就是映射器⽅法)的全限定名,它可以加载合适类型的实例的集
合,fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。注意联合映射在注解 API中是不⽀持的。这是因为 Java 注解的限制,不允许循环引⽤
@MapKey⽅
法这是⼀个⽤在返回值为 Map 的⽅法上的注解。它能够将存放对象的 List 转化为 key 值为对象的某⼀属性的 Map。属性有: value,填⼊的是对象的属性名,作为 Map 的 key 值。
@Options⽅
法映射语句的属
性
这个注解提供访问⼤范围的交换和配置选项的⼊⼝,它们通常在映射语句上作为属性出现。Options 注解提供了通俗易懂的⽅式来访问
它们,⽽不是让每条语句注解变复杂。属性有:useCache=true, flushCache=FlushCachePolicy.DEFAULT,
resultSetType=DEFAULT, statementType=PREPARED, fetchSize=-1, timeout=-1, useGeneratedKeys=false, keyProperty="",
keyColumn="", resultSets=""。值得⼀提的是, Java 注解⽆法指定 null 值。因此,⼀旦你使⽤了 Options 注解,你的语句就会被上述
属性的默认值所影响。要注意避免默认值带来的预期以外的⾏为。注意: keyColumn 属性只在某些数据库中有效(如 Oracle、
PostgreSQL等)。请在插⼊语句⼀节查看更多关于 keyColumn和 keyProperty 两者的有效值详情。
@Insert @Update @Delete @Select ⽅
法
<insert>
<update>
<delete>
<select>
这四个注解分别代表将会被执⾏的 SQL 语句。它们⽤字符串数组(或单个字符串)作为参数。如果传递的是字符串数组,字符串之间
先会被填充⼀个空格再连接成单个完整的字符串。这有效避免了以 Java 代码构建 SQL 语句时的“丢失空格”的问题。然⽽,你也可以提
前⼿动连接好字符串。属性有:value,填⼊的值是⽤来组成单个 SQL 语句的字符串数组。
@InsertProvider
@UpdateProvider @DeleteProvider @SelectProvider ⽅
法
<insert>
<update>
<delete>
<select>
允许构建动态 SQL。这些备选的 SQL 注解允许你指定类名和返回在运⾏时执⾏的 SQL 语句的⽅法。(⾃从MyBatis 3.4.6开始,你可
以⽤ CharSequence 代替 String 来返回类型返回值了。)当执⾏映射语句的时候,MyBatis 会实例化类并执⾏⽅法,类和⽅法就是填
⼊了注解的值。你可以把已经传递给映射⽅法了的对象作为参数,“Mapper interface type” 和 “Mapper method” and “Database ID” 会
经过 ProviderContext (仅在MyBatis 3.4.5及以上⽀持)作为参数值。(MyBatis 3.4及以上的版本,⽀持多参数传⼊)属性有: type,
method。 type 属性需填⼊类。 method 需填⼊该类定义了的⽅法名 (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)。注意接下来的⼩节将会讨论类,能帮助你更轻松地构建动态 SQL。
@Param参
数N/A如果你的映射⽅法的形参有多个,这个注解使⽤在映射⽅法的参数上就能为它们取⾃定义名字。若不给出⾃定义名字,多参数(不包括 RowBounds 参数)则先以 “param” 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2},这个是默认值。
如果注解是 @Param("person"),那么参数就会被命名为 #{person}。
@SelectKey⽅
法<selectKey>
这个注解的功能与 <selectKey> 标签完全⼀致,⽤在已经被 @Insert 或 @InsertProvider 或 @Update 或 @UpdateProvider 注解了的
⽅法上。若在未被上述四个注解的⽅法上作 @SelectKey 注解则视为⽆效。如果你指定了 @SelectKey 注解,那么 MyBatis 就会忽略
掉由 @Options注解所设置的⽣成主键或设置(configuration)属性。属性有:statement填⼊将会被执⾏的 SQL 字符串数
组,keyProperty 填⼊将会被更新的参数对象的属性的值,before 填⼊ true 或 false 以指明 SQL 语句应被在插⼊语句的之前还是之后
执⾏。resultType 填⼊ keyProperty 的 Java 类型和⽤ Statement、 PreparedStatement 和 CallableStatement中的 STATEMENT、
PREPARED 或 CALLABLE中任⼀值填⼊ statementType。默认值是 PREPARED。
@ResultMap⽅
法N/A这个注解给 @Select 或者 @SelectProvider提供在 XML 映射中的 <resultMap> 的id。这使得注解的 select 可以复⽤那些定义在 XML 中的 ResultMap。如果同⼀ select 注解中还存在 @Results 或者 @ConstructorArgs,那么这两个注解将被此注解覆盖。
@ResultType⽅
法N/A
此注解在使⽤了结果处理器的情况下使⽤。在这种情况下,返回类型为 void,所以 Mybatis 必须有⼀种⽅式决定对象的类型,⽤于构
造每⾏数据。如果有 XML 的结果映射,请使⽤ @ResultMap 注解。如果结果类型在 XML 的 <select> 节点中指定了,就不需要其他的
注解了。其他情况下则使⽤此注解。⽐如,如果 @Select 注解在⼀个将使⽤结果处理器的⽅法上,那么返回类型必须是 void 并且这个
注解(或者@ResultMap)必选。这个注解仅在⽅法返回类型是 void 的情况下⽣效。
@Flush⽅
法N/A如果使⽤了这个注解,定义在 Mapper 接⼝中的⽅法能够调⽤ SqlSession#flushStatements() ⽅法。(Mybatis 3.3及以上)
注解使
⽤
对
象
相对应的XML描述
以上这篇MyBatis注解⽅式之@Update/@Delete使⽤详解就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论