一、问题背景
应用程序需要使用唯一的序列号,而多线程使得采用时间戳的方式生成该序列号的方式不可取(虽然冲突的可能性非常小),但mysql并没有oracle的sequence功能,通过mysql函数,简要实现下sequence功能。
注:本例详细介绍的是通过Navicat工具创建mysql函数,实现该自增序列功能,适合入门新手
1.新建数据库,创建保存序列号的表
2.找到刚才新建的数据库,点击新建函数
2.1创建获取当前序列值的函数
设置传递参数
设置返回值类型
DECLARE value INTEGER;
SET value = 0;
SELECT trade_num INTO value
FROM trade_number
WHERE tag = tag;
RETURN value;
将上述获取当前序列号的代码片段copy到下图位置
接下来,点击保存,输入函数名,不妨取名currentvalue
2.2创建获取下一序列值的函数
设置传递参数
设置返回值类型及大小
UPDATE trade_number
SET trade_num = trade_num + increment
WHERE tag = tag;
RETURN currentvalue(tag);
编写函数体
保存该函数,取名netvalue
2.3创建设置默认序列值的函数
参数的传递
返回值类型
函数体
UPDATE trade_number
SET trade_num = value
WHERE tag = tag;
RETURN currentvalue(tag);
保存该函数,取名setvalue
接下来,在数据库中插入一条默认值,比如,NO ,1000000,1
测试:
后台代码的编写:
1、若用JDBC的方式访问数据库
Connection conn = JDBCUtils.getConnection(url, userName, password);
String sql = "SELECT CURRVAL('TestSeq');";
PreparedStatement ptmt = null;
ResultSet rs = null;
try {
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
int count = 0;
while (rs.next()) {
count = rs.getInt(1);
}
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, ptmt, conn);
}
2、若用hibernate的方式访问数据库
try{
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
String sql = "SELECT NETVALUE('YRZYBS');";
List list=session.createSQLQuery(sql).list();
session.getTransaction().commit();
将获取的list进行处理....
}catch (Exception e){
e.printStackTrace();
}
至此,用Navicat的方式生成函数,模拟自增序列的任务完成了,也可以在命令行下进行函数的创建,此处不做叙述