Spring-jdbc:JdbcTemplate使用简介
2016-08-16 11:18
423 查看
为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.
作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
使用示例:
在数据库中先准备两张表:
和
在java工程中创建两个对应类:
引入Spring框架相关的jar包以及c3p0和mysql连接jar包。为了对方法进行测试,这里还需要引入JUnit4.这里以导入外部属性文件的方式来配置数据源:
jdbc.properties文件内容如下:
在xml文件中,导入这个属性文件以及配置c3p0数据源:
配置好dataSource后就可以用这个数据源来配置JdbcTemplate了,在xml文件中添加:
在实际的使用中,一般会创建一个dao类来封装对某个对象的所有增删改查操作.
比如,创建一个EmployeeDao类如下:
在这个Dao类中实现了通过id来获取记录并封装成对象返回的方法。如果有需要还可以实现其他操作如插入、删除、更新等。
由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间):
打印输出如下:
总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。
作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
使用示例:
在数据库中先准备两张表:
和
在java工程中创建两个对应类:
public class Department { int id; String deptName; @Override public String toString() { return "Department [id=" + id + ", deptName=" + deptName + "]"; } }
public class Employee { int id; String lastName; String email; Department department; @Override public String toString() { return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", department=" + department + "]"; } public int getId() { return id; } public void setId(int 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; } }
引入Spring框架相关的jar包以及c3p0和mysql连接jar包。为了对方法进行测试,这里还需要引入JUnit4.这里以导入外部属性文件的方式来配置数据源:
jdbc.properties文件内容如下:
user=root password=123 driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql:///spring initPoolSize=5 maxPoolSize=10
在xml文件中,导入这个属性文件以及配置c3p0数据源:
<!-- 导入资源文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置 c3p0 数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}"></property> <property name="password" value="${password}"></property> <property name="jdbcUrl" value="${jdbcUrl}"></property> <property name="driverClass" value="${driverClass}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSize}"></property> </bean>
配置好dataSource后就可以用这个数据源来配置JdbcTemplate了,在xml文件中添加:
<!-- 配置 spring 的 JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>接下来创建一个测试类对JdbcTemplate的方法进行测试:
import java.util.ArrayList; import java.util.List; 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 ctx= null; private JdbcTemplate jdbcTemplate = null; // private EmployeeDao employee; { ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); } /** * 执行 INSERT,UPDATE,DELETE */ @Test public void testUpdate() { String sql = "UPDATE employees SET last_name = ? WHERE id = ?"; jdbcTemplate.update(sql, "Jack", 5); } /** * 测试批量更新操作 * 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个 List 来存放多个数组。 */ @Test public void testBatchUpdate() { String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)"; List<Object[]> batchArgs = new ArrayList<>(); batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1}); batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2}); batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3}); batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3}); batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2}); jdbcTemplate.batchUpdate(sql, batchArgs); } /** * 从数据库中获取一条记录,实际得到对应的一个对象 * 注意:不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper * 2、使用 SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName * 3、不支持级联属性。 JdbcTemplate 只能作为一个 JDBC 的小工具, 而不是 ORM 框架 */ @Test public void testQueryForObject() { String sql = "SELECT id, last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE ID = ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class); //在将数据装入对象时需要调用set方法。 Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1); System.out.println(employee); } /** * 一次查询多个对象 * 注意:调用的不是 queryForList 方法 */ @Test public void testQueryForList() { String sql = "SELECT id, last_name lastName, email FROM employees WHERE id > ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class); List<Employee> employees = jdbcTemplate.query(sql, rowMapper,5); System.out.println(employees); } /** * 获取单个列的值或做统计查询 * 使用 queryForObject(String sql, Class<Long> requiredType) */ @Test public void testQueryForObject2() { String sql = "SELECT count(id) FROM employees"; long count = jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count); } }
在实际的使用中,一般会创建一个dao类来封装对某个对象的所有增删改查操作.
比如,创建一个EmployeeDao类如下:
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; @Repository public class EmployeeDao { @Autowired private JdbcTemplate jdbcTemplate; public Employee get(Integer id) { String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class); Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id); return employee; } }
在这个Dao类中实现了通过id来获取记录并封装成对象返回的方法。如果有需要还可以实现其他操作如插入、删除、更新等。
由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间):
<context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>测试一下EmployeeDao:
@Test public void testEmployeeDao() { EmployeeDao employeeDao = (EmployeeDao) ctx.getBean("employeeDao"); Employee employee = employeeDao.get(1); System.out.println(employee); }
打印输出如下:
总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。
相关文章推荐
- Spring-jdbc:JdbcTemplate使用简介
- 使用Spring + JdbcTemplate + JdbcDaoSupport的例子
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- org.springframework.jdbc.core.JdbcTemplate 使用注意事项
- spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
- Spring_使用 JdbcTemplate和JdbcDaoSupport
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
- 使用Spring的JdbcTemplate简化jdbc操作
- 使用Spring的jdbcTemplate简化JDBC操作
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- Spring中配置JdbcTemplate的三种方式要使用Jdbctemplate 对象来完成jdbc 操作。
- Spring+JDBC组合开发 - 使用JdbcTemplate进行insert/update/delete/query操作
- spring里使用JDBC(三)NamedParameterJdbcTemplate方式
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- spring使用JdbcDaoSupport中封装的JdbcTemplate进行query
- Spring使用JdbcTemplate、JdbcDaoSupport和返回表自增主键值
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- Spring-jdbc:使用支持具名参数的JdbcTemplate