MyBatis中的主键⽣成策略
在数据库(MySQL,Oracle…)中,我们都会为每张表设置主键。主键也是⼀个字段,只不过为其赋予⾮空唯⼀的特性。主键的作⽤是保证⼀张表中的数据唯⼀性。
这次我们使⽤⽤户表介绍在使⽤MyBatis向数据库表新增数据(⼀条或者多条)时,主键该怎么设置?
在Java项⽬中,主键对应的Java类型⼀般是Integer,Long或者String。
建表及插值SQL语句
CREATE TABLE`sys_user`(
instructions短语`id`bigint(32)NOT NULL AUTO_INCREMENT COMMENT'⽤户ID',
`user_name`varchar(255)DEFAULT NULL COMMENT'⽤户名',
`user_password`varchar(255)DEFAULT NULL COMMENT'密码',
`user_email`varchar(255)COMMENT'邮箱',
`user_info`text COMMENT'简介',
`head_img`blob COMMENT'头像',
`create_time`datetime DEFAULT NULL COMMENT'创建时间',
PRIMARY KEY(`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='⽤户表';
-- 这⾥我们先⼿动插⼊6条数据,default表⽰为创建该表时每个字段的默认值,now()获取当前时间
INSERT INTO`sys_user`VALUES(DEFAULT,'admin','admin',default,'管理员',"",NOW());
INSERT INTO`sys_user`VALUES(DEFAULT,'xq','xq',default,'开发者',"",NOW());
INSERT INTO`sys_user`VALUES(DEFAULT,'zs','zs',default,'开发者',"",NOW());
hwndINSERT INTO`sys_user`VALUES(DEFAULT,'ls','ls',default,'运维⼈员',"",NOW());
INSERT INTO`sys_user`VALUES(DEFAULT,'ww','ww',default,'运维⼈员',"",NOW());
INSERT INTO`sys_user`VALUES(DEFAULT,'zl','zl',default,'运维⼈员',"",NOW());
⽤户实体类
创建⽤户表对应的实体类,我们可以使⽤MyBatis逆向⼯程⽣成或者MyBatis-Plus⾃动代码⽣成。
/**
* ⽤户实体类
*/
@Data
public class SysUser{
/**
* ID
*/
private Long id;
/
**
* ⽤户名
*/
private String userName;
/**
* 密码
*/
private String userPassword;
/**
* 邮箱
*/
private String userEmail;
/**
* 简介
*/
private String userInfo;
/**
* 头像
*/
private byte[] headImg;
/**
简单搭建spring框架* 创建时间
*/
private Date createTime;
}
这⾥单独使⽤MyBatis,没有结合其他框架来使⽤。简单介绍我们在开发中如何使⽤MyBatis。
1. 根据需求创建表
2. 根据表创建实体类
3. 创建Mapper接⼝(编写各种增删改查接⼝⽅法)
4. 创建l(编写各种增删改查SQL语句)
5. 结合Junit单元测试框架测试
由于是介绍MyBatis中的主键⽣成策略,所以只需要编写新增接⼝⽅法,以及编写新增SQL语句。SysUserMapper接⼝
public interface SysUserMapper {
/**
* 新增⽤户
* @param user
*/
int insertSysUser(SysUser user);
}
mapper标签的namespace属性值需要写上⾯接⼝的全限定路径,这样MyBatis才能将Mapper接⼝绑定l。哈哈,这⾥先给出l模板代码,具体的SQL语句在下⾯再给出。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="batis.mapper.SysUserMapper">
</mapper
接下来就是重点了,MyBatis中的主键⽣成策略有⼏种⽅式,我们将⼀ ⼀介绍。
1.使⽤JDBC⽅式返回主键⾃增的值
这种⽅式只适⽤⽀持主键⾃增的数据库,⽐如:MySQL,SQL Server。如果数据库不⽀持主键⾃增,那么这种⽅式就不适⽤了,⽐如:Oracle
insert标签是让我们编写新增SQL语句。类似的还有select标签、update标签和delete标签。
下图是insert标签中的属性,红⾊框中是⽐较常⽤的属性。
<insert id="insertSysUser" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)
values (
#{userName},
#{userPassword},
default,
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
);
</insert>
cultist在上⾯代码中,新增数据的时候没有为主键id设置值,⽽是设置了⼀些属性,就是这些属性能帮我们⾃动获取主键的值(主键⾃增长)。
下⾯讲解这些属性的作⽤:
1. insert标签的id属性就是Mapper接⼝⽅法,上⾯通过namespace绑定接⼝,这⾥通过id绑定接⼝⽅法。
2. 上⾯我们将useGeneratedKeys属性设置为true, MyBatis会使⽤JDBC getGeneratedKeys⽅法来取出由数据库内部⽣成的主键。
3. 获得主键值后将其赋值给keyProperty属性配置的id属性(实体类中的属性)。当需要设置多个属性时,使⽤逗号隔开,这种情况下通常还
需要设置 keyColumn 属性按顺序指定数据库的列,这⾥列的值会和 keyProperty 配置的属性⼀⼀对应。
2.使⽤selectKey返回主键的值
有些数据库(⽐如:Oracle)不提供主键⾃增的功能,⽽是使⽤序列得到⼀个值,然后将这个值赋给主键
id ,再将数据插⼊数据库。对于这种情况 ,我们使⽤<selectKey>标签来获取主键的值,这种⽅式不仅适⽤于不提供主键⾃增功能的数据库,也适⽤于提供主键⾃增功能的数据库。
这⾥分别演⽰MySQL和Oracle两个数据库在这种⽅式下的主键⽣成⽅式。
MySQL
上⾯接⼝⽅法不变,只是改变insert标签代码。我们可以看到useGeneratedKeys属性和keyProperty属性不⽤设置了。改为添加selectKey 标签。
1. selectKey标签的keyColumn、keyProperty和上⾯useGeneratedKeys的⽤法含义相同。
2. resultType属性⽤于设置返回值类型。
3. order属性的设置和使⽤的数据库有关。MySQL数据库中,order属性设置的值是AFTER,因为当前记录的主键值在insert语句执⾏
成功后才能获取。
<insert id="insertSysUser">
insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)
values (
#{userName},
#{userPassword},
default,mysql语句的执行顺序
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
);countif函数怎么输入
<selectKey keyColumn="id"resultType="long"keyProperty="id"order="AFTER">
SELECT LAST_INSERT_ID ()
</selectKey>
</insert>
Oracle
我们可以看到,在Oracle数据库中,order属性设置为BEFORE,这是因为Oracle中需要先从序列获取值,然后将值作为主键插⼊到数据库中。
Oracle⽅式的insert语句中明确写出了id列和值#{id},因为执⾏selectKey中的语句后id就有值了,我们需要把这个序列值作为主键值插⼊到数据库中,所以必须指定id列,如果不指定这⼀列,数据库就会因为主键不能为空⽽抛出异常。
selectKey元素放置的位置不会影响selectKey中的⽅法在insert前⾯或者后⾯执⾏的顺序,影响执⾏顺序的是order属性。
<insert id="insertSysUser">
<selectKey keyColumn="id"resultType="long"keyProperty="id"order="BEFORE">
SELECT val from dual
</selectKey>
insert into sys_user(id,user_name,user_password,user_email,user_info,head_img,create_time)
values (
#{id},
#{userName},
#{userPassword},
default,
#{userInfo},
#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
);
</insert>
假如主键是varchar类型,那么对应Java就是String类型,这个时候就不需要使⽤MyBatis的主键⽣成策略。我们在新增数据时,直接为主键赋值即可,⼀般是使⽤java.util.UUID⽣成32位位不规则不重复的字符串来充当主键。
这样我们就介绍了我们在使⽤MyBatis时,对主键的处理⽅式。⼤家觉得 的话,不妨来个 。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论