使用场景:

当需要往数据库插入数据时,表的主键需要接着已经有的数据后面进行自增。比如已经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数的更多相关文章

  1. EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明

    在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...

  2. 完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案

    问题描述: CodeSmith是现在比较实用的代码生成器,但是我们发现一个问题: 使用CodeSmith编写MySQL模板的时候,会发现一个问题:MySQL数据表中的列说明获取不到,也就是column ...

  3. oracle数据库获取指定表的列的相关信息

    1.很多时候我们需要从数据库中获取指定表的所有列的相关属性,如 name,commens,datatype,datalength,pk等.下面就是制定的语句. select c.TABLE_NAME ...

  4. Java中获取刚插入数据库中的数据Id(主键,自动增长)

    public int insert(String cName, String ebrand, String cGender) { String sql = "insert into Clot ...

  5. Python自动获取数据库表结构

    Sandman https://sandman.readthedocs.io/en/latest/#

  6. MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录

    今天第一次用MySQL的触发器,怕忘了,赶紧写篇博客记录一下. 废话不说,先上语法: 1 CREATE TRIGGER trigger_name 2 { BEFORE | AFTER } { INSE ...

  7. java工作流系统表单自动 获取数据

    关键词:工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流  bpm工作流系统  java工作流主流框架  自定义工作流引擎 表单设计器  流程设计器 什么是数据自动获 ...

  8. Java获取数据库表 字段 存储的部分数据

    在浏览器页面,选中图片(可多选) >单击删除按钮. 重点是, 本数据库表TabHeBeiTianQi中 存在 同一id,对应的picLocalPath字段  存储了多张图片,图片地址用   逗号 ...

  9. 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean

    在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...

随机推荐

  1. day 14 元组

    1. 使用场景? # 列表list 数据类型相同, #rwx文件 100个人的名字, # 用字典 dict ['dɪkt] 很多信息描述1个人, # tuple [ˈtʌpəl] #只读文件 不能修改 ...

  2. 【LG3206】[HNOI2010]城市建设

    [LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\) ...

  3. 在sql server 中查找一定时间段内访问数据库情况

    total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...

  4. python基本数据类型2

    python_day_4 今日大纲: 1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: ...

  5. 《零基础学JavaScript(全彩版)》学习笔记

    <零基础学JavaScript(全彩版)>学习笔记 二〇一九年二月九日星期六0时9分 前期: 刚刚学完<零基础学HTML5+CSS3(全彩版)>,准备开始学习JavaScrip ...

  6. 智慧树mooc自动刷课代码

    最近学习javaScript和JQuery,恰好还有一门mooc没有看.结合学习的知识和其他人的代码:撸了一个自动播放课程的代码,同时自动跳过单章的测试题. 用电脑挂着不动就完事了. 如下: var ...

  7. 记录一下自己申请并使用VPS的全过程

    在学习REST API的时候,想要阅读一下谷歌爸爸的api design guide,无奈无情被墙,正好在学习云相关的技术,就想到申请一个VPS来用用. 这次我选择的是hostmybytes,原因有两 ...

  8. [寒假学习笔记](二)Python初学

    Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...

  9. 后端编程语言PHP

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.PHP 简介 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP 脚本在服务器上执行. 什么是 PHP?(超文本预处理器 ...

  10. lintcode-392-打劫房屋

    392-打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自 ...