以C3P0连接池为例:由于C3P0是第三方,我们无法使用注解将其定义为bean,因此需要在applicationContext.xml中配置:

     <!-- 导入配置文件 -->
<context:property-placeholder location="classpath:dataSource.properties"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="dataSourceLocal" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 指定连接数据库的驱动-->
<property name="driverClass" value="${jdbc.driverClassName}"/>
<!-- 指定连接数据库的URL-->
<property name="jdbcUrl" value="${jdbc.url}"/>
<!-- 指定连接数据库的用户名-->
<property name="user" value="${jdbc.username}"/>
<!-- 指定连接数据库的密码-->
<property name="password" value="${jdbc.password}"/>
<!-- 指定连接池中保留的最大连接数. Default:15-->
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
<!-- 指定连接池中保留的最小连接数-->
<property name="minPoolSize" value="${jdbc.minPoolSize}"/>
<!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3-->
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0-->
<property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3-->
<property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>
<!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。
但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0-->
<property name="maxStatements" value="${jdbc.maxStatements}"/>
<!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->
<property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
</bean>

c3p0连接池配置

可以看到,连接配置中引用了<context:property-placeholder location="classpath:dataSource.properties"/>标签,这是说从外部配置文件中读取数据库相关的数据,用${}表达式可以读取,因此,我们需要同时配置dataSource.properties文件,内容如下:

 jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=scott
jdbc.password=orcl
jdbc.initialPoolSize=20
jdbc.maxPoolSize=100
jdbc.minPoolSize=10
jdbc.maxIdleTime=600
jdbc.acquireIncrement=5
jdbc.maxStatements=5
jdbc.idleConnectionTestPeriod=60

dataSource

只要保证配置文件正确,数据库的连接配置也就完成了,接下来需要配置JDBCTemplate,仍然是在applicationContext.xml中配置:

     <!-- 配置jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSourceLocal"></property>
</bean>

JDBCTemplate

JDBCTemplate类中,只有一个参数,那就是dataSource,因此需要注入上面的dateSource。

接下来以Oracle中Scott用户下的dept表为例测试:

 private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate jt=(JdbcTemplate) ctx.getBean("jdbcTemplate");

取得bean-JDBCTemplate

     @Test
public void updateTest(){
String sqlUpdate="update emp set ename=? where empno=?";
jt.update(sqlUpdate,"SMITH",7369);
}

单条增删改测试

可以看到,此处在sql语句中使用了?作为占位符,在JDBCTemplate的update方法中一一对应定义即可。

另外,JDBCTemplate同时支持批量操作,代码如下:

     @Test
public void testBatchUpdate(){
//批量修改
String[] s=new String[]{"update emp set ename='SMITH1' where empno=7369","update emp set ename='SMITH' where empno=7369"};
jt.batchUpdate(s);
//批量添加
List<Object[]> addList = new ArrayList<Object[]>();
addList.add(new Object[]{52,"AA","SHANGHAI"});
addList.add(new Object[]{62,"BB","BEIJING"});
addList.add(new Object[]{72,"CC","XI'AN"});
addList.add(new Object[]{82,"DD","HANGZHOU"});
jt.batchUpdate("insert into scott.dept values (?,?,?)",addList);
//批量删除
List<Object[]> delList = new ArrayList<Object[]>();
delList.add(new Integer[]{40});
jt.batchUpdate("delete dept where deptno>?",delList);
}

批量增删改

批量操作需要用到batchUpdate方法,其重载形式如下:

我们使用了第一和第三种方法就够用了。

查询分为单条数据查询和多条数据查询,JDBCTemplate支持使用RowMapper类将其对应到相应的实体类,如果是单条数据,可使用queryForObject方法:

     @Test
public void testQueryForObject(){
String sql="select deptno,dname,loc from dept where deptno=?";
RowMapper<Dept> rm=new BeanPropertyRowMapper<Dept>(Dept.class);
Dept d=jt.queryForObject(sql,rm,20);
System.err.println(d);
}

查询单条数据

如果是多条数据,可以用query方法:

     @Test
public void testQueryForList(){
String sql="select * from dept where deptno>?";
RowMapper<Dept> re=new BeanPropertyRowMapper<Dept>(Dept.class);
List<Dept> dept=jt.query(sql, re,20);
System.out.println(dept);
}

查询多条数据

另外,也支持统计查询和单列查询:

     @Test
public void testQueryColumnOrCount(){
//获取统计信息
String sql="select count(empno) from emp";
Long l=jt.queryForObject(sql, Long.class);
System.err.println(l);
//获取单列信息
String sql4Date="select hiredate from emp";
RowMapper<Date> re=new BeanPropertyRowMapper<Date>(Date.class);
List<Date> d=jt.query(sql4Date, re);
System.err.println(d);
}

统计查询和单列查询


从上面的例子中可以看到,参数都是通过?占位符顺序一一对应传递参数的,如果参数位置变动,那么JDBC操作需要同时变更,不安全且工作量大,因此Spring同时提供了NamedParameterJDBCTemplate具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定.。

优势:具名参数更易于维护, 也提升了可读性.

与JDBCTemplate一样,需要在XML中配置:

     <!-- 配置NamedParameterJDBCTemplate -->
<bean id="namedParameterJDBCTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg><ref bean="dataSourceLocal"/></constructor-arg>
</bean>

NamedParameterJDBCTemplate配置

用法:

在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键

也可以使用 SqlParameterSource 参数

批量更新时可以提供 Map 或 SqlParameterSource 的数组

代码如下:

     /**
* NamedParameterJDBCTemplate用法测试,以update为例
*/
@Test
public void testNamedParameterJDBCTemplate(){
String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数是可以自由命名的
Map<String, Object> map=new HashMap<String, Object>();
map.put("deptno", 94);
map.put("dname", "管理部");
map.put("loc", "金华");
npjt.update(sql, map);
}
/**
* 使用SqlParameterSource类与实体类对应,此时参数命名需与实体类属性名对应
* SqlParameterSource sps = new BeanPropertySqlParameterSource(对象)
*/
@Test
public void testNamedParameterJDBCTemplateByEntity(){
String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数命名需与实体类属性名相同
SqlParameterSource sps=new BeanPropertySqlParameterSource(new Dept(88, "业务部", "北京"));
npjt.update(sql, sps);
}

具名参数测试

高级用法参考:Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数


总结:JDBCTemplate很强大,但毕竟不是ORM框架,比如,并不支持级联操作。

  

Spring-JDBC配置的更多相关文章

  1. Spring JDBC配置数据源

    在本系列教程中,使用的的是MySQL数据库,并创建一个数据库实例:test,在这个数据库实例:test中创建一个表student.如果您使用任何其他数据库,则可以相应地更改DDL和SQL查询,这问题不 ...

  2. spring jdbc 配置数据源连接数据库

    概述 在XML配置数据源,并将数据源注册到JDBC模板 JDBC模板关联业务增删改查 在XML配置数据源 <?xml version="1.0" encoding=" ...

  3. Spring JDBC主从数据库配置

    通过昨天学习的自定义配置注释的知识,探索了解一下web主从数据库的配置: 背景:主从数据库:主要是数据上的读写分离: 数据库的读写分离的好处? 1. 将读操作和写操作分离到不同的数据库上,避免主服务器 ...

  4. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  5. Spring JDBC主从数据库访问配置

    通过昨天学习的自定义配置注释的知识,探索了解一下web主从数据库的配置: 背景:主从数据库:主要是数据上的读写分离: 数据库的读写分离的好处? 1. 将读操作和写操作分离到不同的数据库上,避免主服务器 ...

  6. 在Spring中配置jdbc为什么不能用${username}问题

    楼主在spring中配置jdbc时,引用的是dbcp.jar包,在dataSource.properties配置文件中,有mysql用户名,楼主自然的选择了使用username,密码是root, 然后 ...

  7. 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析

    Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...

  8. Spring Boot -- 配置切换指南

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  9. spring 定时任务配置

    1.(易)如何在spring中配置定时任务? spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 (程序中一般我们都是到过写的,直观些) 1.定义任务 < ...

  10. Spring JDBC实现查询

    1 db.properties jdbc.user=root jdbc.password=920614 jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbc ...

随机推荐

  1. git将远程仓库最新版本拉到本地仓库

    一.正规做法有两种.git fetch和git pull. 注意不管用fetch还是pull,做之前都要在本地仓库做一次git commit,确保,本地仓库和工作目录及缓存一致.1.git fetch ...

  2. Diamond 3.5简易教程(二)------软件的简单使用

    二.软件的简单使用 工程建立后我们就可以进行程序的编写添加了. 选择左下角file list 选项卡 这里主要是工程的信息. 在input files 上右键弹出选项addànew file... 在 ...

  3. 在verilog中调用VHDL模块

    习惯了自己发现一些小问题,既然发现了,就记下来吧,不然又要忘了,这是多么悲痛的领悟. 今天在用vivado进行块设计时所生成的顶层模块居然是用VHDL语言描述的,这时郁闷了,表示只看过VHDL语法但没 ...

  4. [gj]HK一行所见闻

    香港一行 20多年来,未未去过HK,前段时间由于工作关系去了趟HK.感触良多. 一清早,福田过关,做火车,做地铁,一通到了目的地. 总结对那边的印象: 1,所有人都是粤语,包括工作交流.而且他们不怎么 ...

  5. CentOS清除用户登录记录和命令历史方法

    清除登陆系统成功的记录 [root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信息 [root@localhost roo ...

  6. HTML中的布局方式:absolute、relative、fixed、static

    在CSS中关于定位的内容是: position:relative | absolute | static | fixed     static(静态) 没有特别的设定,遵循基本的定位规定,不能通过z- ...

  7. 创建一个动态链接库 (DLL),使用VS2010

    在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程.使用 DLL 是一种重用代码的绝佳方式.您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次, ...

  8. sqlserver 的一些好用的插件

    sqlserver 的一些好用的插件 1.http://www.red-gate.com/products/

  9. 【Unity笔记】UGUI中Canvas屏幕适配

    1.通过RectTransform中的Anchors和Pivot来进行控件和窗体的布局适配. Anchors控制当前Panel相对于父窗体的布局位置,可以设置为居中或者左上角,当父窗体拉伸的时候当前P ...

  10. CAD常见问题

    CAD2016显示线宽点界面右下角三道杠[自定义]按钮,找到并勾选[线宽]. 导出部分图形为JPG图片1. 将想要导出的图形显示于屏幕正中.2. 打开打印窗口(快捷键Ctrl+P).3. 选打印机(虚 ...