MyBatis-05 MyBatis XML方式之update/delete元素

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
简介: MyBatis-05 MyBatis XML方式之update/delete元素

概述


接着上篇博客 Mybatis-04Mybatis XML方式之insert元素,我们接着来学习 update和delete, 比较简单。


update 用法

需求: 通过主键更新sys_user

UserMapper接口中增加接口方法

    /**
     * 
     * 
     * @Title: updateSysUserById
     * 
     * @Description: 修改SysUser
     * 
     * @param sysUser
     * @return
     * 
     * @return: int 受影响的行数,这里仅仅是为了做记录,void在实际业务中更常用
     */
    int updateSysUserById(SysUser sysUser);


UserMapper.xml中配置update 元素

<!-- 根据id更改SysUser -->
    <update id="updateSysUserById">
        update sys_user 
            set user_name = #{userName},
                user_password = #{userPassword},
                user_email = #{userEmail},
                user_info = #{userInfo},
                head_img = #{headImg, jdbcType=BLOB},
                create_time = #{createTime, jdbcType=TIMESTAMP}
            where id = #{id}
    </update>


单元测试

@Test
    public void updateSysUserByIdTest() {
        logger.info("updateSysUserByIdTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 先根据ID查询出对应的sysuser
            SysUser sysUser = userMapper.selectSysUserById((long) 1);
            // 当前数据库用户的userName期望为admin
            Assert.assertEquals("admin", sysUser.getUserName());
            // 修改用户名
            sysUser.setUserName("adminUpdated");
            // 修改邮件
            sysUser.setUserEmail("updateSysUser@artisan.com");
            // 修改用户 ,返回受影响的行数
            int result = userMapper.updateSysUserById(sysUser);
            // 只插入一条数据 ,期望是1
            Assert.assertEquals(1, result);
            logger.info("受影响的行数:" + result);
            logger.info("userName:" + sysUser.getUserName() + ",userEmail:" + sysUser.getUserEmail());
            // 期望的用户名为adminUpdated
            Assert.assertEquals("adminUpdated", sysUser.getUserName());
            // 期望的邮箱为updateSysUser@artisan.com
            Assert.assertEquals("updateSysUser@artisan.com", sysUser.getUserEmail());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了保持测试数据的干净,这里选择回滚
            // 由于默认的sqlSessionFactory.openSession()是不自动提交的
            // 除非显式的commit,否则不会提交到数据库
            sqlSession.rollback();
            logger.info("为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成");
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }


日志

2018-04-16 00:55:44,785  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-16 00:55:44,788  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-16 00:55:44,790  INFO [main] (UserMapperTest.java:271) - updateSysUserByIdTest
2018-04-16 00:55:45,193 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 
2018-04-16 00:55:45,247 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-16 00:55:45,270 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
2018-04-16 00:55:45,270 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0
2018-04-16 00:55:45,277 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-16 00:55:45,278 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: update sys_user set user_name = ?, user_password = ?, user_email = ?, user_info = ?, head_img = ?, create_time = ? where id = ? 
2018-04-16 00:55:45,281 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: adminUpdated(String), 123456(String), updateSysUser@artisan.com(String), 管理员用户(String), java.io.ByteArrayInputStream@74c176bf(ByteArrayInputStream), 2018-04-13 21:12:47.0(Timestamp), 1(Long)
2018-04-16 00:55:45,283 DEBUG [main] (BaseJdbcLogger.java:142) - <==    Updates: 1
2018-04-16 00:55:45,284  INFO [main] (UserMapperTest.java:292) - 受影响的行数:1
2018-04-16 00:55:45,284  INFO [main] (UserMapperTest.java:294) - userName:adminUpdated,userEmail:updateSysUser@artisan.com
2018-04-16 00:55:45,288  INFO [main] (UserMapperTest.java:309) - 为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成
2018-04-16 00:55:45,289  INFO [main] (UserMapperTest.java:312) - sqlSession close successfully 


update的基本用法就这么简单,更复杂的情况后面通过动态SQL中阐述。


delete用法

UserMapper接口中增加接口方法

/**
     * 
     * 
     * @Title: deleteSysUserById
     * 
     * @Description: 根据ID删除sysuser
     * 
     * @param id
     * @return
     * 
     * @return: int
     */
    int deleteSysUserById(Long id);


UserMapper.xml中配置delete元素

<!-- 根据ID删除用户 -->
    <delete id="deleteSysUserById">
        delete from sys_user where id = #{id}
    </delete>


单元测试

    @Test
    public void deleteSysUserByIdTest() {
        logger.info("deleteSysUserByIdTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用删除接口
            int result = userMapper.deleteSysUserById((long) 1);
            // 期望影响的结果条数为 1
            Assert.assertEquals(1, result);
            // 再次查询
            SysUser sysUser = userMapper.selectSysUserById((long) 1);
            // 期望查询出来的sysUser 为 null
            Assert.assertNull(sysUser);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了保持测试数据的干净,这里选择回滚
            // 由于默认的sqlSessionFactory.openSession()是不自动提交的
            // 除非显式的commit,否则不会提交到数据库
            sqlSession.rollback();
            logger.info("为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成");
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }


日志

2018-04-16 00:56:01,547  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-16 00:56:01,550  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-16 00:56:01,553  INFO [main] (UserMapperTest.java:320) - deleteSysUserByIdTest
2018-04-16 00:56:01,945 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: delete from sys_user where id = ? 
2018-04-16 00:56:02,023 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-16 00:56:02,029 DEBUG [main] (BaseJdbcLogger.java:142) - <==    Updates: 1
2018-04-16 00:56:02,031 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 
2018-04-16 00:56:02,032 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-16 00:56:02,055 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 0
2018-04-16 00:56:02,060  INFO [main] (UserMapperTest.java:343) - 为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成
2018-04-16 00:56:02,061  INFO [main] (UserMapperTest.java:346) - sqlSession close successfully 


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1212 5
|
XML Java 数据库连接
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
450 21
|
XML 数据库 数据格式
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
440 1
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
1528 0
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
|
XML 存储 数据库
XML 中的元素和属性
【8月更文挑战第22天】
642 0
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
378 1
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
376 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)