在《DM7与mybatis(一)——基本CRUD》中,我们介绍了dm7与mybatis的环境集成和基本配置,实现基本的CRUD操作。
在应用开发过程中,ID生成是一种常见的需求,通常基于数据库的自增列(如sqlserver、mysql)、序列(如Oracle)来自动生成。DM7同时支持自增列、序列,本文将介绍如何利用DM7和mybatis实现ID自动生成。
环境准备参见《DM7与mybatis(一)——基本CRUD》。
一、读取序列值生成ID
1、创建示例表和序列
以test用户登录,执行以下脚本:
-- 以test用户登录执行脚本
-- user_id序列
CREATE SEQUENCE seq_user_id
INCREMENT BY 1 START WITH 1
MAXVALUE 2147483647;
-- 用户信息表
CREATE TABLE t_user_seq
(
id INT NOT NULL, --用户标识
name VARCHAR(20) NOT NULL, --姓名
phone VARCHAR(50), -- 手机
email VARCHAR(50), -- 邮箱
PRIMARY KEY(id)
);
2、pojo对象
由于表t_user_seq和(一)当中表t_user的字段相同,我们可以复用原来的User对象以及对应的alias定义。
package org.dmstudy.mybatis.domain;
public class User {
private Integer id;
private String name;
private String phone;
private String email;
//getter/setter省略
}
3、XML映射文件
在resources\mybatis-config.xml中,新增一个mapper配置,加载IdMapper.xml。
……
……
新增org/dmstudy/mybatis/id/dao/IdMapper.xml文件,其内容如下:
/p>
PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"
select seq_user_id.nextval from dual
insert into t_user_seq
(id,name,phone,email)
values
(#{id},#{name},#{phone},#{email})
注意namespace值对应为"org.dmstudy.mybatis.id.dao.IdMapper"。
其中id=getNextUserId的SELECT节点配置的sql语句是从序列seq_user_id中获取下一个序列值,该值根据定义从1开始,每次增量为1。
id=insert的INSERT节点配置了向表t_user_seq插入记录的语句。
4、Mapper接口
创建org.dmstudy.mybatis.id.dao.IdMapper.java文件,内容如下:
package org.dmstudy.mybatis.id.dao;
import org.dmstudy.mybatis.domain.User;
public interface IdMapper {
int getNextUserId();
int insert(User user);
}
注意接口的全名org.dmstudy.mybatis.id.dao.IdMapper、接口方法getNextUserId、insert与IdMapper.xml中的namespace、语句映射节点id保持一致。
5、调用代码
package org.dmstudy.mybatis.id;
……
public class IdApp {
……
public void insert() {
System.out.println("---insert ---");
// 新建user对象,注意未设置id值
User user = new User();
user.setName("dmtech");
user.setPhone("400-6489899");
user.setEmail("dmtech@dameng.com");
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 获取mapper对象
IdMapper mapper = sqlSession.getMapper(IdMapper.class);
// 获取id值
Integer id = mapper.getNextUserId();
System.out.println("成功获取seq_user_id的nextval: " + id);
// 设置id值
user.setId(id);
// 将user插入数据库
int cnt = mapper.insert(user);
sqlSession.commit();
System.out.println("成功插入 " + cnt + "条记录! ");
} catch (Exception e) {
System.out.println("insert执行失败 ,原因:" + e.getMessage());
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
}
}
}
查看执行过程输出log4j日志信息
---insert ---
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 288994035.
DEBUG [main] - Setting autocommit to false on JDBC Connection [dm.jdbc.driver.DmdbConnection@1139b2f3]
DEBUG [main] - ==> Preparing: select seq_user_id.nextval fr