Spring JdbcTemplate 简化 JDBC
2016-03-25 14:45
441 查看
spring的JdbcTemplate是对jdbc的简单封装,旨在简化jdbc的操作和避免一些jdbc易发的问题,典型使用方式:
因为 JdbcTemplate 类需要一个数据源 DataSource ,可以通过注入或构造方法的方式传入进去,下面是一个完整的spring注入方式实现的JdbcTemplate:
spring的配置文件 applicationContext.xml:
虽然JdbcTemplate简化了jdbc的操作,但不是一个orm工具,我们仍然需要自己写sql,当然这也许是他比hibernate更灵活的地方,另外JdbcTemplate只是spring自己搞出来的一套东西,不是jee的标准,它依赖spring的api,这样就不利于我们的程序移植,而hibernate实现了JPA规范,JPA规范可以让我们编写不依赖任何特定实现的程序,这样应用程序可以很容器切换到其他实现技术而不仅限与spring或hibernate,所以我们编程应该遵循规范,尽量避免使用私有的或不规范的API。
因为 JdbcTemplate 类需要一个数据源 DataSource ,可以通过注入或构造方法的方式传入进去,下面是一个完整的spring注入方式实现的JdbcTemplate:
spring的配置文件 applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@168.1.50.20:1522:orcl"/> <property name="username" value="scott"/> <property name="password" value="scott"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="myDataSource"/> </property> </bean> <bean id="testDAO" class="com.test.spring.TestJdbcTemplate"> <property name="jdbcT"> <ref bean="jdbcTemplate"/> </property> </bean> </beans>里面声明了一个DataSource,声明了一个JdbcTemplate并引用了数据源,testDAO是自己的业务bean,并且注入进去了一个JdbcTemplate到jdbcT属性上面,java代码:
package com.test.spring; import com.test.User; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import java.util.Iterator; import java.util.List; import java.util.Map; public class TestJdbcTemplate { private JdbcTemplate jdbcT; public void setJdbcT(JdbcTemplate jdbcT) { this.jdbcT = jdbcT; } private static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); public static Object getBean(String beanName) { return ctx.getBean(beanName); } public static void main(String[] args) { TestJdbcTemplate testDAO = (TestJdbcTemplate) getBean("testDAO"); testDAO.addUser(); testDAO.findALL(); } public void addUser() { String sql = "insert into student VALUES ('userid', 'username')"; jdbcT.update(sql); } public void findALL() { String sql = "select * from student"; List list = jdbcT.queryForList(sql); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Map<String, String> dataMap = (Map) iterator.next(); User user = new User(); user.setId(dataMap.get("ID")); user.setName(dataMap.get("NAME")); System.out.println(user); } } public int delete(int bid) { String sql = "delete from DeptInfo where bid =?"; return jdbcT.update(sql, new Object[]{bid}); } }
package com.test; public class User { private String id; private String name; public String getName() { return name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } }上面就完成了,当然我么也可以不需要配置注入的方式直接使用JdbcTemplate,它其实就是一个普通的类,构造方法可以传入一个数据源,如我们可以这么写
JdbcTemplate jt= new JdbcTemplate(new MyDataSource(xxx,xxx)); 然后就可以使用了,如果是spring配置文件了定义了一个的话,就可以直接使用 JdbcTemplate jt= (JdbcTemplate)ApplicationContext.getBean("jdbcTemplate") 如果spring的配置文件中只有数据源定义的话,也可以先获取注入的数据源在构造JdbcTemplate,如 JdbcTemplate jt= new JdbcTemplate((DataSource)ApplicationContext.getBean("myDataSource")); 方式有很多,其目的就是要获取到一个JdbcTemplate的实例,JdbcTemplate提供了很多方便的操作jdbc的api:如execute、query、queryForObject、queryForXXX等, 其中queryForObject可以自动将sql查询结果转换为对象,上面的java例子我们接收到的是一个Map,然后通过map.get("字段名")的方式手工地赋值到new 出来的User对象里, 而queryForObject可以自动完成这个过程,他默认情况下根据数据库字段名和类的属性的对应关系赋值,如果数据库表的字段名和类的属性不对应,也可以通过 RowMapper 接口定制映射过程。 此接口只有一个抽象方法:Object mapRow(ResultSet rs, int rowNum) throws SQLException;很好理解,实现过程就是new出来一个对象,然后从ResultSet中get出需要的字段赋值到对象里就好了 好上面例子中的Map中获取数据赋值到对象是一样的,只不过spring做了一些抽象而已,我们只需要写一个这样的映射类,所有的映射操作就不用自己写了,查询的时候指定下这个映射类就ok。
虽然JdbcTemplate简化了jdbc的操作,但不是一个orm工具,我们仍然需要自己写sql,当然这也许是他比hibernate更灵活的地方,另外JdbcTemplate只是spring自己搞出来的一套东西,不是jee的标准,它依赖spring的api,这样就不利于我们的程序移植,而hibernate实现了JPA规范,JPA规范可以让我们编写不依赖任何特定实现的程序,这样应用程序可以很容器切换到其他实现技术而不仅限与spring或hibernate,所以我们编程应该遵循规范,尽量避免使用私有的或不规范的API。
相关文章推荐
- JavaBean中的get/set 的命名规范
- 做一个合格的程序猿之浅析Spring AOP源码(十六) 分析ProxyFactory
- 【Spring五】AOP之使用注解配置
- spring mvc 多数据源配置
- java的Runtime的exec
- pom控制java项目的打包方式
- 第一个Java程序
- java数组遍历——iterator和for方法
- java Pattern和Matcher详解
- 3月25日html(六) Javascrip
- Java Memory Model
- java 线程中断
- java 正则操作之获取
- ssh整合问题总结--运行项目时报java.lang.StackOverflowError(堆栈溢出)异常
- Java集合(三)TreeSet的使用
- java 变量的命名,get和set方法的问题
- Java 之NIO(二) - Channel
- java 小结 (二)
- (转)Java集合---HashMap源码剖析
- Java集合(二)HashSet的使用