Mybatis入门系列之(三)——DML入门

以下的代码和配置文件请参考:

Mybatis入门系列之(二)——查询入门案例

https://blog.csdn.net/guo20082200/article/details/80086648

insert语句

在UserMapper.java中添加如下方法:

    /**
     * 添加一个用户
     * @param sysUser
     * @return
     */
    int insert(SysUser sysUser);

在UserMapper.xml文件中添加

<!--
        insert:表明这里需要插入一条数据
        属性
        id:命名空间的唯一标识,用来表示该插入语句

        parameterType:即将传入的语句参数的全限定类名或别名,这个参数是可选的
                       因为mybatis可以推断出传入语句的具体参数,因此不建议书写

        flushCache:默认值为true,任何时候只要语句被调用,都会清空一级和二级缓存

        timeout:设置在抛出异常前,驱动程序等待数据库返回请求结果的秒数

        statementType:对于STATEMENT,PREPARED,CALLABLE,MyBatis会分别使用
            Statement,PreparedStatement,CallableStatement,默认值为PREPARED

        useGeneratedKeys:默认值为false,如果设置为true,MyBatis会使用JDBC的
                getGeneratedKeys方法来取出由数据库内部生成的主键

        keyProperty:MyBatis通过getGeneratedKeys方法获取到主键后将要复制的属性名。
                如果希望得到多个数据库自动生成的列,属性值也可以是以逗号分隔的属性名称列表

        keyColumn:仅对INSERT和UPDATE语句有用,通过生成的键值设置表中的列名,这个设置仅在
        某些数据库(PostgreSQL)中是必须的。当主键列不是表中的第一列时,需要设置。
        如果希望得到多个生成的列,也可以是以逗号分隔的属性名称列表

        databaseId:后面再说

        对SQL的说明如下:
            通过#{property}方式从参数中取出属性的值

            BLOB对应的类型是:ByteArrayInputStream,就是二进制数据流
            由于数据库区分date,time,timestamp类型,所以这里指定JDBC类型为TIMESTAMP
    -->
    <insert id="insert">
        INSERT INTO sys_user
          (id,user_name,user_password,user_email,user_info,head_img,create_time)
        VALUES
          (#{id},#{userName},#{userPassword},#{userEmail},
          #{userInfo},#{headImg,jdbcType=BLOB},
          #{createTime,jdbcType=TIMESTAMP})
    </insert>

测试代码:

@Test
    public void testInsert(){
        SqlSession sqlSession = getSqlSession();
        try {

            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            SysUser user = new SysUser();
            user.setUserName("test1");
            user.setUserPassword("123456");
            user.setUserEmail("test1@mybatis.tk");
            user.setUserInfo("test info");
            user.setHeadImg(new Byte[]{1,2,3});
            user.setCreateTime(new Date());
            int insert = userMapper.insert(user);

            //只插入一条记录
            Assert.assertEquals(1,insert);

            //返回插入之后的id
            Assert.assertNull(user.getId());

        }finally {

            //为了不影响其他测试,这里选择回滚
            //由于默认的sqlSessionFactory.openSession();是不自动提交的
            //因此不执行commit操作,数据不会进入数据库
            sqlSession.rollback();
            sqlSession.close();
        }
    }

执行结果如下:

[DEBUG] 2018-04-27 14:37:47,549 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)

==> Preparing: INSERT INTO sys_user (id,user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?,?, ?,?, ?)

[DEBUG] 2018-04-27 14:37:47,580 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)

==> Parameters: null, test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27 14:37:45.403(Timestamp)

[DEBUG] 2018-04-27 14:37:47,636 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)

<== Updates: 1

将UserMapper.xml文件中insert语句对应的日期类型修改为DATE,结果如下

<insert id="insert">
        INSERT INTO sys_user
          (id,user_name,user_password,user_email,user_info,head_img,create_time)
        VALUES
          (#{id},#{userName},#{userPassword},#{userEmail},
          #{userInfo},#{headImg,jdbcType=BLOB},
          #{createTime,jdbcType=DATE})
    </insert>

再次执行测试语句(注意黑色加粗字体):

[DEBUG] 2018-04-27 14:41:47,015 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: INSERT INTO sys_user (id,user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?,?, ?,?, ?)
[DEBUG] 2018-04-27 14:41:47,055 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: null, test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27(Date)
[DEBUG] 2018-04-27 14:41:47,106 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Updates: 1

将UserMapper.xml文件中insert语句对应的日期类型修改为TIME,结果报错:

Data truncation: Incorrect datetime value: ‘14:43:23’ for column ‘create_time’ at row 1


如何获取插入数据库记录的主键值???两种方式

  1. 使用jdbc方式返回主键自增的值

    UserMapper.java中添加

    /**
        * 添加一个用户,返回主键的方式
        * @param sysUser
        * @return
        */
       int insert2(SysUser sysUser);

    UserMapper.xml中添加

    <insert id="insert2" useGeneratedKeys="true" keyColumn="id">
           INSERT INTO sys_user
           (user_name,user_password,user_email,user_info,head_img,create_time)
           VALUES
           (#{userName},#{userPassword},#{userEmail},
           #{userInfo},#{headImg,jdbcType=BLOB},
           #{createTime,jdbcType=TIMESTAMP})
    </insert>

    这里使用了useGeneratedKeys属性,当该属性值为true时,mtbatis会使用jdbc的getGeneratedKeys方法来取出由数据库内部生成的主键。获得主键后将其赋值给keyProperty配置的id属性。当需要设置多个属性时,使用逗号隔开,这种情况下通常还需要设置keyColumn属性,按照指定的数据库的列,这里列的值会和keyProperty配置的属性一一对应。

    测试代码:

    @Test
       public void testInsert2(){
           SqlSession sqlSession = getSqlSession();
           try {
    
               UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
               SysUser user = new SysUser();
               user.setUserName("test1");
               user.setUserPassword("123456");
               user.setUserEmail("test1@mybatis.tk");
               user.setUserInfo("test info");
               user.setHeadImg(new Byte[]{1,2,3});
               user.setCreateTime(new Date());
               int insert = userMapper.insert2(user);
    
               System.out.println(user.getId());
               //只插入一条记录
               Assert.assertEquals(1,insert);
    
               //返回插入之后的id
               Assert.assertNull(user.getId());
    
           }finally {
               sqlSession.rollback();
               sqlSession.close();
           }
       }

    测试结果返回主键值为null,这是因为这里设置了rollback(),改为commit即可。。

  2. 使用selectKey返回主键的值

    UserMapper.java中添加如下代码:

        /**
        * 添加一个用户,使用selectKey的方式
        * @param sysUser
        * @return
        */
       int insert3(SysUser sysUser);

    UserMapper.xml添加如下配置:

    <!--
         selectKey标签属性解析:
           keyColumn:列的值
           keyProperty:属性值
           resultType:设置返回值的类型
           order:这里写AFTER,是因为mysql数据库是在该语句插入成功之后,才会返回主键的值
               如果是Oracle数据库,该值设置为before
    
       -->
       <insert id="insert3">
           INSERT INTO sys_user
           (user_name,user_password,user_email,user_info,head_img,create_time)
           VALUES
           (#{userName},#{userPassword},#{userEmail},
           #{userInfo},#{headImg,jdbcType=BLOB},
           #{createTime,jdbcType=TIMESTAMP})
    
           <selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
               SELECT LAST_INSERT_ID()
           </selectKey>
       </insert>

    测试代码:

    @Test
       public void testInsert3(){
           SqlSession sqlSession = getSqlSession();
           try {
    
               UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
               SysUser user = new SysUser();
               user.setUserName("test1");
               user.setUserPassword("123456");
               user.setUserEmail("test1@mybatis.tk");
               user.setUserInfo("test info");
               user.setHeadImg(new Byte[]{1,2,3});
               user.setCreateTime(new Date());
               int insert = userMapper.insert3(user);
    
               System.out.println(user.getId());
    
           }finally {
               sqlSession.rollback();
               sqlSession.close();
           }
       }
    /*----------------------------------------------------------------------------------
    [DEBUG] 2018-04-27 14:58:45,286 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==>  Preparing: INSERT INTO sys_user (user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?, ?,?, ?) 
    [DEBUG] 2018-04-27 14:58:45,322 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==> Parameters: test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27 14:58:43.662(Timestamp)
    [DEBUG] 2018-04-27 14:58:45,363 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    <==    Updates: 1
    [DEBUG] 2018-04-27 14:58:45,365 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==>  Preparing: SELECT LAST_INSERT_ID() 
    [DEBUG] 2018-04-27 14:58:45,365 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    ==> Parameters: 
    [TRACE] 2018-04-27 14:58:45,397 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
    <==    Columns: LAST_INSERT_ID()
    [TRACE] 2018-04-27 14:58:45,397 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
    <==        Row: 1011
    [DEBUG] 2018-04-27 14:58:45,398 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
    <==      Total: 1
    1011
    ----------------------------------------------------------------------------------*/

update语句

在UserMapper.java中增加如下代码:

    /**
     * 根据主键id更新用户
     * @param sysUser
     * @return
     */
    int updateById(SysUser sysUser);

UserMapper.xml添加如下配置:

<!--
        更新语句
    -->
    <update id="updateById">
        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>

测试代码略去。。。

如何批量更新,后面讲解

delete语句

在UserMapper.java中增加如下代码:

/**
     * 根据主键id删除用户
     *
     * 将该方法修改为 int deleteById(SysUser sysUser);也是正确的
     *
     * @param id
     * @return
     */
    int deleteById(Long id); xxxxxxxxxx <!--        delete标签    -->    <delete id="deleteById">        DELETE FROM  sys_user where id = #{id}    </delete>

UserMapper.xml添加如下配置:

<!--
        delete标签
    -->
    <delete id="deleteById">
        DELETE FROM  sys_user where id = #{id}
    </delete>

测试代码略去。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值