第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下
首先先对这段代码的简单介绍,我之前在需要操作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的类,现在就来简单介绍一下的更多相关文章
- 第一次玩博客 感觉自己特别low
第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动 ...
- 第一次写博客Poj1044
Date bugs Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3005 Accepted: 889 Descript ...
- Beta版本——第一次冲刺博客
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- 第一次写博客,关于前端开发deMVC在js中的应用
对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
- (转)第一次发博客-说说我的B/S开发框架(asp.net mvc + web api + easyui)
原文地址:http://www.cnblogs.com/xqin/archive/2013/05/29/3105291.html 前言 这些年一直在.net下做企业web系统开发,前前后后经历的不同的 ...
- 第一次的博客-简单的Markdown语法
第一次开通博客 从网上寻找了许多写博客的方法 我觉得对于我来说还是使用 Markdowm 比较容易一些 用我的第一篇博客来记一下一些比较简单常用的Markdown语法 本文参考来源Markdown语法 ...
- 第一次写博客,就写如何向外行介绍自己做的是什么,那个我是做web的
如果想外行问你是做什么的,改如何回答.和内行说java后台就可以了,但外行听不懂,我们该如何描述呢? 我的方法是:我做的是java web开发,不是内外的外,是个英文单词web,全名叫world wi ...
- 第一次使用博客及Coursera课程体验
前言: 第一天的学习目标有三个 开设博客园账户 开设Github账号 进行第一次coursera课程学习:Internet History, Technology, and Security (网址 ...
随机推荐
- 教你函数如何传参更加方便 ----python 传参 *args **kwargs
*args 和 **kwargs 可以将不定数量的参数传递给函数 *args 和 **kwargs,前者适用于 传入非键值对的可变数量的参数列表,后者适用于 传入不定长度的键值对, 作为参数传递给函 ...
- 搭建Java开发环境及相关工具
本文主要记录下在window环境下,搭建Java开发环境,及需要安装的工具软件说明,旨在方便快速完成这些正真开始开发前的准备工作. 1.JDK安装及环境配置 此处安装JDK1.8的版本,官方下载地址: ...
- canal demo搭建全记录
一.环境介绍 canal是阿里开源的中间件,主要用于同步mysql数据库变更.具体参见:https://github.com/alibaba/canal/releases 搭建环境: vmware c ...
- View事件体系
View事件体系 文章目录 View事件体系 一.Android View基础知识 1.1 View简介 1.2 View分类 1.3 View的结构 1.4 View的坐标 1.4.1 Androi ...
- 10ci
- Vue.directive添加全局指令详解
自定义指令创建: Vue.directive( 'mycolor(指令名称:推荐全部小写,驼峰命名会出现问题,看最后面)' , { bind:function(){}, //本例只介绍inserted ...
- 记录这段时间java编程的小知识点
记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift table 同时按,是整体左 ...
- anytime
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/time.h> ...
- ts文件分析(纯c解析代码)
参考链接: 1. MPEG-2 TS码流分析 https://blog.csdn.net/zhubin215130/article/details/8958567 TS Header PAT PMT ...
- MarkdownPan2 简单使用指南
markdown 简单使用指南 一级标题 二级标题 三级标题加代码 四级标题 这里是加粗 这里是正文and English 888 这里有正文嵌入代码这种样式 这里是代码块 这种使用的代码块 还有引用 ...