MyCAT自增字段和返回生成的主键ID的经验分享 说明: 1、mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0. 2、mysql只会对定义自增长主键,可以用last_insert_id()返回主键值。
正常情况下mybatis 使用last_insert_id()就可以了,但为了防止同时插入多条产生的不正确的情况,还是用独立的sequence表好 全局用一个还能隐藏,不会被人猜到。 注意: 字段一定要用无符号的:bigint,以免溢出。 mysql 数据大小 int 4294967295 ,bigint 18446744073709551615 附配置文件:
关于发号器的使用,其实有一个大背景,那就是关于主键的一些设计问题,在MySQL中如果一张表没有主键,实际的数据处理就有点麻烦了。
在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中 常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。这里面有个困 难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需 要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。
MySQL 是一个广泛使用的关系型数据库管理系统,提供了许多内置函数,用于获取关于数据库服务器的信息。这些函数称为 MySQL 信息函数。
在MyBatis这样的持久层框架中,经常需要插入一条记录并取得该记录所对应的主键值。在Java开发中,默认的JDBC方式已经较为成熟地解决了这个问题,可以通过getGeneratedKeys()方法获取自动生成的主键值,而在MyBatis中,也提供了多种方式来处理自动生成主键值的问题。
在说明如何基准测试之前,我想聊聊我为什么要做这个事儿,话说最近做某后台的时候需要一个 ID 生成器,我不太想用 snowflake 等复杂的解决方案,也不太想用 redis 来实现,因为我手头只有 mysql,所以我琢磨着就用 mysql 实现吧。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51428427
1.1 xml 配置主键返回 <insert id="save" parameterType="orders" > <se
本文介绍了如何使用 MyBatis-Plus 实现基于接口的增删改查操作,通过定义接口、实现增删改查逻辑和配置文件,完成对 User 表的增删改查操作。同时,也介绍了如何批量加载映射文件,以及接口的增删改查方法和参数详解。
一、Mybatis执行插入语句后可以返回主键ID吗? 在想写什么内容的时候,正好看到一个基础面试题上有这个问题,就把它记录下来了。 👨💻面试官:你说Mybatis执行插入语句后可以返回主键ID吗??如果能的话,能否实现一下。 🙋我:当然是可以的,连JDBC都能做到的事情,Mybatis也能做到的。 开始敲代码… 1.1、Mysql数据库设置ID自增情况 <insert id="insertUser" parameterType="com.crush.mybatisplus.entity.User">
下面这个是关键:order的值是after,表示先执行insert语句,然后再选择最后一个主键,返回到实体类中。
mapper.xml 文件中执行的 insert sql 我们执行一个insert操作,参数是一个User对象
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)
MySQL 里字段的属性很多,对性能来说,影响也是可大可小,所以针对其属性这一块有必要进行一次探究。
墨墨导读:MySQL序列概述为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号、交易流水号等。
解析:CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。 WHEN是if THEN是输出语句 ESLE代表当上面的全部都不行。就用ELSE
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。
我们知道很多时候我们有一个需求,我们需要把插入数据后的id返回来,以便我们下一次操作。
MySql事务协议主要是通过set autocommit、commit以及rollback这三个报文(命令)来实现的。
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。 其实可以通过 mybatis 的 selectKey 标签来解决这个问题。 selectKey 这个标签大家基本上都用过,比如在插入数据的时候,返回插入数据的纪录。如: <selectKey resultType="int" order="AFTER" keyProperty="id"> SELECT
存储引擎是mysql的特性之一,使用者可以根据自己的业务场景选择自己适合的存储引擎,是不是要支持事物,如何选择存储,如何选择索引数据,当然你也可以定制自己的存储引擎,如果你们公司有能力,mysql支持支持很多种存储引擎,如 Myisam ,Innodb,MEMORY,MERGE,BDB,EXAMPLE,CSV等等,mysql 5.5之前默认的存储引擎是Myisam,之后就是Innodb,今天我们只讲常见的存储引擎。
除了USER、VERSION、LAST_INSERT_ID以外等常用函数还有DATABASE
系统信息函数是用来查询MySQL数据库的系统信息。 系统信息函数包括查询数据库版本、数据库当前用户等信息。 MySQL系统信息函数如下表所示: version() 返回数据库的版本号 connection_id() 返回服务器的连接数 database() 返回当前数据库名 schema() 返回当前数据库名 user() 返回当前用户名称 system_user() 返回当前用户名称 session_user() 返回当前用户名称 current_user 返回当前用户名称 current_user()
一直在使用,从未系统的总结起来。所以这里给大家带来的是mybatis的总结,系统大家能够对这个框架有一定的系统的学习与认识。 mybatis和Hibernate应该是现在主流的ORM框架了。 mybatis学习的步骤: mybatis入门 --> 全局配置文件和映射文件详解 --> 高级映射(一对一,一对多,多对多) -->延迟加载机制 -->一级缓存, 二级缓存(整合ehcache) --> spring整合mybatis --> 逆向工程
image.png JDBC连接MYSQL数据库: package cn.outofmemory.test;import java.sql.Connection;import java.sql.DriverManager;public class Mysql { public static void main(String arg[]) { try { Connection con = null; //定义一个MYSQL链接对象
学习mybatis的时候,突然遇到测试出错。测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正。错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现确实。修改后正常。 原因是直接复制教学代码,在SqlMapConfig.xml中,配置mappers,加载映射文件,已经配置了加载包文件,然后我自己又添加了单独的mapper。所以出错了,将包注释掉就ok。 测试用例: 1 @Before 2 public void setUp() throws E
主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路。
之前,已经讲过一些Golang的基础的东西,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html,
为更好的帮助DBA运维数据库,腾讯云将于每月12日开展DBbrain诊断日,腾讯云高级产品经理迪B哥直播解析经典数据库运维难题,结合腾讯云数据库智能管家DBbrain的能力,为大家提供问题优化思路和方法,玩转数据库! 本期诊断日主要分享内容:如何解决热点更新导致的雪崩效应。 本期分享是一个真实的现网故障案例,而且在最近几个月内多个客户都出现了相似的故障,对于迪B哥来说更是印象深刻,在刚刚从事DBA工作的前几年,也处理过类似的问题,接下来的分享内容将会从真实案例的复盘为切入点,深入剖析故障原因,为大家提供
在数据库管理和数据分析领域,日期时间函数与系统函数是处理时间序列数据、获取系统信息和优化数据库操作的重要工具。达梦数据库作为国内领先的企业级数据库系统,提供了丰富的日期时间处理和系统信息获取函数。本文将详细介绍达梦数据库中几种关键的日期时间函数和系统函数,并通过实际的SQL示例来解析其用法,帮助你更好地利用这些功能提升工作效率。
最近在工作中遇到很多使用MySQL自带的autoincrement函数作为发号器,在实际使用中当并发比较小的时候还没有问题,一旦并发增加就会出现很多问题,特此进行如下总结。
选取价格最贵:select max(price) as article from shop;
resultType 属性: 用于指定结果集的类型。 **parameterType 属性:**用于指定传入参数的类型。
phone 的存在是为了方便插入数据,当插入数据成功时,就产生了自增 id,而对于插入,这里使用的是 replace,replace 会先查找是否存在 phone 指定值一样的数据;如果存在,则先 delete 再 insert,如果不存在,则直接 insert。
时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 5、转换时间戳的函数
一、注解开发 //插入 @Insert("insert into orders value(null,#{ordertime},#{total},#{uid})") void save(Orders orders); //删除 @Delete("delete from orders where id = #{vaalue}") void del(int id); //修改 @Update("update orders set ordertime = #{ordertime},total = #{tot
项目地址:https://github.com/lenve/vhr 好了,那我们本文主要来看看数据库的设计与存储过程的编写。 部门数据库整体来说还是比较简单,如下: 都是常规字段,脚本可以在项目中下载
Class.forName(“com.mysql.jdbc.Driver”).newInstance(); 我们链接的是MYSQL数据库,所以需要一个MYSQL的数据库驱动,如果你的环境中没有安装, 可以下载:mysql-connector-java-5.1.17-bin.jar JAR包,然后放进jdk1.6.0_37\jre\lib\ext 重启eclispe 就可以在JRE系统库中看到。
JDBC连接MYSQL数据库: import java.sql.Connection; import java.sql.DriverManager; public class Mysql { public static void main(String arg[]) { try { Connection con = null; //定义一个MYSQL链接对象 Class.forName("com.mysql.jdbc.Driver")
CREATE TABLE slow_log ( start_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), user_host mediumtext NOT NULL, query_time time(6) NOT NULL, lock_time time(6) NOT NULL, rows_sent int(11) NOT NULL, rows_examined int(11) NOT NULL, db varchar(512) NOT NULL, last_insert_id int(11) NOT NULL, insert_id int(11) NOT NULL, server_id int(10) unsigned NOT NULL, sql_text mediumblob NOT NULL, thread_id bigint(21) unsigned NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
使用useGeneratedKeys设置为true后 , MyBatis会使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键 . 获得主键值之后将其赋给keyProperty配置的 id 属性 . 当需要设置多个属性时 , 使用逗号隔开 , 这种情况下 还需要配置 keyColumn属性 , 按顺序指定数据库的列 , 这里列的值会和 keyProperty 配置的属性一一对应 . 由于要使用数据库返回的主键值 , 所以SQL上下两部分的列中去掉了 id 列和对于的 #{id} 属性
在一开始,会介绍一下原生JDBC的使用,此时不会涉及到spring的使用,但是我们还是利用yml文件来存放数据源配置信息,因此我们需要一个yaml读取的工具类
<selectKey resultType="String" order="BEFORE" keyProperty="enterp_no"> SELECT PRSP_CRM_ENTERP_ID.nextval FROM DUAL </selectKey>
last_insert_id() 在正确的情况下返回: 数字类型. 并且大于 0
领取专属 10元无门槛券
手把手带您无忧上云