平常新增一条数据的时候会用到流水号,单据号,编码号什么的,它们都是唯一的,不可以重复的,还有一些是必须有规律的,这样就比较容易区分。
那么如何设置一个不重复的单据号呢?
一、在jsp页面编写一个不重复的单据号
一般是用产品名称的首字母或者英文字母来拼接日期时间,一般精确到秒,这样就存在不会重复的,这是一个比较简单的方法,它不用查询数据库中的数据,直接在页面那边设置好利用就行了,因此也是没有什么规律的,只是根据时间变化的不同而不同罢了。
1、创建一个值为当前时间的变量
var date = new Date();//当前时间
alert(date);
2、根据本地时间格式,把Date对象转换为字符串,通过字符串方法match()找到一个或多个正则表达式的匹配。
利用正则表达式匹配字符串,‘//’代表的是正则中的包含字符,‘\’代表转义字符(将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符),‘\d’表示匹配一个数字字符,等价于[0,9],‘g’表示该表达式可以进行全局匹配,如果不加g,则只返回第一个匹配,‘+’代表匹配1个或多个的表达式,.join("")把匹配号的字符之间的分隔符去掉,用空字符代替。
//根据本地时间格式,把 Date 对象转换为字符串
document.getElementById("num").value="Y"+date.toLocaleString().match(/\d+/g).join("");
var num=$("#num").val();
alert("编号:"+num);
执行结果:
二、通过查询数据库中的编号来编写一个不重复有规律的编号
1、在Dao实现类中的方法
在Dao实现类的方法中实现方法,先获取我们封装好的连接,然后就可以对数据库中的数据进行操作,执行SQL语句,查询出表中的编号,获取表中的总条数i,如果存在数据就获取最后一条数据的编码,然后截取编码的最后三位数intLastCode(位数不定,这个是根据日期后面的位数来设置的),是根据开始索引和结束索引来截取目标字符的,它遵循的是左闭右开区间,由于我们获取的是一个整数,所以整数前面的0不会包含在内。
比如我获取的最后一条数据是‘ZGLY20190709001’,最后三位数‘001’的‘00’是不会显示的,只会显示后面的‘1’,然后再对它进行自增1;
因为我们获取的是整数,所以我们要把它格式化为n位的字符串,不足的位就用0来代替。
例:比如我们自增后的整数为99,日期后面的位数设置为4,那么最后的结果就为‘0099’
代码定义:
strCode=String.format("%0"+4+“d”, 99);// strCode=‘0099’
然后我们就可以对最后的结果拼接了,在此之前,我们要获取当前日期date,实例化Date对象,利用SimpleDateFormat类对date格式进行转换,转换为String格式“yyyyMMdd”,最后再将转换后的字符串str拼接我们获取到的最后三位数intLastCode,当然在日期前面也可以拼接一些标识性的字符串,假如我获取的是药品编号,可以这样拼接:
strCode = “Y” +str+intLastCode;
然后返回编号 return strCode;
但是如果查询不到数据的话就为第一条 strCode=“Y”+str+“0001”;
还有一个很重要的细节就是在返回字符串之前要记得关闭资源。
下面是详细代码:
public String selectZGLYDJ() {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
Date date=new Date();//获取当前时间
SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
String str=format.format(date);
String strCode = "";
String selectDJH="SELECT Billsnumber FROM pw_employeeneckdrug ORDER BY Billsnumber";
List<String> list=new ArrayList<String>();
try {
con=DbUtil.getConnection();
ps=con.prepareStatement(selectDJH);
rs=ps.executeQuery();
while(rs.next()){
list.add(rs.getString("Billsnumber"));
}
int i=list.size();
if(i>0){//如果存在数据
String code=list.get(i-1);//获取最后一条的索引值的编码ZGLY20190709001
System.out.println(code);
int intLastCode = Integer.parseInt(code.substring(code.length()-3, code.length()));//截取编码的最后三位数 根据位置截取[10,13) 由于获取的是整数,0不会包含在内
intLastCode++;//自增
//日期后面的位数
int num=3;
strCode=String.format("%0"+num+"d", intLastCode);//把intLastCode格式化成num位的字符串,不足的位用0来代替,比如:String.format("%04d", 3);则结果为"0003"
//编号
strCode = "ZGLY" +str+strCode; //返回ZGLY20190712002
}else{//不存在就为第一条
strCode="ZGLY"+str+"0001";
System.out.println(strCode);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtil.close(con, ps, rs);
}
return strCode;
}
二、在Servlet那边接收Dao实现类方法中返回的字符串
1、要想调用Dao实现类中的方法,就必须在Service实现类中
实例化Dao实现类
private BusinessDao businessDao=new BusinessDaoImpl();
然后返回Dao实现类中的方法
@Override
public String selectZGLYDJ() {
return businessDao.selectZGLYDJ();
}
2、要调用Service实现类中返回的方法,就要在Servlet中实例化Service实现类
private BusinessService businessService=new BusinessServiceImpl();
方法:接收结果,并赋值到JSONObject中
public void selectZGLYDJ(HttpServletRequest request,HttpServletResponse response) throws IOException{
String Billsnumber=businessService.selectZGLYDJ();
JSONObject jsonObject=new JSONObject();
jsonObject.put("Billsnumber", Billsnumber);
PrintWriter printWriter=response.getWriter();
printWriter.write(jsonObject.toString());
printWriter.flush();
printWriter.close();
}
在doPost方法中提交该方法,在doGet方法中调用doPost方法,对doPost方法的请求提交响应。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//请求的编码格式
String type=request.getParameter("type");//用来区分方法
if("selectZGLYDJ ".equals(type)){
selectZGLYDJ(request, response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
三、Jsp页面中获取Json中的结果
$.getJSON("${ctx}/servlet/BusinessServlet?type=selectZGLYDJ",function(data){//单据编号
var billsnumber=$("#Billsnumber").val(data.Billsnumber);
var num =$("#Billsnumber").val();
alert(num);
});
执行结果: