博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring-JDBC配置
阅读量:7022 次
发布时间:2019-06-28

本文共 5321 字,大约阅读时间需要 17 分钟。

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

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
25
26
27
28
c3p0连接池配置

可以看到,连接配置中引用了<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
dataSource

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

1     
2
3
4
JDBCTemplate

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

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

1 private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");2 private JdbcTemplate jt=(JdbcTemplate) ctx.getBean("jdbcTemplate");
取得bean-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
addList = new ArrayList
(); 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
delList = new ArrayList
();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
rm=new BeanPropertyRowMapper
(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
re=new BeanPropertyRowMapper
(Dept.class);5 List
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
re=new BeanPropertyRowMapper
(Date.class);10 List
d=jt.query(sql4Date, re);11 System.err.println(d);12 }
统计查询和单列查询

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

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

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

1     
2
3
4
NamedParameterJDBCTemplate配置

用法:

在 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
map=new HashMap
(); 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 }
具名参数测试

高级用法参考:


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

  

转载地址:http://cxbxl.baihongyu.com/

你可能感兴趣的文章
Spring Cloud Alibaba与Spring Boot/Cloud之间不得不说的版本关系
查看>>
docker详细的基础用法
查看>>
从VHD启动第二个操作系统
查看>>
自己整理写的java分页工具条pageUtil
查看>>
MPLS多协议标签交换技术概述
查看>>
AIX磁盘故障的五个场景及处理流程
查看>>
python ping 判断主机是否连通
查看>>
Linux计划任务
查看>>
文件共享需要开通哪些防火墙端口
查看>>
Linq查询语句
查看>>
MacOS High Sierra 引起 VirtualBox Vagrant 同步慢
查看>>
tomcat -6.0.35 安装与配置
查看>>
003-Python流程控制
查看>>
北京,为何离你越来越远
查看>>
LINUX下网卡的相关知识
查看>>
JDBC连接MySQL
查看>>
ns_options ns_enum区别
查看>>
人生哲理
查看>>
MySQL存储引擎小记
查看>>
条件运算符,break,continue,switch的注意事项
查看>>