第一次玩博客,今天被安利了一个很方便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 (网址 ...
随机推荐
- prometheus告警插件-alertmanager
prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警.AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户. pr ...
- Gerapy 安装
1下载: pip install gerapy 2. 在D盘中新建一个文件夹,该然后cd 到该文件夹中,执行: gerapy init # 初始化,可以在任意路径下进行 cd gerapy # 初始化 ...
- Headless Service 和Service
定于spec:clusterIP: None 还记得Service的Cluster IP是做什么的吗?对,一个Service可能对应多个EndPoint(Pod),client访问的是Cluster ...
- js的一些常用方法
1.判断是否为一个空对象 let a={}; console.log(Object.keys(arr).length==0);//true 2.从数组中取出重复的数据 var arr = [" ...
- js设置radio单选框值选中
html页面: <div> <label><input type="radio" name="sex" value="m ...
- 跟随我在oracle学习php(16)
数据库的增删改查 增:create database [if not exists ] 数据库名 [charset 字符集] [collate 字符排序规则]: 说明: 1,if n ...
- django数据库的表已迁移的不能重新迁移的解决办法
django.db.utils.InternalError: (1050, "Table 'tb_content' already exists") mysql数据库在迁移时数据库 ...
- Hibernate-----阶段总结
Hibernate -----总结 一.在使用Hibernate的时候 首先我们要导入Hibernate类库,导入Hibernate压缩包中lib文件中required中的包 ...
- xpath 在firefox,chrome中正常,在requests中不正常的解决。
经多次测试发现: lxml中的etree格式化以后,直接使用firefox或chrome提取的xpath检索不到内容. 主要是因为tbody # 车种xpathczxx = '/html/body/t ...
- JS获取伪元素的属性
window下的getComputedStyle属性.getPropertyValue属性 // 获取 .element:before 的 color 值 var color = window.get ...