MyBatis-08MyBatis注解方式之@Insert

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MyBatis-08MyBatis注解方式之@Insert

概述


@Insert注解本身很简单,需要注意的是如果需要返回主键的值,情况会稍微复杂一点,这种XML方式配置本质是一样的


不需要返回主键

1.RoleMapper接口增加接口方法

/**
     * 
     * 
     * @Title: insertSysRole
     * 
     * @Description: insertSysRole 不需要返回主键的情况
     * 
     * @param sysRole
     * @return
     * 
     * @return: int
     */
    @Insert({ "insert into sys_role(id, role_name, enabled, create_by, create_time) values(#{id}, #{roleName}, #{enabled}, #{createBy}, #{createTime, jdbcType=TIMESTAMP})" })
    int insertSysRole(SysRole sysRole);


2.单元测试

@Test
    public void insertSysRoleTest() {
        logger.info("insertSysRoleTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取RoleMapper接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            SysRole sysRole = new SysRole();
            sysRole.setId((long) 99);
            sysRole.setRoleName("小工匠");
            sysRole.setEnabled(1);
            sysRole.setCreateBy("test");
            sysRole.setCreateTime(new Date());
            // 新增用户 ,返回受影响的行数
            int result = roleMapper.insertSysRole(sysRole);
            // 只插入一条数据 ,期望是1
            Assert.assertEquals(1, result);
            // 期望roleName 为小工匠
            Assert.assertEquals("小工匠", sysRole.getRoleName());
            logger.info("sysRole:" + sysRole);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了保持测试数据的干净,这里选择回滚
            // 由于默认的sqlSessionFactory.openSession()是不自动提交的
            // 除非显式的commit,否则不会提交到数据库
            sqlSession.rollback();
            logger.info("为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成");
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }
2018-04-19 01:49:02,496  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 01:49:02,501  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 01:49:02,506  INFO [main] (RoleMapperTest.java:120) - insertSysRoleTest
2018-04-19 01:49:02,992 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: insert into sys_role(id, role_name, enabled, create_by, create_time) values(?, ?, ?, ?, ?) 
2018-04-19 01:49:03,076 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 99(Long), 小工匠(String), 1(Integer), test(String), 2018-04-19 01:49:02.52(Timestamp)
2018-04-19 01:49:03,083 DEBUG [main] (BaseJdbcLogger.java:145) - <==    Updates: 1
2018-04-19 01:49:03,088  INFO [main] (RoleMapperTest.java:140) - sysRole:SysRole [id=99, roleName=小工匠, enabled=1, createBy=test, createTime=Thu Apr 19 01:49:02 BOT 2018, user=null, privilegeList=null]
2018-04-19 01:49:03,090  INFO [main] (RoleMapperTest.java:148) - 为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成
2018-04-19 01:49:03,092  INFO [main] (RoleMapperTest.java:151) - sqlSession close successfully 


返回自增主键

1.RoleMapper接口增加接口方法

/**
     * 
     * 
     * @Title: insertSysRole2
     * 
     * @Description: insertSysRole2 返回自增主键的情况
     * 
     * @param sysRole
     * @return
     * 
     * @return: int
     */
    @Insert({ "insert into sys_role(role_name, enabled, create_by, create_time) values(#{roleName}, #{enabled}, #{createBy}, #{createTime, jdbcType=TIMESTAMP})" })
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insertSysRole2(SysRole sysRole);


和第一个场景相比,SQL语句中少了id这一列,注解多了一个@Options, 我们在这个注解设置了useGeneratedKeys 和 keyProperty ,用法同xml中的配置。


2.单元测试


@Test
    public void insertSysRoleTest2() {
        logger.info("insertSysRoleTest2");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取RoleMapper接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            SysRole sysRole = new SysRole();
            sysRole.setRoleName("小工匠2");
            sysRole.setEnabled(1);
            sysRole.setCreateBy("test2");
            sysRole.setCreateTime(new Date());
            // 新增用户 ,返回受影响的行数
            int result = roleMapper.insertSysRole2(sysRole);
            // 只插入一条数据 ,期望是1
            Assert.assertEquals(1, result);
            // 期望roleName 为小工匠
            Assert.assertEquals("小工匠2", sysRole.getRoleName());
            logger.info("sysRole:" + sysRole);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了保持测试数据的干净,这里选择回滚
            // 由于默认的sqlSessionFactory.openSession()是不自动提交的
            // 除非显式的commit,否则不会提交到数据库
            sqlSession.rollback();
            logger.info("为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成");
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }
2018-04-19 01:50:16,054  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 01:50:16,057  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 01:50:16,060  INFO [main] (RoleMapperTest.java:157) - insertSysRoleTest2
2018-04-19 01:50:16,588 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: insert into sys_role(role_name, enabled, create_by, create_time) values(?, ?, ?, ?) 
2018-04-19 01:50:16,684 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 小工匠2(String), 1(Integer), test2(String), 2018-04-19 01:50:16.075(Timestamp)
2018-04-19 01:50:16,690 DEBUG [main] (BaseJdbcLogger.java:145) - <==    Updates: 1
2018-04-19 01:50:16,696  INFO [main] (RoleMapperTest.java:176) - sysRole:SysRole [id=105, roleName=小工匠2, enabled=1, createBy=test2, createTime=Thu Apr 19 01:50:16 BOT 2018, user=null, privilegeList=null]
2018-04-19 01:50:16,702  INFO [main] (RoleMapperTest.java:184) - 为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成
2018-04-19 01:50:16,704  INFO [main] (RoleMapperTest.java:187) - sqlSession close successfully 


返回非自增主键

1.RoleMapper接口增加接口方法

/**
     * 
     * 
     * @Title: insertSysRole3
     * 
     * @Description: insertSysRole3 返回非自增主键的情况
     * 
     * @param sysRole
     * @return
     * 
     * @return: int
     */
    @Insert({ "insert into sys_role(role_name, enabled, create_by, create_time) values(#{roleName}, #{enabled}, #{createBy}, #{createTime, jdbcType=TIMESTAMP})" })
    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", resultType = Long.class, before = false)
    int insertSysRole3(SysRole sysRole);


配置和xml基本是相同的,其中before=false 等同于order=”AFTER”. before=true 等同于order=”BEFORE”.

不同数据库中,order的配置不同,需要注意下。


2.单元测试

@Test
    public void insertSysRoleTest3() {
        logger.info("insertSysRoleTest3");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取RoleMapper接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            SysRole sysRole = new SysRole();
            sysRole.setRoleName("小工匠3");
            sysRole.setEnabled(1);
            sysRole.setCreateBy("test3");
            sysRole.setCreateTime(new Date());
            // 新增用户 ,返回受影响的行数
            int result = roleMapper.insertSysRole3(sysRole);
            // 只插入一条数据 ,期望是1
            Assert.assertEquals(1, result);
            // 期望roleName 为小工匠
            Assert.assertEquals("小工匠3", sysRole.getRoleName());
            logger.info("sysRole:" + sysRole);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 为了保持测试数据的干净,这里选择回滚
            // 由于默认的sqlSessionFactory.openSession()是不自动提交的
            // 除非显式的commit,否则不会提交到数据库
            sqlSession.rollback();
            logger.info("为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成");
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }


2018-04-19 01:50:01,398  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 01:50:01,403  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 01:50:01,406  INFO [main] (RoleMapperTest.java:193) - insertSysRoleTest3
2018-04-19 01:50:01,954 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: insert into sys_role(role_name, enabled, create_by, create_time) values(?, ?, ?, ?) 
2018-04-19 01:50:02,039 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 小工匠3(String), 1(Integer), test3(String), 2018-04-19 01:50:01.428(Timestamp)
2018-04-19 01:50:02,043 DEBUG [main] (BaseJdbcLogger.java:145) - <==    Updates: 1
2018-04-19 01:50:02,046 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT LAST_INSERT_ID() 
2018-04-19 01:50:02,046 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 
2018-04-19 01:50:02,072 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: LAST_INSERT_ID()
2018-04-19 01:50:02,072 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 104
2018-04-19 01:50:02,075 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 1
2018-04-19 01:50:02,079  INFO [main] (RoleMapperTest.java:212) - sysRole:SysRole [id=104, roleName=小工匠3, enabled=1, createBy=test3, createTime=Thu Apr 19 01:50:01 BOT 2018, user=null, privilegeList=null]
2018-04-19 01:50:02,082  INFO [main] (RoleMapperTest.java:220) - 为了保持测试数据的干净,这里选择回滚,不写入mysql,请观察日志,回滚完成
2018-04-19 01:50:02,083  INFO [main] (RoleMapperTest.java:223) - sqlSession close successfully 


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
2月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
2月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
89 5
|
2月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
61 3
|
2月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
202 3
|
2月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
166 1
|
4月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
5月前
|
SQL Java 数据库
5、Mybatis-Plus 常用注解
这篇文章详细介绍了Mybatis-Plus中常用的注解,包括解决实体类与数据库表名不一致、字段不匹配的问题,主键生成策略的配置,以及逻辑删除的实现方法。
5、Mybatis-Plus 常用注解
|
5月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。