Spring-JDBC配置
来源:互联网 发布:淘宝him折扣店是真的吗 编辑:程序博客网 时间:2024/05/15 12:33
1 <!-- 导入配置文件 --> 2 <context:property-placeholder location="classpath:dataSource.properties"/> 3 <aop:aspectj-autoproxy proxy-target-class="true"/> 4 <bean id="dataSourceLocal" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 5 <!-- 指定连接数据库的驱动--> 6 <property name="driverClass" value="${jdbc.driverClassName}"/> 7 <!-- 指定连接数据库的URL--> 8 <property name="jdbcUrl" value="${jdbc.url}"/> 9 <!-- 指定连接数据库的用户名--> 10 <property name="user" value="${jdbc.username}"/> 11 <!-- 指定连接数据库的密码--> 12 <property name="password" value="${jdbc.password}"/> 13 <!-- 指定连接池中保留的最大连接数. Default:15--> 14 <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> 15 <!-- 指定连接池中保留的最小连接数--> 16 <property name="minPoolSize" value="${jdbc.minPoolSize}"/> 17 <!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3--> 18 <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/> 19 <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0--> 20 <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/> 21 <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3--> 22 <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/> 23 <!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。 24 但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0--> 25 <property name="maxStatements" value="${jdbc.maxStatements}"/> 26 <!-- 每60秒检查所有连接池中的空闲连接.Default:0 --> 27 <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/> 28 </bean>
可以看到,连接配置中引用了<context:property-placeholder location="classpath:dataSource.properties"/>标签,这是说从外部配置文件中读取数据库相关的数据,用${}表达式可以读取,因此,我们需要同时配置dataSource.properties文件,内容如下:
1 jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 2 jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl 3 jdbc.username=scott 4 jdbc.password=orcl 5 jdbc.initialPoolSize=20 6 jdbc.maxPoolSize=100 7 jdbc.minPoolSize=10 8 jdbc.maxIdleTime=600 9 jdbc.acquireIncrement=5 10 jdbc.maxStatements=5 11 jdbc.idleConnectionTestPeriod=60
只要保证配置文件正确,数据库的连接配置也就完成了,接下来需要配置JDBCTemplate,仍然是在applicationContext.xml中配置:
1 <!-- 配置jdbcTemplate -->2 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">3 <property name="dataSource" ref="dataSourceLocal"></property>4 </bean>
JDBCTemplate类中,只有一个参数,那就是dataSource,因此需要注入上面的dateSource。
接下来以Oracle中Scott用户下的dept表为例测试:
1 private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");2 private JdbcTemplate jt=(JdbcTemplate) ctx.getBean("jdbcTemplate");
1 @Test2 public void updateTest(){3 String sqlUpdate="update emp set ename=? where empno=?";4 jt.update(sqlUpdate,"SMITH",7369);5 }
可以看到,此处在sql语句中使用了?作为占位符,在JDBCTemplate的update方法中一一对应定义即可。
另外,JDBCTemplate同时支持批量操作,代码如下:
1 @Test 2 public void testBatchUpdate(){ 3 //批量修改 4 String[] s=new String[]{"update emp set ename='SMITH1' where empno=7369","update emp set ename='SMITH' where empno=7369"}; 5 jt.batchUpdate(s); 6 //批量添加 7 List<Object[]> addList = new ArrayList<Object[]>(); 8 addList.add(new Object[]{52,"AA","SHANGHAI"}); 9 addList.add(new Object[]{62,"BB","BEIJING"});10 addList.add(new Object[]{72,"CC","XI'AN"});11 addList.add(new Object[]{82,"DD","HANGZHOU"});12 jt.batchUpdate("insert into scott.dept values (?,?,?)",addList);13 //批量删除14 List<Object[]> delList = new ArrayList<Object[]>();15 delList.add(new Integer[]{40});16 jt.batchUpdate("delete dept where deptno>?",delList);17 }
批量操作需要用到batchUpdate方法,其重载形式如下:
我们使用了第一和第三种方法就够用了。
查询分为单条数据查询和多条数据查询,JDBCTemplate支持使用RowMapper类将其对应到相应的实体类,如果是单条数据,可使用queryForObject方法:
1 @Test2 public void testQueryForObject(){3 String sql="select deptno,dname,loc from dept where deptno=?";4 RowMapper<Dept> rm=new BeanPropertyRowMapper<Dept>(Dept.class);5 Dept d=jt.queryForObject(sql,rm,20);6 System.err.println(d);7 }
如果是多条数据,可以用query方法:
1 @Test2 public void testQueryForList(){3 String sql="select * from dept where deptno>?";4 RowMapper<Dept> re=new BeanPropertyRowMapper<Dept>(Dept.class);5 List<Dept> dept=jt.query(sql, re,20);6 System.out.println(dept);7 }
另外,也支持统计查询和单列查询:
1 @Test 2 public void testQueryColumnOrCount(){ 3 //获取统计信息 4 String sql="select count(empno) from emp"; 5 Long l=jt.queryForObject(sql, Long.class); 6 System.err.println(l); 7 //获取单列信息 8 String sql4Date="select hiredate from emp"; 9 RowMapper<Date> re=new BeanPropertyRowMapper<Date>(Date.class);10 List<Date> d=jt.query(sql4Date, re);11 System.err.println(d);12 }
从上面的例子中可以看到,参数都是通过?占位符顺序一一对应传递参数的,如果参数位置变动,那么JDBC操作需要同时变更,不安全且工作量大,因此Spring同时提供了NamedParameterJDBCTemplate具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定.。
优势:具名参数更易于维护, 也提升了可读性.
与JDBCTemplate一样,需要在XML中配置:
1 <!-- 配置NamedParameterJDBCTemplate -->2 <bean id="namedParameterJDBCTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">3 <constructor-arg><ref bean="dataSourceLocal"/></constructor-arg>4 </bean>
用法:
在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键
也可以使用 SqlParameterSource 参数
批量更新时可以提供 Map 或 SqlParameterSource 的数组
代码如下:
1 /** 2 * NamedParameterJDBCTemplate用法测试,以update为例 3 */ 4 @Test 5 public void testNamedParameterJDBCTemplate(){ 6 String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数是可以自由命名的 7 Map<String, Object> map=new HashMap<String, Object>(); 8 map.put("deptno", 94); 9 map.put("dname", "管理部");10 map.put("loc", "金华");11 npjt.update(sql, map);12 }13 /**14 * 使用SqlParameterSource类与实体类对应,此时参数命名需与实体类属性名对应15 * SqlParameterSource sps = new BeanPropertySqlParameterSource(对象)16 */17 @Test18 public void testNamedParameterJDBCTemplateByEntity(){19 String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数命名需与实体类属性名相同20 SqlParameterSource sps=new BeanPropertySqlParameterSource(new Dept(88, "业务部", "北京"));21 npjt.update(sql, sps);22 }
高级用法参考:Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数
总结:JDBCTemplate很强大,但毕竟不是ORM框架,比如,并不支持级联操作。
- spring配置JDBC事务
- 为Spring配置JDBC
- spring 配置oracle jdbc
- java spring jdbc配置
- java spring jdbc配置
- spring(JDBC)事务配置
- spring+JDBC开发配置
- spring-JDBC 连接配置
- spring jdbc配置
- Spring-JDBC配置
- Struts+Spring+JDBC 简单配置
- Struts+Spring+JDBC 简单配置
- Struts+Spring+JDBC 简单配置
- Spring的数据源JDBC配置
- spring 配置jdbc/hibernate/jpa
- spring jdbc事务配置demo
- Spring JDBC配置一点儿总结
- Spring 的 jdbc 数据源配置
- Spring-AOP
- 使用GitHub和Eclipse进行javaEE开发步骤
- MyEclipse安装EGit插件方法
- server library[unbound] 服务未绑定解决办法
- Shimeji开源桌宠代码学习(1)
- Spring-JDBC配置
- 解决error: Your local changes to the following files would be overwritten by merge
- 计算机概述,键盘快捷键,常见的DOS命令,Java语言概述,JDK、JRE、JVM之间的关系,环境变量的配置
- Tomcat的性能优化及部署时的参数调整
- Spring配置文件加载流程
- Unsupported major.minor version 51.0解决办法
- SPOJ_PT07Z 树最长路径问题
- Spring classPath:用法
- node.js实现文件读取\写入\复制内容——李帅醒博客