【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate

 

首先我们肯定要引入对应的jar,来构建数据源对象

     <dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.1.1</version></dependency>

根据这个我们简单的创建一个jdbctemplate对象

package cn.cutter.start.bean;import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;/*** 用来封装第三方对象的类,加入spring容器* @author xiaof**/
@Component
public class JdbcTemplateFactoryTestBean implements FactoryBean<JdbcTemplate> {@Overridepublic JdbcTemplate getObject() throws Exception {BasicDataSource dataSource = new BasicDataSource();//设置相应的参数//1、数据库驱动类dataSource.setDriverClassName("com.mysql.jdbc.Driver");//2、url,用户名,密码dataSource.setUrl("jdbc:mysql://localhost:3306/liferay?characterEncoding=utf-8");dataSource.setUsername("liferay"); dataSource.setPassword("xiaofeng2017");//3、初始化连接大小dataSource.setInitialSize(1);//4、连接池最大数据量dataSource.setMaxTotal(500);//5、连接池最大小空闲dataSource.setMinIdle(1);dataSource.setMaxIdle(20);//6、最大等待时间 单位毫秒dataSource.setMaxWaitMillis(20 * 1000);//7、指明连接是否被空闲连接回收器(如果有)进行检验dataSource.setPoolPreparedStatements(true);//8、运行一次空闲连接回收器的时间间隔(60秒)dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000);//9、验证时使用的SQL语句dataSource.setValidationQuery("SELECT 1 FROM DUAL");//10、借出连接时不要测试,否则很影响性能//11、申请连接的时候检测,如果空闲时间大于  timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效dataSource.setTestWhileIdle(false);JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);return jdbcTemplate;}@Overridepublic Class<?> getObjectType() {return JdbcTemplate.class;}}

好了,测试一下

@Testpublic void testJdbcTemplate() {ApplicationContext ctx = this.before();JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplateFactoryTestBean");
//        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");//执行sqlString sql = "select 1 from dual";String sql2 = "update xiaof_foo t set t.userName = ?, t.modifiedDate = ? where t.fooid = ? ";//        jdbcTemplate.execute(sql);
        jdbcTemplate.update(sql2, "cutter_point",  new Date(), "1");}

 

Jdbctemplate

 

 

创建jdbctemplate只要创建对应的DataSource就可以了,至于其他查询,多种多样

 

 

NamedParameterJdbcTemplate

 

 

我们在使用jdbctemplate的时候,都是通过?来指定对应的参数,那么这里就有一种更加贴近语义的方式

 

 

我们创建这个template对象

 

 

package cn.cutter.start.bean;import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;/*** 加入spring容器,使用 NamedParameterJdbcTemplate* @author xiaof**/
@Component
public class NamedParameterJdbcTemplateTestFactoryBean implements FactoryBean<NamedParameterJdbcTemplate> {@Overridepublic NamedParameterJdbcTemplate getObject() throws Exception {BasicDataSource dataSource = new BasicDataSource();//设置相应的参数//1、数据库驱动类dataSource.setDriverClassName("com.mysql.jdbc.Driver");//2、url,用户名,密码dataSource.setUrl("jdbc:mysql://localhost:3306/liferay?characterEncoding=utf-8");dataSource.setUsername("liferay"); dataSource.setPassword("xiaofeng2017");//3、初始化连接大小dataSource.setInitialSize(1);//4、连接池最大数据量dataSource.setMaxTotal(500);//5、连接池最大小空闲dataSource.setMinIdle(1);dataSource.setMaxIdle(20);//6、最大等待时间 单位毫秒dataSource.setMaxWaitMillis(20 * 1000);//7、指明连接是否被空闲连接回收器(如果有)进行检验dataSource.setPoolPreparedStatements(true);//8、运行一次空闲连接回收器的时间间隔(60秒)dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000);//9、验证时使用的SQL语句dataSource.setValidationQuery("SELECT 1 FROM DUAL");//10、借出连接时不要测试,否则很影响性能//11、申请连接的时候检测,如果空闲时间大于  timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效dataSource.setTestWhileIdle(false);NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);return namedParameterJdbcTemplate;}@Overridepublic Class<?> getObjectType() {// TODO Auto-generated method stubreturn NamedParameterJdbcTemplate.class;}}

使用这个,我们来查询一下数据库的数据量

 

 

数据库中我们查询结果

 

select count(*) from xiaof_foo t where t.fooId = '1'

 

 

 

代码中使用NamedParameterJdbcTemplate

 

 

@Testpublic void testNamedParameterJdbcTemplate() {ApplicationContext ctx = this.before();NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
//        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");//执行sql//设置参数对象SqlParameterSource sqlParameterSource = new MapSqlParameterSource("fooId", "1");//统计个数String sql = "select count(*) from xiaof_foo t where t.fooId = :fooId";int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParameterSource, Integer.class);System.out.println("个数是:" + count);}

 

 

还有哦,最后注意下,这个 :参数名  这个是区分大小写的

 

 

 

如果有多个参数,那么直接对map对象进行put就可以了

 

@Testpublic void testNamedParameterJdbcTemplate() {ApplicationContext ctx = this.before();NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
//        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");//执行sql//设置参数对象MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource("fooid", "1");sqlParameterSource.addValue("userName", "cutter_point");//统计个数String sql = "select count(*) from xiaof_foo t where t.fooId = :fooid and userName = :userName";int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParameterSource, Integer.class);System.out.println("个数是:" + count);}

结果:

 

 

 

借助bean对象进行传参

 

 

@Testpublic void testNamedParameterJdbcTemplateModel() {ApplicationContext ctx = this.before();NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
//        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");
        String sql = "select * from xiaof_foo t where t.fooId = :fooId";XiaoFFoo xiaoFFoo = new XiaoFFoo();xiaoFFoo.setFooId(1l);SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(xiaoFFoo);List<Map<String, Object>> xiaoFFoo2s = namedParameterJdbcTemplate.queryForList(sql, sqlParameterSource);System.out.println("名字是:" + xiaoFFoo2s.get(0).get("userName"));}

 

 

 

SimpleJdbcTemplate

 

集jdbctemplate和namedparameterJdbctemplate 与一身,并在两者基础上新增java 5的特性:

 

动态参数

自动拆箱解箱

范型

 

 

不过这个在后面的spring中会被去除,既然这样,我们就不浪费时间再这个上面了,拜拜呢你嘞。。。

 

转载于:https://www.cnblogs.com/cutter-point/p/9147745.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年度“中国神经科学重大进展”获奖名单【附成果介绍】

来源&#xff1a;brainnews编辑&#xff1a;Simon为了推动神经科学领域的创新发展&#xff0c;充分展示和宣传神经科学领域的重大科研成果&#xff0c;经中国神经科学学会七届二次常务理事会一致通过&#xff0c;开展2020年度“中国神经科学重大进展”推荐工作。按照相关程序&a…

python选择某一行_Python常用语法有哪些 如何快速入门Python开发

Python常用语法有哪些&#xff1f;如何快速入门Python开发&#xff1f;Python编程语言是最容易学习、并且功能强大的语言&#xff0c;吸引了很多人学习入行。很多人想知道如何快速入门Python开发&#xff0c;接下来就给大家分享Python学习入门中常用的语法知识。1、变量。常量&…

人类使用AI征服太空技术盘点,《星球大战》中的机器人会成为现实吗?

来源&#xff1a;学术头条作者&#xff1a;Thomas Lawrence一说起太空 AI&#xff0c;你脑海中浮现的是这样的角色吗&#xff1f;图 | 电影《星球大战》的AI机器人&#xff1a;C-3PO和R2-D2&#xff08;来源&#xff1a;starwars.fandom.com)实际上&#xff0c;早在现代计算机问…

springboot jar中没有主清单属性_Spring Boot 常见错误及解决方法

导读Spring Boot 作为 Java 生态中最流行的开发框架&#xff0c;意味着被数以万计的开发者所使用。下面根据我们自身遇到的问题&#xff0c;加上用户提供的一些反馈&#xff0c;来大致梳理下 Spring Boot 的常见错误及解决方法。找不到配置&#xff1f;配置不对&#xff1f;配置…

Nature:2020年10大科学发现

文章来源&#xff1a;新浪探索在2020年即将结束之际&#xff0c;《自然》&#xff08;Nature&#xff09;杂志盘点了今年发表的科学新闻和研究观点&#xff0c;从中选出了十项最为重大的科学发现&#xff0c;既包括新冠病毒研究、压力如何导致白发、HIV治疗等医学方面的研究&am…

php mysql上传多张图片_PHP实现一次性多张图片上传功能

原标题&#xff1a;PHP实现一次性多张图片上传功能最近遇到一个需求&#xff0c;就是多张图片上传&#xff0c;按住Ctrl键能选择多张图片一次性上传&#xff0c;上传成功后数据库保存图片的路径及图片原来的文件名。该功能一般在比较成熟的内容编辑器插件中有&#xff0c;今天特…

【2018.6.7】阶段总结

颓废了好久-.- 不记得从什么时候开始的了吧- 1. 好像是去年初赛翻车&#xff1f;&#xff09;&#xff09;归于以外好像也是我不对&#xff0c;&#xff0c;&#xff0c;总之很多&#xff0c;&#xff0c;不对的地方吧&#xff0c;&#xff0c;&#xff0c;我&#xff0c;&am…

车联网支持实现无人驾驶的思考

来源&#xff1a;机器学习研究组订阅号/ 导读 /无人驾驶是车辆作为运载工具智能化、网联化发展的核心应用功能&#xff0c;也是车联网、智慧交通产业发展的核心应用服务。网联无人驾驶则是在车辆智能化基础上&#xff0c;通过车联网实现车与车、车与路等的互联和信息交互&#…

简论重大科学发现诞生的时机

来源&#xff1a;秦四清科学网博客。链接地址&#xff1a;http://blog.sciencenet.cn/blog-575926-1263364.html 纵观科学史&#xff0c;几乎每一项重大科学发现诞生的时机需要&#xff1a;&#xff08;1&#xff09;当时已具备足够的知识和资料储备&#xff1b;&#xff08;2&…

python pip gpl_python pip怎么更新包

1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip&#xff0c;下载 .tar.gz压缩包1.2 Linux安装pip# tar -xzvf pip-1.5.4.tar.gz 解压# cd pip-1.5.4 进入解压文件# python setup.py install 安装1.3 升级pippython -m pip install…

人工智能皇冠上的明珠:自然语言处理简介、最新进展、未来趋势

来源&#xff1a;图灵人工智能 编辑&#xff1a;TJUNLP 自然语言处理&#xff08;Nature Language Processing&#xff0c;NLP&#xff09;被誉为“人工智能皇冠上的明珠”&#xff0c;一方面表明了它的重要性&#xff0c;另一方面也显现出了它的技术难度。本文整理了自然语言…

Yoshua Bengio:深度学习的未来需要“探索高级认知的归纳偏置”

来源&#xff1a;AI科技评论 编译&#xff1a;Mr Bear本文介绍了Yoshua Bengio及其学生Anirudh Goyal近期发表的一篇论文&#xff0c;该论文围绕“归纳偏置”概念&#xff0c;展开了对当下人工智能研究现状的讨论&#xff0c;并提出了富有启发性的观点&#xff1a;不同的深度学…

头发剪短了要快速生发_怎样生发效果最好最快?四个方法快速长出头发!

脱发问题导致很多人头发稀少、头发细软油腻&#xff0c;这些症状&#xff0c;让患者时常感到十分的痛苦&#xff0c;因为他们每天都要面临被调侃和取笑的尴尬&#xff0c;不仅个人形象全无&#xff0c;更是饱受严重的自卑心理&#xff0c;甚至因为脱发问题&#xff0c;总是给人…

AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》

来源&#xff1a;机器学习研究组订阅号即使并非物理学界人士&#xff0c;我们也对薛定谔这个名字并不陌生&#xff0c;比如「薛定谔的猫」。著名物理学家埃尔温 薛定谔是量子力学奠基人之一&#xff0c;他在 1926 年提出的薛定谔方程&#xff08;Schrdinger equation&#xff…

redis修改端口号后还是占用6379_Redis分布式缓存分布式集群搭建

当你试图解决一个你不理解的问题时,复杂化就产成了。—Andy BootheRedis集群安装部署Redis是一个运行在内存的非关系型数据库&#xff0c;因为其速度快(效率高)&#xff0c;支持数据的持久化(安全)&#xff0c;事务操作的原子性(所有操作的原子性)&#xff0c;使得其在高并发场…

千禧年大奖难题之始与未终

来源&#xff1a;数学文化撰文&#xff1a;Arthur Michael Jaffe、薛博卿“千禧年大奖难题”的诞生千禧之际&#xff0c;万象更新&#xff0c;数学界的柔风细雨中惊响起初夏的雷鸣。七个重要的数学问题&#xff01;七百万美元的巨额奖金&#xff01;克雷数学研究所公布的大奖难…

linux mysql 5.6.14_CentOS 6.4下编译安装MySQL 5.6.14

配置用户MySQL启动成功后&#xff0c;root默认没有密码&#xff0c;我们需要设置root密码。设置之前&#xff0c;我们需要先设置PATH&#xff0c;要不不能直接调用mysql修改/etc/profile文件&#xff0c;在文件末尾添加PATH/usr/local/mysql/bin:$PATHexport PATH关闭文件&…

全世界最前沿的125个科学问题

来源&#xff1a;世界先进制造技术论坛在庆祝Science创刊125周年之际&#xff0c;Science公布了125个最具挑战性的科学问题。了解前沿科学研究方向&#xff0c;对你的成长或许有所帮助。简单归纳统计这125个问题&#xff0c;其中涉及生命科学的问题占46%&#xff0c;关系宇宙和…

解读阿里官方代码规范

2017年开春&#xff0c;阿里对外公布了「阿里巴巴Java开发手册」从头到尾浏览了一遍这份手册之后&#xff0c;感觉很棒。虽然其中的某些观点笔者不能苟同&#xff0c;但大部分的规范还是值得绝大多数程序员学习和遵守的。 笔者将对这份代码规范中的一些细节做一些解读&#xff…

知识图谱下一站:认知智能

来源&#xff1a;华东师大ICA本文系首届“认知智能”研讨会讨论部分会议纪要。首届“认知智能”研讨会&#xff0c;由华东师范大学计算机学院主办&#xff0c;于12月8日在华东师范大学中山北路校区办公楼小礼堂成功举办。会中多位专家学者进行了学术报告&#xff0c;并围绕认知…