‘壹’ mybatis mysql 主键自增加怎么配置
mybatis自增主键配置:
mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。
1、不返回自增主键值:
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。
Oracle Sequence 配置
<sqlid='TABLE_NAME'>TEST_USER</sql>
<sqlid='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
<!--注意这里直接调用sequence的nextval函数-->
<insertid="insert"parameterType="User">
insertinto<includerefid="TABLE_NAME"/>(ID,NAME,AGE)
values(<includerefid="TABLE_SEQUENCE"/>,#{name},#{age})
</insert>
当插入语句如上配置时,那么针对如下语句
Useruser=newUser();
user.setName("test");
user.setAge(24);
userMapper.insert(user);
System.out.println(user.id);//user.id为空
user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。
2、Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
<sqlid='TABLE_NAME'>TEST_USER</sql>
<!--注意这里的插入SQL中是没有指明ID字段的!-->
<insertid="insert"parameterType="User">
insertinto<includerefid="TABLE_NAME"/>(NAME,AGE)
values(#{name},#{age})
</insert>
同样,针对Mysql如此配置myts,插入完成后user.id为空。
插入后获取自增主键值:
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
1、Oracle Sequence 配置:
<sqlid='TABLE_NAME'>TEST_USER</sql>
<sqlid='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
<!--注意这里需要先查询自增主键值-->
<insertid="insert"parameterType="User">
<selectKeykeyProperty="id"resultType="int"order="BEFORE">
select<includerefid="TABLE_SEQUENCE"/>fromal
</selectKey>
insertinto<includerefid="TABLE_NAME"/>(ID,NAME,AGE)
values(#{id},#{name},#{age})
</insert>
当使用了<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:
selectSEQ_TEST_USER_ID.nextvalfromal;//语句1
insertinto(ID,NAME,AGE)values(?,?,?);//语句2
在执行插入语句2之前,会先执行语句1以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将语句1查询出的值保存在User对象中,然后才执行语句2这样就保证了执行完插入后
Useruser=newUser();
user.setName("test");
user.setAge(24);
userMapper.insert(user);
System.out.println(user.id);//user.id不为空
user.id是有值的。
2、Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
<sqlid='TABLE_NAME'>TEST_USER</sql>
<insertid="insert"useGeneratedKeys="true"keyProperty="id"parameterType="User">
insertinto<includerefid="TABLE_NAME"/>(NAME,AGE)
values(#{name},#{age})
</insert>
当然,由于Mysql的自增主键可以通过SQL语句
selectLAST_INSERT_ID();
来获取的。因此针对Mysql,Mybatis也可配置如下:
<sqlid='TABLE_NAME'>TEST_USER</sql>
<!--注意这里需要先查询自增主键值-->
<insertid="insert"parameterType="User">
<selectKeykeyProperty="id"resultType="int"order="BEFORE">
SELECTLAST_INSERT_ID()
</selectKey>
insertinto<includerefid="TABLE_NAME"/>(ID,NAME,AGE)
values(#{id},#{name},#{age})
</insert>
只不过该中配置需要额外的一条查询SQL
小结
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用不返回自增主键值的方式来配置插入语句,这样可以避免额外的SQL开销.
当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用插入后获取自增主键值的方式配置.
‘贰’ mysql设置主键的代码是什么
mysql设置主键的代码是PRIMARY KEY (主键字段)。
如:CREATE TABLE Customer (SID integer,Last_Name varchar(30),First_Name varchar(30),PRIMARY KEY (SID))。
主关键字(主键,primary key)是被挑选出来,作表的行的唯一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。
(2)用my编辑数据库怎样增加主键扩展阅读:
永远也不要更新主键。实际上,因为主键除了唯一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
主键应当由计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了唯一标识一行以外的意义。一旦越过这个界限,就可能产生人为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
‘叁’ MySql 设置ID主键自增,从0开始,请问怎么设
就我所知这个好像无法实现,就算你自己编译mysql恐怕也很难。因为last_insert_id()这个内置的函数返回最近一次插入的自增长ID,当没有符合条件的ID时,它返回0,所以如果自增长从0开始的话,这个返回值就很难判定到底是插入了一条自增长ID为0的记录还是没有符合条件的记录了。
‘肆’ mysql 中如何给已存在的表中字段增设置主键
首先你必须把name的条件改为not
null
alter
table
mytable_1
alter
column
name
char(1)
not
null
然后可以把原主键删除,再重新增加主键。
alter
table
mytable_1
drop
constraint
PK_mytable_1(主键名字)
alter
table
mytable_1
add
constraint
PK_mytable_1
primary
key(id,name)
‘伍’ 如何用sql 添加主键
操作步骤如下:
1、首先我们在这个StudentNo列上用你的鼠标右击,然后选择里面的修改,进行点击,弹出
界面。
‘陆’ mybatis怎么设置主键自增
设置主键自增,应该是设置具体的数据库,与mybatis没有什么关系吧。
以mysql为例,假设主键为id
1.可以在创建表的时候设置主键
create table tb (
id bigint(20) primary key auto_increment
);
2.也可以在修改表结构的时候设置主键
alter table tb
modify id bigint(20) primary key auto_increment;
更多请参考http://blog.lifw.org/post/35110918
另外在自增的主键在mybatis中可以这么获取
<insert id="..." useGeneratedKeys="true" keyProperty="id">
...
</insert>
‘柒’ mysql 中如何给已存在的表中字段增设置主键
1、打开navicat工具,连接上mysql服务器,选择完数据库之后,选择一个表右击选择设计表(这里为了演示测试,随便选择一个表即可)。