首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦。所以就能拿则拿不能拿的就简单地封装了一下。

首先是Insert。Spring框架的JDBC包里面的.core.包里面的simple包有个SimpleJdbcInsert这样一个类,它给我们带来了很好的对于插入数据的实现。

  它只需要我们提供表单名称,和一个Map就可以帮我们轻松把数据放到数据库。

public int insertObject(Map<String, Object> entity, String tableName) {
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate);
insert.setTableName(tableName);
int result = insert.execute(entity);
return result;
}

  这个类里面有个execute方法需要我们穿进去一个Map就能把Map里面的数据插入到数据库了,具体是怎么用的呢?下面我们就来看一下

@Test
public void insert() {
try {
Map<String, Object> entity = new HashMap<>();
entity.put("STU_NAME", "AAA");
entity.put("STU_AGE", 66);
entity.put("STU_UPDATE_DATE", new Date());
studentService.insertObject(entity, "tb_student");
} catch (Exception e) {
e.printStackTrace();
}
}

这是Service层的代码

@Transactional
@Override
public int insertObject(Map<String, Object> entity, String tableName) {
dbDao.insertObject(entity, tableName);
return dbDao.insertObject(entity, tableName);
}

 这样写就可以了。嗯。就这么简单,那···它是怎么实现的呢? 

protected int doExecute(Map<String, ?> args) {
checkCompiled();
List<Object> values = matchInParameterValuesWithInsertColumns(args);
return executeInsertInternal(values);
}

  这里就是它的excute方法的底层的首层代码。这里可以看到需要我们传入一个HashMap对象,然后通过另外一个类对这个HashMaP进行解析得到一个List的对象数组。

那···这里它又是怎样解析的呢?于是我出于好奇继续对它进行“刨根问底”

public List<Object> matchInParameterValuesWithInsertColumns(Map<String, ?> inParameters) {
List<Object> values = new ArrayList<Object>();
Map<String, Object> source = new LinkedHashMap<String, Object>(inParameters.size());
for (String key : inParameters.keySet()) {
source.put(key.toLowerCase(), inParameters.get(key));
}
for (String column : this.tableColumns) {
values.add(source.get(column.toLowerCase()));
}
return values;
}

  点进去一看。嗯就是通过matchInParameterValuesWithInsertColumns这个类来实现这个Map解析的。这个实现非常简单就是把我们给他的HashMap转换成LinkHashMap。这样就能把散落在内存各处的数据串成一个有序的HashMap了。

将HashMap的数据统一它们的大小写,之后有序地丢进去这个LinkHashMap。接着通过复杂的算法获得数据库表到底有多少列,接着循环把这个HashMap的数据一个个丢到List里面,接着返回一个对象List。再进行Sql拼接

public String createInsertString(String... generatedKeyNames) {
Set<String> keys = new LinkedHashSet<String>(generatedKeyNames.length);
for (String key : generatedKeyNames) {
keys.add(key.toUpperCase());
}
StringBuilder insertStatement = new StringBuilder();
insertStatement.append("INSERT INTO ");
if (getSchemaName() != null) {
insertStatement.append(getSchemaName());
insertStatement.append(".");
}
insertStatement.append(getTableName());
insertStatement.append(" (");
int columnCount = 0;
for (String columnName : getTableColumns()) {
if (!keys.contains(columnName.toUpperCase())) {
columnCount++;
if (columnCount > 1) {
insertStatement.append(", ");
}
insertStatement.append(columnName);
}
}
insertStatement.append(") VALUES(");
if (columnCount < 1) {
if (this.generatedKeyColumnsUsed) {
logger.info("Unable to locate non-key columns for table '" +
getTableName() + "' so an empty insert statement is generated");
}
else {
throw new InvalidDataAccessApiUsageException("Unable to locate columns for table '" +
getTableName() + "' so an insert statement can't be generated");
}
}
for (int i = 0; i < columnCount; i++) {
if (i > 0) {
insertStatement.append(", ");
}
insertStatement.append("?");
}
insertStatement.append(")");
return insertStatement.toString();
}

  这里我们可以看到这就是用了一个StringBuilder把Sql的关键字和我们传进去的数据库表的名称,还有表的列名和Values之后的我们需要插入的值。最后把完整的SQL语句再传给数据库的执行对象返回受影响条数的Int类型的结果。

这里得出一个结论,我们在学习的过程中,通道说源代码就感觉是非常高大上的对自己来说是遥不可及的东西,实际上点进去分析一下就可以发现在过往在学校的学习中,我们已经接触过这个知识,只是在用的时候缺乏经验,不知道

如何去在脑海里面把知识点取出来。所以就妨碍了我们在代码上的实现。而且对于学习需要我们拥有一个“刨根问底的心”。心中有了疑问就会不知不觉地去追求这个答案。哪怕最后的结果是个很简单的东西。

我们知道了数据库有多少个字段就只需要判断SQL里面需要放多少个非空字段的内容进去就可以了。希望今天写的博文对大家有用。

第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下的更多相关文章

  1. 第一次玩博客 感觉自己特别low

    第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动 ...

  2. 第一次写博客Poj1044

    Date bugs Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3005   Accepted: 889 Descript ...

  3. Beta版本——第一次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  4. 第一次写博客,关于前端开发deMVC在js中的应用

    对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...

  5. HDU 2064 菜鸡第一次写博客

    果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...

  6. (转)第一次发博客-说说我的B/S开发框架(asp.net mvc + web api + easyui)

    原文地址:http://www.cnblogs.com/xqin/archive/2013/05/29/3105291.html 前言 这些年一直在.net下做企业web系统开发,前前后后经历的不同的 ...

  7. 第一次的博客-简单的Markdown语法

    第一次开通博客 从网上寻找了许多写博客的方法 我觉得对于我来说还是使用 Markdowm 比较容易一些 用我的第一篇博客来记一下一些比较简单常用的Markdown语法 本文参考来源Markdown语法 ...

  8. 第一次写博客,就写如何向外行介绍自己做的是什么,那个我是做web的

    如果想外行问你是做什么的,改如何回答.和内行说java后台就可以了,但外行听不懂,我们该如何描述呢? 我的方法是:我做的是java web开发,不是内外的外,是个英文单词web,全名叫world wi ...

  9. 第一次使用博客及Coursera课程体验

    前言: 第一天的学习目标有三个 开设博客园账户 开设Github账号 进行第一次coursera课程学习:Internet History, Technology, and Security  (网址 ...

随机推荐

  1. Java并发编程的艺术· 笔记(1)

    目录 1.volatile的原理 2.Synchonized 3.无锁-偏向锁-轻量级锁-重量级锁 4.Java实现原子操作 1.volatile的原理 如何保持可见性: 1)将当前处理器缓存行的数据 ...

  2. C# 动态生成的按钮及定义按钮的事件的代码

    内容闲暇时间,把内容过程中比较常用的内容备份一下,如下的内容内容是关于C# 动态生成的按钮及定义按钮的事件的内容,应该对码农们也有用途. HtmlGenericControl control = ne ...

  3. 使用npm私有服务器保存公司内部强业务类型组件(二):vue-webpack框架

    一套基于vue webpack element-ui的npm私有服务器开发组件框架 下载 在配置的有两个地方需要注意: 1:配置library library选项: 如果设置此选项,会将bundle导 ...

  4. jquery tab切换

    首先引入jquery.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. BUAA_OO第二单元作业总结——多线程

    OO第二单元作业总结——多线程 单元任务 本单元主要的内容是通过模拟电梯的运行来熟悉多线程的实现,从简单的单部FAFS电梯开始,ALS电梯,到最后的多部ALS电梯. 一.设计策略分析总结 1.1 多线 ...

  6. js 批量提交数据

    // 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...

  7. GDAL——命令使用专题——gdallocationinfo命令

    GDAL——命令使用专题——gdallocationinfo命令  前言 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数 ...

  8. 缺少新的栈标识:报出异常FLAG_ACTIVITY_NEW_TASK flag-是由于activity关闭之后开启一个新的acitivity时没有标识在栈中,所以需要给一个栈标识

    异常(栈里必须有activity的flag标识): 05-02 08:43:36.173: E/AndroidRuntime(3328): android.util.AndroidRuntimeExc ...

  9. mybatis一简单one2one关系xml配置

    user类 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC &qu ...

  10. ASP.NET 文件上传的实现(Upload)

    1.最近应项目开发的需求要实现附件的异步上传和下载. 2.上传:文件上传到指定的路径下,并返回上传文件的信息给前端界面,如:文件的图标.上传的文件名.文件的大小. 3.上传后,在前端界面上显示上传的文 ...