Spring中JdbcTemplate详解

来源:互联网 发布:vsftpd 修改端口 编辑:程序博客网 时间:2024/05/16 07:45

Spring中JdbcTemplate详解

一、说在前面

1、为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架。
2、作为 Spring JDBC 框架的核心,JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法。每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务。通过这种方式, 可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
3、JdbcTemplate位于spring-jdbc-4.0.0.RELEASE.jar中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个spring-tx-4.0.0.RELEASE.jar。这个包包含了一下事务和异常控制。
4、JdbcTemplate主要提供以下几类方法:
(1)execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
(2)update方法:用于执行新增、修改、删除等语句;
(3)batchUpdate方法:batchUpdate方法用于批处理执行新增、修改、删除等语句相关语句;
(4)query方法及queryForXXX方法:用于执行查询相关语句;
(5)call方法:用于执行存储过程、函数相关语句。

二、实例代码如下:

1、数据库结构以及初始数据如下:
employee表:
departments表:


2、Department类
package com.at.jdbc;public class Department {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Department [id=" + id + ", name=" + name + "]";}}
3、Employee类
package com.at.jdbc;public class Employee {private Integer id;private String lastName;private String email;private Department department;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Department getDepartment() {return department;}public void setDepartment(Department department) {this.department = department;}@Overridepublic String toString() {return "Employee [id=" + id + ", lastName=" + lastName + ", email="+ email + ", department=" + department + "]";}}
4、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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 配置自动扫描的包 --><context:component-scan base-package="com.at.jdbc"></context:component-scan><!-- 导入资源文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 配置C3P0数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean><!-- 配置Spring的JdbcTemplate模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean></beans>
5、db.properties
jdbc.user=rootjdbc.password=111111jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql:///spring-5jdbc.initialPoolSize=5jdbc.maxPoolSize=10
6、JDBCTest测试类
package com.at.jdbc;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import javax.sql.DataSource;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;public class JDBCTest {private ApplicationContext ct = null;private JdbcTemplate jdbcTemplate;{ct = new ClassPathXmlApplicationContext("applicationContext.xml");jdbcTemplate = (JdbcTemplate) ct.getBean("jdbcTemplate");}/** * 获取单个列的值,或者做统计查询 * 使用queryForObject(String sql, Class<Long> requiredType) 方法 */@Testpublic void testQueryForObject2(){String sql = "SELECT count(id) FROM employee";Long count = jdbcTemplate.queryForObject(sql, Long.class);System.out.println(count);}/** * 查到实体类的集合 * 注意调用的不是queryForList方法 */@Testpublic void testQueryForList(){String sql = "SELECT ID,LAST_NAME lastName,EMAIL FROM employee WHERE ID > ?";RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);List<Employee> employees = jdbcTemplate.query(sql, rowMapper,9);System.out.println(employees);}/** * 从数据库获得一条记录,实际得到对应的一个对象。 * 在这里调用的不是 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法 * 而是调用 queryForObject(String sql, RowMapper<?> rowMapper, Object... args) 方法 * 1、其中的RowMapper 指定如何去映射结果集的行,常用的实现类是 BeanPropertyRowMapper * 2、使用SQL 中的列的别名完成列名和类的属性名的映射,例如LAST_NAME lastName * 3、不支持级联属性,JdbcTemplate 说到底也只是一个 JDBC的小工具,而不是ORM 框架 */@Testpublic void testQueryForObject(){String sql = "SELECT ID,LAST_NAME lastName,EMAIL FROM employee WHERE ID = ?";RowMapper<?> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);Employee employee = (Employee) jdbcTemplate.queryForObject(sql, rowMapper,1);System.out.println(employee);}//测试批量更新、插入、删除//最后一个参数Object[]的List类型,这是因为修改一条记录需要Object的数组,那么修改多条肯定需要多个Object数组@Testpublic void testBatchUpdate(){String sql = "INSERT INTO employee(LAST_NAME,EMAIL,DEPT_ID) VALUES (?,?,?)";List<Object[]> batchArgs = new ArrayList<Object[]>();batchArgs.add(new Object[]{"AA","aa@163.com",1});batchArgs.add(new Object[]{"BB","bb@163.com",2});batchArgs.add(new Object[]{"CC","cc@163.com",3});batchArgs.add(new Object[]{"DD","dd@163.com",3});batchArgs.add(new Object[]{"EE","ee@163.com",2});jdbcTemplate.batchUpdate(sql, batchArgs);}//测试插入、更新、删除@Testpublic void testUpdate(){String sql = "UPDATE employee SET LAST_NAME = ? WHERE ID = ?";jdbcTemplate.update(sql,"luoyepiaoxue2014",1);}@Testpublic void test() throws SQLException {DataSource dataSource = ct.getBean(DataSource.class);System.out.println(dataSource.getConnection());}}

三、实际开发中应用方式代码

1、EmployeeDao类
package com.at.jdbc;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;@Repositorypublic class EmployeeDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public Employee get(Integer id){String sql = "SELECT ID,LAST_NAME lastName,EMAIL FROM employee WHERE ID = ?";RowMapper<?> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);Employee employee = (Employee) jdbcTemplate.queryForObject(sql, rowMapper,1);return employee;}}
2、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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 配置自动扫描的包 --><context:component-scan base-package="com.at.jdbc"></context:component-scan><!-- 导入资源文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 配置C3P0数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean><!-- 配置Spring的JdbcTemplate模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean></beans>
3、测试代码
ApplicationContext ct = new ClassPathXmlApplicationContext("applicationContext.xml");EmployeeDao employeeDao = (EmployeeDao) ct.getBean("employeeDao");System.out.println(employeeDao);


By luoyepiaoxue2014
微博地址:  http://weibo.com/luoyepiaoxue2014 点击打开链接







原创粉丝点击