【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 ...
随机推荐
- day 14 元组
1. 使用场景? # 列表list 数据类型相同, #rwx文件 100个人的名字, # 用字典 dict ['dɪkt] 很多信息描述1个人, # tuple [ˈtʌpəl] #只读文件 不能修改 ...
- 【LG3206】[HNOI2010]城市建设
[LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\) ...
- 在sql server 中查找一定时间段内访问数据库情况
total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...
- python基本数据类型2
python_day_4 今日大纲: 1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: ...
- 《零基础学JavaScript(全彩版)》学习笔记
<零基础学JavaScript(全彩版)>学习笔记 二〇一九年二月九日星期六0时9分 前期: 刚刚学完<零基础学HTML5+CSS3(全彩版)>,准备开始学习JavaScrip ...
- 智慧树mooc自动刷课代码
最近学习javaScript和JQuery,恰好还有一门mooc没有看.结合学习的知识和其他人的代码:撸了一个自动播放课程的代码,同时自动跳过单章的测试题. 用电脑挂着不动就完事了. 如下: var ...
- 记录一下自己申请并使用VPS的全过程
在学习REST API的时候,想要阅读一下谷歌爸爸的api design guide,无奈无情被墙,正好在学习云相关的技术,就想到申请一个VPS来用用. 这次我选择的是hostmybytes,原因有两 ...
- [寒假学习笔记](二)Python初学
Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...
- 后端编程语言PHP
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.PHP 简介 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP 脚本在服务器上执行. 什么是 PHP?(超文本预处理器 ...
- lintcode-392-打劫房屋
392-打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自 ...