MyBatis中insert用法
简单的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用法相关推荐
- MyBatis中insert将数据插入mysql数据库,显示成功但是数据库不显示数据
问题:mybatis中使用insert向数据库中插入数据,操作成功但是数据库中没有数据. 原因:mybatis除select外,其他操作(insert,update-)默认不自动提交 解决方法:通过日 ...
- MyBatis中@Insert,@Select,@Update,@Delect的使用
实习中遇到了一个神奇的组件:MyBatis中的@Insert,@Select,@Update,@Delect 在实际开发生产中可以直接在dao层的实现类中添加注解,即可实现我们想要的增删改查操作: 代 ...
- Mybatis中limit用法与分页查询
数据库使用的是mysql 要想在Mybatis中使用分页查询,首先要清楚mysql中limit的用法. limit a,b a是从第a+1条数据开始,b是指读取几条数据 例如:select * fro ...
- 后端技术:mybatis中resultMap用法示例笔记
1.概念 resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合,主要作用是将实体类中的字段与数据库表中的字段进行关联映射.并且支持复杂的返回结果类型. ...
- MyBatis中foreach用法
foreach用法 SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方 ...
- MyBatis中exists用法
MyBatis框架中的exists用法 exists用法 使用示例 总结 exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内 ...
- MyBatis中select用法
使用MyBatis时,只需要在XML中添加一个select元素,写一个SQL,再做一些简单的配置就可以实现映射 使用XML方式 MyBatis支持用接口来调用方法,通过参数注解@param设置参数名字 ...
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获 ...
- insert在python中的用法_python中insert用法是什么_后端开发
python ipo模型是指什么_后端开发 IPO(Input Processing Output)模式,即输入数据→处理数据→输出结果.采用input输入内容为字符串格式,若输入为数值时,应采用in ...
- Mybatis中column用法
简单记录在开发中使用mybatis遇到的一个问题,也是纠正一下自己的观点: 在学习mybatis的时候,一直理解的是column字段对应的就是数据库中的字段,但是经过开发的一个小插曲得知,column ...
最新文章
- C# 篇基础知识3——面向对象编程
- Android Activity和Fragment的转场动画
- 多线程情况下创建连接池
- MVC layout 命名空间引用问题
- Proxy 补充学习笔记
- 玩转keybd_event
- 一个unity2d横版小游戏
- CentOS7 设置防火墙端口
- Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
- java math.floordiv,Math类的常用方法--田小江
- 第十篇:SpringBoot集成支付宝接口扫码支付
- php站长统计,PHP统计各大引擎蜘蛛爬行访问记录插件
- Git 分支篇之分支介绍
- php 正则保留数字和,只保留汉字,字母,数字正则
- 推荐一款管理系统专用 低 代码工具,一天开发一个系统不是梦
- Android ANR问题总结
- 什么是横向扩展、纵向扩展
- 对一阶二阶低通滤波器推导,并用IMU数据验证算法效果
- htc 10 t版最新ruu t-mobile htc 10最新版,可用联通volte 可修复基带丢失
- 【SpringBoot商城秒杀系统项目总结25】 项目的亮点和难点及问题解决(源码地址)