MyBatis中insert用法

简单的insert用法

首先在UserMapper.class中添加insert方法

...
@param sysUser
@return
 
 int insert(SysUser sysUser);

接着,在UserMapper.xml中添加如下代码:

<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, jdbc=BLOB},
   ***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
   #{createTime, jdbc= TIMESTAMP})
   </insert>

此处的SQL就是一个简单的insert语句,values中通过#{property}方式从参数中取出属性的值
为了防止类型错误,对于一些特殊的数据类型,要指定具体的jdbcType值,headImg指定BLOB类型,createTime指定的类型是TIMESTAMP,date、time、datetime对应的jdbc类型分别是DATE、TIME、TIMESTAMP

如下代码是在UserMapperTest测试类中增加一个方法来测试这个insert方法

@Test
public void testInsert() {
  SqlSession sqlSession =getSqlSession();
  try{
   UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
   //创建一个User对象
   SysUser user = new SysUser();
   user.setUserName("test1");
   user.setUserPassword("******");
   user.setUserEmail("test@mybatis.com");
   user.setUserInfo("test info");
   //读入一张图片进入byte数组中
   user.setHeadImg(new byte[] {1,2,3});
   user.setCreateTime(new Date());
   //将新建对象插入数据库中,result的返回值是执行SQL影响的行数
   int result = userMapper.insert(user);
   //只插入1条数据
   Assert.assertEquals(1,result);
   //id=null,数据库没有给id赋值,并且没有配置回写id的值
   Assert.assertNull(user.getId());
   }finally {
     //选择回滚
     SqlSession.rollback();
     SqlSession.close();
        }
     }

JDBC方法返回主键自增的值(id回写)

这部分主要要学会两个概念,分别是useGeneratedKeys和keyProperty
首先,在UserMapper接口中增加insert2方法

...
@param sysUser
@return
 
 int insert(SysUser sysUser);
 int insert2(SysUser sysUser);

接着,在xml中新增insert2方法

<insert id = "insert2" useGeneratedKeys= "true"  keyProperty ="id">
   insert into sys_user(
        ~~id~~ ,user_name,user_password,user_email,user_info,head_img,create_time)
   values(
   ~~#{id}~~ , #{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbc=BLOB},
   ***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
   #{createTime, jdbc= TIMESTAMP})
   </insert>

useGeneratedKeys方法会使用jdbc的getGeneratedKeys方法获取数据库内部生成的主键,将其赋值给keyProprty配置的id属性,要设置多个属性的时候可以用逗号隔开,这里通常要设置keyColumn属性,按顺序指定数据库的列,这里的值会与keyProperty配置的属性一一对应。本例获取的是数据库返回的主键值,所以SQL中去掉了两处id,分别是id列和对应的#{id}属性

编写测试类:

@Test
public void testInsert2() {
  SqlSession sqlSession =getSqlSession();
  try{
   UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
   //创建一个User对象
   SysUser user = new SysUser();
   user.setUserName("test1");
   user.setUserPassword("******");
   user.setUserEmail("test@mybatis.com");
   user.setUserInfo("test info");
   //读入一张图片进入byte数组中
   user.setHeadImg(new byte[] {1,2,3});
   user.setCreateTime(new Date());
   //将新建对象插入数据库中,result的返回值是执行SQL影响的行数
   int result = userMapper.insert(user);
   //只插入1条数据
   Assert.assertEquals(1,result);
   //*因为本例中Id回写,故id不为空*
   Assert.assertNotNull(user.getId());
   }finally {
     SqlSession.close();
        }
     }

selectKey返回主键的值

适用于提供或不提供自增功能的数据库,本例分MySql和Oracle数据库两个方法

首先在接口和xml中新增insert3方法,UserMapper.class代码:

...
@param sysUser
@return
 
 int insert(SysUser sysUser);
 int insert2(SysUser sysUser);
 int insert3 (SysUser sysUser);

不同的是在UserMapper.xml中,代码如下:

<insert id = "insert3" >
   insert into sys_user(
        ~~id~~ ,user_name,user_password,user_email,user_info,head_img,create_time)
   values(
   ~~#{id}~~ , #{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbc=BLOB},
   ***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
   #{createTime, jdbc= TIMESTAMP})
   </insert>

*<selectKey keyColumn = "id" resultType ="long" keyProperty ="id" order ="AFTER">*
//keyColumn通过生成的键值设置表中的列名,当主键列不是表中的第一列时需要设置,也可通过逗号分隔属性名称类型来获得多个生成的列
     *SELECT LAST_INSERT_ID()*
     //如果是Oracle,上句的写法是:SELECT SEQ_ID.nextval from dual
  *</selectKey>*

selectKey keyColumn 中用于取值和映射,因为执行selectKey语句后id就已经有值了,需要把这个序列值作为主键值插入到数据库中,所以通过keyColumn来指定

order的值和数据库有关,在MySql中,order的值是AFTER,在Oracle中,值是BEFORE

Oracle中SELECT SEQ_ID.nextval from dual 是一个获取序列的SQL语句
MySql中 SELECT LAST_INSERT_ID() 是获取数据库中最后插入的数据的Id值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值