@Insert的用法

找了许久@Insert的用法,先转载一波留个记录,原文链接在最下面

概述
不需要返回主键
1.RoleMapper接口增加接口方法
2.单元测试
返回自增主键
1.RoleMapper接口增加接口方法
2.单元测试
返回非自增主键
1.RoleMapper接口增加接口方法
2.单元测试
概述
@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 ");
        }
    }


返回自增主键
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 ");
        }
    }


返回非自增主键
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 ");
        }
    }


原文:https://blog.csdn.net/yangshangwei/article/details/80003186 
 

你可能感兴趣的:(@Insert的用法)