第一次玩博客,今天被安利了一个很方便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 (网址 ...
随机推荐
- 使用Composer安装Symfony
最近的一些项目都会使用symfony框架,首先的第一个问题就是symfony框架的下载及安装,symfony要求的php环境5.5以上的,需要php版本的切换.使用的是windows版的安装起来较为麻 ...
- VS2013 密钥– 所有版本
Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9Visual Studio Premium 2013 KEY(密钥): ...
- jQuery的版本兼容问题
之前在做头像上传的时候,使用的jQuery是1.8.2的版本,然后头像上传做完后,发现项目用的jQuery版本是3.3.1的.由于两个版本的差距太大了.所以兼容很差. 3.3.1不支持剪切头像的某些函 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- win10php环境变量配置(xampp环境)
我的电脑--属性(右键)--高级系统设置--环境变量--系统变量--Path--编辑 新建两条变量: 一个是xampp文件下的php文件,例如 C:\xampp\php 一个是xampp文件下的php ...
- Firebug: 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-
第一种,就是在被请求的程序中添加HTTP头,即CORS跨域(跨域资源共享,Cross-Origin Resource Sharing) 如: Response.Headers.Add("Ac ...
- 开源HUSTOJ
hustoj -- 请一定认真看完本页再动手安装,以免无谓的折腾!====== 根据你选择的发行版不同,从下面三个脚本里选一个来用. <b>不要相信百度来的长篇大论的所谓教程,那些都是好几 ...
- CSS可见区域全局居中
top:$(document).scrollTop() + ($(document).height() - $(document).scrollTop())/2,
- Spring———bean的创建方式,注入方式,复杂类型注入 概括
Spring相关概念和类 1.IOC inverse of control 控制反转 反转了创建对象的方式 以前:new 对象,管理和维护 ...
- 1ci