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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 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 


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
21 5
|
1月前
|
XML 数据库 数据格式
|
1月前
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
14 0
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
XML 存储 数据库
XML 中的元素和属性
【8月更文挑战第22天】
50 0
|
3月前
|
SQL Java 数据库连接
MyBatis Mapper.XML 标签使用说明
MyBatis Mapper.XML 标签使用说明
37 0
|
4月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
53 1
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
1月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
22 3