【Java】自动获取某表某列的最大ID数
使用场景:
当需要往数据库插入数据时,表的主键需要接着已经有的数据后面进行自增。比如已经wq_customer表里,主键为TBL_ID,如果是空表,那么插入的数据TBL_ID设置为1,如果已经有n条数据,那么插入的数据TBL_ID设置为n+1。
SQL语句为
SELECT
CASE
WHEN MAX(TBL_ID) IS NULL THEN
1
ELSE
MAX(TBL_ID) + 1
END AS MAXID
FROM
wq_customer
WHERE
TBL_ID < 100000
单纯查询某表某列MAX为:
SELECT
MAX(TBL_ID)
FROM
wq_customer
WHERE
TBL_ID < 100000;
mybatis的相关代码如下(仅供参考):
调用代码如下:
package com.msk.batch.wq.logic; import com.msk.batch.wq.bean.BWQ201701Bean;
import com.msk.batch.wq.bean.BWQ201701Bean2;
import com.msk.batch.wq.bean.BWQ201701Bean3;
import com.msk.common.logic.CommonLogic;
import com.msk.core.base.BaseDao;
import com.msk.core.base.BaseLogic;
import com.msk.core.bean.BaseParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import java.util.List; /**
* Created by fjm on 2017/1/9.
*/
public class BWQ201701Logic extends BaseLogic{ private static Logger logger = LoggerFactory.getLogger(BWQ201701Logic.class); public interface SqlId {
static final String SQLID_INSERT_OMSDATA = "insertCmCustomer";
} @Autowired
@Override
public void setBaseDao(BaseDao baseDao) {
super.setBaseDao(baseDao);
}
@Autowired
CommonLogic commonLogic; public void insertCmCustomer(List<BWQ201701Bean3> bwq201701BeanList){ for(BWQ201701Bean3 bwq201701Beans:bwq201701BeanList){
BWQ201701Bean bwq201701Bean = new BWQ201701Bean();
long id=commonLogic.maxId("WQ_CUSTOMER","TBL_ID");
bwq201701Bean.setTblId(id);
bwq201701Bean.setCmId(bwq201701Beans.getCm_id());
bwq201701Bean.setCmName(bwq201701Beans.getCm_name());
bwq201701Bean.setCmCode(bwq201701Beans.getCm_code());
bwq201701Bean.setCmType(bwq201701Beans.getCm_type());
bwq201701Bean.setCmManager(bwq201701Beans.getCm_manager());
super.save(SqlId.SQLID_INSERT_OMSDATA, bwq201701Bean);
}
} }
共通代码如下:
package com.msk.common.logic; import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.msk.core.base.BaseDao;
import com.msk.core.base.BaseLogic;
import com.msk.core.bean.BaseParam; /**
* CommonLogic
*
* @author fjm
* @version 1.0
**/
@Service("commonLogic")
public class CommonLogic extends BaseLogic {
/**
* logger
*/
private static Logger logger = LoggerFactory.getLogger(CommonLogic.class); /**
* SQL Id
*/
interface SqlId {
/** 获得最大Max Id */
String SQL_ID_MAX_ID = "maxId";
} /**
* 获得Max Id
*
* @param tableName 表名
* @param tableFiled 字段名称
* @return Max Id
*/
@Transactional(readOnly = true)
public Long maxId(String tableName, String tableFiled) {
logger.debug("获得Max Id");
BaseParam param = new BaseParam();
param.setFilter("tableName", tableName);
param.setFilter("tableFiled", tableFiled);
return (Long) super.findObject(SqlId.SQL_ID_MAX_ID, param);
} @Autowired
@Override
public void setBaseDao(BaseDao baseDao) {
super.setBaseDao(baseDao);
}
}
xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.msk.common.logic.CommonLogic">
<sql id="maxIdSql">
SELECT
CASE
WHEN MAX(${filterMap.tableFiled}) IS NULL THEN 1
ELSE MAX(${filterMap.tableFiled})+1 END AS MAXID
FROM ${filterMap.tableName}
WHERE ${filterMap.tableFiled} <![CDATA[<]]> 100000
</sql>
<select id="maxId" parameterType="BaseParam" resultType="java.lang.Long">
<include refid="maxIdSql"/>
</select>
</mapper>
【Java】自动获取某表某列的最大ID数的更多相关文章
- EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明
在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...
- 完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案
问题描述: CodeSmith是现在比较实用的代码生成器,但是我们发现一个问题: 使用CodeSmith编写MySQL模板的时候,会发现一个问题:MySQL数据表中的列说明获取不到,也就是column ...
- oracle数据库获取指定表的列的相关信息
1.很多时候我们需要从数据库中获取指定表的所有列的相关属性,如 name,commens,datatype,datalength,pk等.下面就是制定的语句. select c.TABLE_NAME ...
- Java中获取刚插入数据库中的数据Id(主键,自动增长)
public int insert(String cName, String ebrand, String cGender) { String sql = "insert into Clot ...
- Python自动获取数据库表结构
Sandman https://sandman.readthedocs.io/en/latest/#
- MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录
今天第一次用MySQL的触发器,怕忘了,赶紧写篇博客记录一下. 废话不说,先上语法: 1 CREATE TRIGGER trigger_name 2 { BEFORE | AFTER } { INSE ...
- java工作流系统表单自动 获取数据
关键词:工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 bpm工作流系统 java工作流主流框架 自定义工作流引擎 表单设计器 流程设计器 什么是数据自动获 ...
- Java获取数据库表 字段 存储的部分数据
在浏览器页面,选中图片(可多选) >单击删除按钮. 重点是, 本数据库表TabHeBeiTianQi中 存在 同一id,对应的picLocalPath字段 存储了多张图片,图片地址用 逗号 ...
- 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...
随机推荐
- hasOwnProperty()函数
hasOwnProperty()函数的返回值为Boolean类型.如果对象object具有名称为propertyName的属性,则返回true,否则返回false 例子: function Site( ...
- C# Disable CTRL-ALT-DEL, ALT-TAB, ALT-F4, Start Menu and so on…
使用C#禁用系统的某些特定按键 原文地址:http://www.tamas.io/c-disable-ctrl-alt-del-alt-tab-alt-f4-start-menu-and-so-on/ ...
- Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战
想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...
- Phaser Matter Collision Plugin 碰撞插件 -- iFiero技术分享
collision-simple-demo Phaser 自带的Arcade虽然易用,但复杂的物理碰撞明显就不够用了,于是Matter等物理引擎还是不得不学的,以下是Matter物理体碰撞的一个插件, ...
- datax 执行流程分析
https://www.jianshu.com/nb/29319571 https://www.jianshu.com/p/b10fbdee7e56
- 不相交集合ADT -数据结构(C语言实现)
读数据结构与算法分析 不相交集合 等价关系 满足三个性质 - 自反性 - 对称性 - 传递性 基本数据结构 基本思路 使用一个数组,下标表示该集合,内容表示指向的父亲 实现 类型声明 typedef ...
- python socket详解
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- 王者荣耀交流协会final发布版本控制报告
二次开发软件说明文档 Dec 6 纠正饼状图点击选择PSP文件无效. 添加饼状图丢失的代码. submit the files that last night I forgot. add shurum ...
- 使用JSon实现三级联动
JSon实现三级联动 我觉得我这个方法比较麻烦,但是目前技术还比较弱,所以先做个笔记自己理解.目前没有和后台交互,只是在前台页面实现了 jQuery和JSon数据实现的,代码如下: <!DOCT ...
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...