简单的insert用法

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

...
@param sysUser
@returnint 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
@returnint 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
@returnint 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值

MyBatis中insert用法相关推荐

  1. MyBatis中insert将数据插入mysql数据库,显示成功但是数据库不显示数据

    问题:mybatis中使用insert向数据库中插入数据,操作成功但是数据库中没有数据. 原因:mybatis除select外,其他操作(insert,update-)默认不自动提交 解决方法:通过日 ...

  2. MyBatis中@Insert,@Select,@Update,@Delect的使用

    实习中遇到了一个神奇的组件:MyBatis中的@Insert,@Select,@Update,@Delect 在实际开发生产中可以直接在dao层的实现类中添加注解,即可实现我们想要的增删改查操作: 代 ...

  3. Mybatis中limit用法与分页查询

    数据库使用的是mysql 要想在Mybatis中使用分页查询,首先要清楚mysql中limit的用法. limit a,b a是从第a+1条数据开始,b是指读取几条数据 例如:select * fro ...

  4. 后端技术:mybatis中resultMap用法示例笔记

    1.概念 resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合,主要作用是将实体类中的字段与数据库表中的字段进行关联映射.并且支持复杂的返回结果类型. ...

  5. MyBatis中foreach用法

    foreach用法 SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方 ...

  6. MyBatis中exists用法

    MyBatis框架中的exists用法 exists用法 使用示例 总结 exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内 ...

  7. MyBatis中select用法

    使用MyBatis时,只需要在XML中添加一个select元素,写一个SQL,再做一些简单的配置就可以实现映射 使用XML方式 MyBatis支持用接口来调用方法,通过参数注解@param设置参数名字 ...

  8. mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获 ...

  9. insert在python中的用法_python中insert用法是什么_后端开发

    python ipo模型是指什么_后端开发 IPO(Input Processing Output)模式,即输入数据→处理数据→输出结果.采用input输入内容为字符串格式,若输入为数值时,应采用in ...

  10. Mybatis中column用法

    简单记录在开发中使用mybatis遇到的一个问题,也是纠正一下自己的观点: 在学习mybatis的时候,一直理解的是column字段对应的就是数据库中的字段,但是经过开发的一个小插曲得知,column ...

最新文章

  1. C# 篇基础知识3——面向对象编程
  2. Android Activity和Fragment的转场动画
  3. 多线程情况下创建连接池
  4. MVC layout 命名空间引用问题
  5. Proxy 补充学习笔记
  6. 玩转keybd_event
  7. 一个unity2d横版小游戏
  8. CentOS7 设置防火墙端口
  9. Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
  10. java math.floordiv,Math类的常用方法--田小江
  11. 第十篇:SpringBoot集成支付宝接口扫码支付
  12. php站长统计,PHP统计各大引擎蜘蛛爬行访问记录插件
  13. Git 分支篇之分支介绍
  14. php 正则保留数字和,只保留汉字,字母,数字正则
  15. 推荐一款管理系统专用 低 代码工具,一天开发一个系统不是梦
  16. Android ANR问题总结
  17. 什么是横向扩展、纵向扩展
  18. 对一阶二阶低通滤波器推导,并用IMU数据验证算法效果
  19. htc 10 t版最新ruu t-mobile htc 10最新版,可用联通volte 可修复基带丢失
  20. 【SpringBoot商城秒杀系统项目总结25】 项目的亮点和难点及问题解决(源码地址)

热门文章

  1. Contrastive learning的学习
  2. leetcode237题解
  3. 阿里云2核4G云服务器租用CPU内存、公网带宽和系统盘配置
  4. PHP的数据类型主要有三大类八小类。
  5. 股票分析之融资买入分析
  6. 全息投影特效制作详解
  7. 3.28Javase笔记day01
  8. 选择核心路由器时需要注意的七大性能指标
  9. Java-微信授权and手机号授权
  10. Unity 视频播放器插件 AVPro Video -- 360全景视频播放+暴风魔镜sdk