Mybatis中返回主键值方式
作者:!!!525
mybatis返回主键值方式
1.自增长类型主键
Mapper接口中的抽象方法
int insertEmployee(Employee employee);
SQL语句
<!-- int insertEmployee(Employee employee); --> <!-- useGeneratedKeys属性字面意思就是“使用生成的主键” --> <!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 --> <insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId"> insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary}) </insert>
junit测试
@Test public void testSaveEmp() { EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); Employee employee = new Employee(); employee.setEmpName("john"); employee.setEmpSalary(666.66); employeeMapper.insertEmployee(employee); log.info("employee.getEmpId() = " + employee.getEmpId()); }
注意:
Mybatis是将自增主键的值设置到实体类对象中,而不是以Mapper接口方法返回值的形式返回。
2.非自增长类型主键
而对于不支持自增型主键的数据库(例如 Oracle)或者字符串类型主键,则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用!
使用 selectKey 帮助插入UUID作为字符串类型主键示例:
<insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE"> SELECT UUID() as id </selectKey> INSERT INTO user (id, username, password) VALUES ( #{id}, #{username}, #{password} ) </insert>
在上例中,我们定义了一个 insertUser 的插入语句来将 User 对象插入到 user 表中。我们使用 selectKey 来查询 UUID 并设置到 id 字段中。
通过 keyProperty 属性来指定查询到的 UUID 赋值给对象中的 id 属性,而 resultType 属性指定了 UUID 的类型为 java.lang.String。
需要注意的是,我们将 selectKey 放在了插入语句的前面,这是因为 MySQL 在 insert 语句中只支持一个 select 子句,而 selectKey 中查询 UUID 的语句就是一个 select 子句,因此我们需要将其放在前面。
最后,在将 User 对象插入到 user 表中时,我们直接使用对象中的 id 属性来插入主键值。
使用这种方式,我们可以方便地插入 UUID 作为字符串类型主键。当然,还有其他插入方式可以使用,如使用Java代码生成UUID并在类中显式设置值等。需要根据具体应用场景和需求选择合适的插入方式。
mybatis返回主键一直为1
1.返回的插入成功的行数,这没有错
而自增id则是直接映射到对象里,直接输出 xxx.getId()即可
举例:
在xml中:
<insert id="addUser" parameterType="blog.model.User" useGeneratedKeys="true" keyProperty="id"> ......
返回影响行数
2.java中代码
int primary = userService.addUser(user); int id = user.getId();
上面的id就是返回的主键
3.批量插入
void insertBatch(List<DafSequence> list);
然后是mapper对应的代码:
<insert id="insertBatch" parameterType="List" useGeneratedKeys="true" keyProperty="id"> INSERT INTO daf_sequence (id,table_name, cloumn_name) VALUES <foreach collection ="list" item="sequence" index="index" separator =","> (#{sequence.id},#{sequence.tableName}, #{sequence.cloumnName}) </foreach > </insert>
ps:id在list中对象里
需要注意点的点如下:
- 1.dao中不要出现@param注解,集合变量名请使用list
- 2.collection对应的值请使用list
- 3.数据库版本要求3.3以上版本
说明:除了特别注意的这两点之外,其他的属于基本操作
这样配置之后,每次批量操作之后的主键id就会自动保存到对应的对象里面了
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。