本文目錄一覽:
- 1、mybatis +mysql 事務內返回自增主鍵問題
- 2、在mysql中插入一條記錄並返回該記錄的主鍵(主鍵是數據里自增的),我這個代碼怎麼能夠與實現呢??
- 3、如何獲得mysql資料庫自增長主鍵的值?
- 4、如何獲得mysql資料庫 自增長主鍵的值?
- 5、mysql資料庫自己維護主鍵自增和hibernate維護主鍵自增
- 6、mysql如何設置自增主鍵
mybatis +mysql 事務內返回自增主鍵問題
insert id=”dao裡面的方法” parameterType=”javabean” useGeneratedKeys=”true” keyProperty=”id”
這裡寫你的sql語句
/insert
這裡用useGeneratedKeys可以在插入成功後返回主鍵
在mysql中插入一條記錄並返回該記錄的主鍵(主鍵是數據里自增的),我這個代碼怎麼能夠與實現呢??
你第一次執行insert後,再立刻執行一條「select last_insert_id() as aa”,這個aa就是你insert的id值。
這個語句是針對當前線程的,如果別人也insert了內容,互相不會干擾。
可以安全的使用。
如何獲得mysql資料庫自增長主鍵的值?
this.employee_id = employee_id;}} 其它幾個屬性的getter和setter省略,這裡我們要用到ejb3-persistence.jar,JPA的註解類就在這個包中,下面詳細說明上面使用到的註解。@Entity:通過@Entity註解將一個類聲明為一個實體bean@Table:通過 @Table註解可以為實體bean映射指定表,name屬性表示實體所對應表的名稱,如果沒有定義 @Table,那麼系統自動使用默認值:實體的類名(不帶包名)@Id:用於標記屬性的主鍵@Column:表示持久化屬性所映射表中的欄位,如果屬性名與表中的欄位名相同,則可以省略@Column註解,另外有兩種方式標記,一是放在屬性前,另一種是放在getter方法前,例如:@Column(name = EMPLOYEE_NAME)private String employee_name; 或者@Column(name = EMPLOYEE_NAME)public String getEmployee_name() {return employee_name;} 這兩種方式都是正解的,根據個人喜好來選擇。大象偏向於第二種,並且喜歡將屬性名與欄位名設成一樣的,這樣可以省掉@Column註解,使代碼更簡潔。@TableGenerator:表生成器,將當前主鍵的值單獨保存到一個資料庫表中,主鍵的值每次都是從指定的表中查詢來獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用於任何資料庫,不必擔心不同資料庫不兼容造成的問題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換資料庫不會造成很大的問題。各屬性含義如下:name:表示該表主鍵生成策略的名稱,這個名字可以自定義,它被引用在@GeneratedValue中設置的generator值中table:表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為GENERATOR_TABLEpkColumnName:表生成器中的列名,用來存放其它表的主鍵鍵名,這個列名是與表中的欄位對應的pkColumnValue:實體表所對應到生成器表中的主鍵名,這個鍵名是可以自定義滴valueColumnName:表生成器中的列名,實體表主鍵的下一個值,假設EMPLOYEE表中的EMPLOYEE_ID最大為2,那麼此時,生成器表中與實體表主鍵對應的鍵名值則為3allocationSize:表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄後自動加1,默認為50@GeneratedValue:定義主鍵生成策略,這裡因為使用的是TableGenerator,所以,主鍵的生成策略為GenerationType.TABLE,生成主鍵策略的名稱則為前面定義的」tab-store」。這裡大象想說下,網上有很多文章寫的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,採用SEQUENCE序列是因為Oracle數據中不支持identity自動增長,要想使用它,還得在資料庫中創建一個序列,如果要更換資料庫,那將是一個非常麻煩的事情。SEQUENCE生成方式我們暫且不談,這裡說下採用AUTO和IDENTITY的生成方式,本例採用的是SQL Server 2000作為資料庫,所以如果想使用AUTO或是IDENTITY生成策略,則一定要對主鍵加上identity標識,如identity(1,1)。不過對於AUTO來說,是根據不同的資料庫選擇最合適的自增主鍵生成策略。如果使用MySQL,則主鍵要定義AUTO_INCREMENT,如果是Oracle,則要創建Sequence來實現自增。不管採用何種生成策略,增、刪、改這些方法中一定要加入事務,否則數據是不會添加到資料庫中滴~~~這是大象反覆測試過的結果!
如何獲得mysql資料庫 自增長主鍵的值?
如果是自增長的話,直接用max函數即可。
如表為:
id
name
1
張三
2
李四
3
王五
其中id為自增長欄位,如果要查詢目前主鍵的值,可用如下語句:
select max(id) as id from 表名;結果顯示為:
id
3
就說明目前id的值為3。
mysql資料庫自己維護主鍵自增和hibernate維護主鍵自增
您好,increment:代理主鍵,適合於所有資料庫,由hibernate維護主鍵自增,和底層資料庫無關,但是不適合於2個或以上hibernate進程。
identity:代理主鍵,適合於mysql或ms
sql
server等支持自增的dbms,主鍵值不由hibernate維護。
sequence:代理主鍵,適合於oracle等支持序列的dbms,主鍵值不由hibernate維護,由序列產生。
native:代理主鍵,根據底層資料庫的具體特性選擇適合的主鍵生成策略,如果是mysql或sqlserver,選擇identity,如果是oracle,選擇sequence。
hilo:代理主鍵,hibernate把特定表的欄位作為hign值,生成主鍵值
uuid.hex:代理主鍵,hibernate採用uuid
128位演算法生成基於字元串的主鍵值
assign:適合於應用程序維護的自然主鍵。
想要實現安全的自增只能使用hibernate維護得自增屬性identity,或者使用開發者自己維護id值assign。如果使用identify,經過測試發現使用無論開發者是否給對象的id賦值,hibernate在保存對象時會自動給id賦值(為mysql表中id最大值+1);如果使用assign,用戶在保存對象前必須給對象的id賦值,值必須大於等於0,如果等於0時,那麼數據表id記錄會使用mysql資料庫維護的最大id+1,如果大於0時,則表id則為用戶設置的對象的id值。
經過實驗得出,想要實現mysql的sql語句句式以及最終效果,需要設置hibernate配置文件的id自增屬性為assign,如果知道id的話則設置對象的id為已知的id,否則設置id的值為0,。
如果id自增屬性為assign,那麼hibernate保存對象後,對象的id仍然為保存前設置的值;
如果id自增屬性為identity,那麼hibernate保存對象後,對象的id為資料庫中該條記錄的id的值。
mysql如何設置自增主鍵
1.主鍵語法
①創建時:create table sc (
studentno int,
courseid int,
score int,
primary key (studentno) );
②修改時:ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名);
前提是原先沒有設置主鍵。
2.外鍵語法
①創建時:create table sc (
studentno int,
courseid int,
score int,
foreign key (courseid) );
②修改時:
ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[約束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ;
3.使用組合主鍵
如果一列不能唯一區分一個表裡的記錄時,可以考慮多個列組合起來達到區分表記錄的唯一性,形式
①創建時:create table sc (
studentno int,
courseid int,
score int,
primary key (studentno,courseid) );
②修改時:alter table tb_name add primary key (欄位1,欄位2,欄位3);
前提是原來表中沒有設置主鍵,若原先已有主鍵則會報錯。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245549.html