当前位置: 首页 > news >正文

java按键数据库添加_详解Java MyBatis 插入数据库返回主键

最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记。

类似下面这段代码一样获取插入后的主键

User user = new User();

user.setUserName("chenzhou");

user.setPassword("xxxx");

user.setComment("测试插入数据返回主键功能");

System.out.println("插入前主键为:"+user.getUserId());

userDao.insertAndGetId(user);//插入操作

System.out.println("插入后主键为:"+user.getUserId());

经过查询网上资料,发现大致有两种方式。

方式一:

在实体类的映射文件 "*Mapper.xml" 这样写:

insert into user(userName,password,comment)

values(#{userName},#{password},#{comment})

Tips:

useGeneratedKeys="true" 表示给主键设置自增长

keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。

parameterType="com.chenzhou.mybatis.User" 这个属性指向传递的参数实体类

这里提醒下, 中没有resultType属性,不要乱加。

实体类中uerId 要有getter() and setter(); 方法

由于我在MySQL数据库中建表时候已经设置了字段自增长,故最终我选择了第二种方式。

第二种方式:

同样在实体类的映射文件 "*Mapper.xml" 但是要这样写:

SELECT LAST_INSERT_ID()

INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});

Tips:

中没有resultType属性,但是 标签是有的。

order="AFTER" 表示先执行插入语句,之后再执行查询语句。

可被设置为 BEFORE 或 AFTER。

如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用

keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。

SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.

实体类中uerId 要有getter() and setter(); 方法

实现需求,上面那些就足够了。

这里如果有兴趣的,请继续听我讲一个Mybatis中可能误入的坑。

为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功并且也能读取插入的数据,但是当你打开数据库后就是看不到插入的数据?

如果在实现上述需求时,想插入后返回主键的话,切记不要这样写。

@Override

public Long insertProduct(ProductBean productBean) {

// TODO Auto-generated method stub

SqlSession session = MybatisJDBCUtil.currentSession();

ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class

// 必须对应DAO的接口层

return productIDao.insertProduct(productBean);

}

Why?

因为如果你是像上面这样写,那么执行后返回的也不是你想要的主键Id,而是执行数据库语句后受影响的行数。

而且,当你执行后你会发现提示插入成功,你用代码也可以读取出插入的数据,但是永远只有一条记录。

并且,你打开数据库会发现,数据库中没有插入成功任何数据。

我在这里郁闷了N久,终于发现了关键所在。

有返回值和没返回值的区别在于:

有返回值的只是对数据库只读模式访问数据库,对数据库数据不会有任何修改,比如各种方式的查询。

无返回值的则会以读写模式访问数据库,会对数据库中的数据进行修改,比如删除,增加。

除此之外,根据个人理解应该mybatis在执行插入语句时会先缓存到构造的一个类似session集合中,然后才去调用底层驱动去操作修改数据库。

session.commit();

MybatisJDBCUtil.closeSession();

没有返回值得才有上面这两条语句,也就是说执行了这两条语句才会真正执行插入到数据库,对数据库的数据进行修改。

相反,有返回值的就没有执行这两条语句,所以只是在自己构造的session中执行了添加语句,但是并没有提交到数据库中,故数据库中是没有任何记录的。

这也就解释了为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功,但是当你打开数据库看不到插入的数据。

Mybatis中插入语句方法种不要有返回值,像这样写是正确的。

@Override

public void insertProduct(ProductBean productBean) {

// TODO Auto-generated method stub

SqlSession session = MybatisJDBCUtil.currentSession();

ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class

// 必须对应DAO的接口层

productIDao.insertProduct(productBean);

session.commit();

MybatisJDBCUtil.closeSession();

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章:

  • java ee jdbc_JavaEE JDBC 补充注意点
  • java 返回前台excel_Java后台读取excel表格返回至Web前端
  • eclipse for java web_【Javaweb】Eclipse for JavaEE新建的Web工程自动生成web.xml
  • gopython 获取python 全局线程锁失败_python线程互斥锁递归锁死锁
  • java collections 复制_Java公开课|Java Collections类查复制操作是你学习Java的超车途径,还不来看看就晚了...
  • java 线程的移动问题_Spring Boot中的多线程问题和ThreadLocal
  • Java 经常用到access_用Java连接到Microsoft Access 2007数据库的正确方法是什么?
  • java1.8 interface_JDK1.8新特性——FunctionInterface
  • php file_get_contents 中文,php file_get_contents函数怎么用
  • php 平均下载速度,php限制下载速度的实现方法
  • docker lamp php7,环境准备:docker-compose安装 LAMP、LNMP、php扩展
  • java system.in 怎么写,java 里System.in 输入流如何使用
  • php 两数最大相同子串,用javascript求两个字符串最大的相同的子串(代码实例)...
  • JAVA ulimit,Linux:使用ulimit设置文件最大打开数
  • matlab表示数据散度的统计量,matlab kl-divergence(KL散度)实现代码 | 学步园
  • C++类的相互关联
  • Codepen 每日精选(2018-3-25)
  • iOS编译提示和导航提示
  • javascript 总结(常用工具类的封装)
  • laravel with 查询列表限制条数
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python socket服务器端、客户端传送信息
  • sublime配置文件
  • 程序员该如何有效的找工作?
  • 开发基于以太坊智能合约的DApp
  • 七牛云假注销小指南
  • 驱动程序原理
  • 如何利用MongoDB打造TOP榜小程序
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 白色的风信子
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (52)只出现一次的数字III
  • (C#)一个最简单的链表类
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java数据结构)ArrayList
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)LINQ之路
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .bat批处理(一):@echo off
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Redis的秒杀Dome和异步执行
  • .NET 反射 Reflect
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中的轻量级线程安全
  • .NET企业级应用架构设计系列之结尾篇
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @SuppressWarnings注解
  • @test注解_Spring 自定义注解你了解过吗?