前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.

作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。

使用示例:

在数据库中先准备两张表:

在java工程中创建两个对应类:

[java] view plain copy
  1. public class Department {
  2. int id;
  3. String deptName;
  4. @Override
  5. public String toString() {
  6. return "Department [id=" + id + ", deptName=" + deptName + "]";
  7. }
  8. }
[java] view plain copy
  1. public class Employee {
  2. int id;
  3. String lastName;
  4. String email;
  5. Department department;
  6. @Override
  7. public String toString() {
  8. return "Employee [id=" + id + ", lastName=" + lastName + ", email="
  9. + email + ", department=" + department + "]";
  10. }
  11. public int getId() {
  12. return id;
  13. }
  14. public void setId(int id) {
  15. this.id = id;
  16. }
  17. public String getLastName() {
  18. return lastName;
  19. }
  20. public void setLastName(String lastName) {
  21. this.lastName = lastName;
  22. }
  23. public String getEmail() {
  24. return email;
  25. }
  26. public void setEmail(String email) {
  27. this.email = email;
  28. }
  29. public Department getDepartment() {
  30. return department;
  31. }
  32. public void setDepartment(Department department) {
  33. this.department = department;
  34. }
  35. }

引入Spring框架相关的jar包以及c3p0和mysql连接jar包。为了对方法进行测试,这里还需要引入JUnit4.这里以导入外部属性文件的方式来配置数据源:

jdbc.properties文件内容如下:

[plain] view plain copy
  1. user=root
  2. password=123
  3. driverClass=com.mysql.jdbc.Driver
  4. jdbcUrl=jdbc:mysql:///spring
  5. initPoolSize=5
  6. maxPoolSize=10

在xml文件中,导入这个属性文件以及配置c3p0数据源:

[html] view plain copy
  1. <!-- 导入资源文件 -->
  2. <context:property-placeholder location="classpath:jdbc.properties"/>
  3. <!-- 配置 c3p0 数据源 -->
  4. <bean id="dataSource"
  5. class="com.mchange.v2.c3p0.ComboPooledDataSource">
  6. <property name="user" value="${user}"></property>
  7. <property name="password" value="${password}"></property>
  8. <property name="jdbcUrl" value="${jdbcUrl}"></property>
  9. <property name="driverClass" value="${driverClass}"></property>
  10. <property name="initialPoolSize" value="${initPoolSize}"></property>
  11. <property name="maxPoolSize" value="${maxPoolSize}"></property>
  12. </bean>

配置好dataSource后就可以用这个数据源来配置JdbcTemplate了,在xml文件中添加:

[html] view plain copy
  1. <!-- 配置 spring 的 JdbcTemplate -->
  2. <bean id="jdbcTemplate"
  3. class="org.springframework.jdbc.core.JdbcTemplate">
  4. <property name="dataSource" ref="dataSource"></property>
  5. </bean>

接下来创建一个测试类对JdbcTemplate的方法进行测试:

[java] view plain copy
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.jdbc.core.RowMapper;
  9. public class JDBCTest {
  10. private ApplicationContext ctx= null;
  11. private JdbcTemplate jdbcTemplate = null;
  12. //  private EmployeeDao employee;
  13. {
  14. ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
  15. jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
  16. }
  17. /**
  18. * 执行 INSERT,UPDATE,DELETE
  19. */
  20. @Test
  21. public void testUpdate() {
  22. String sql = "UPDATE employees SET last_name = ? WHERE id = ?";
  23. jdbcTemplate.update(sql, "Jack", 5);
  24. }
  25. /**
  26. * 测试批量更新操作
  27. * 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个 List 来存放多个数组。
  28. */
  29. @Test
  30. public void testBatchUpdate() {
  31. String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";
  32. List<Object[]> batchArgs = new ArrayList<>();
  33. batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1});
  34. batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2});
  35. batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3});
  36. batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3});
  37. batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2});
  38. jdbcTemplate.batchUpdate(sql, batchArgs);
  39. }
  40. /**
  41. * 从数据库中获取一条记录,实际得到对应的一个对象
  42. * 注意:不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法!
  43. * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
  44. * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper
  45. * 2、使用 SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName
  46. * 3、不支持级联属性。 JdbcTemplate 只能作为一个 JDBC 的小工具, 而不是 ORM 框架
  47. */
  48. @Test
  49. public void testQueryForObject() {
  50. String sql = "SELECT id, last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE ID = ?";
  51. RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
  52. //在将数据装入对象时需要调用set方法。
  53. Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);
  54. System.out.println(employee);
  55. }
  56. /**
  57. * 一次查询多个对象
  58. * 注意:调用的不是 queryForList 方法
  59. */
  60. @Test
  61. public void testQueryForList() {
  62. String sql = "SELECT id, last_name lastName, email FROM employees WHERE id > ?";
  63. RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
  64. List<Employee> employees = jdbcTemplate.query(sql, rowMapper,5);
  65. System.out.println(employees);
  66. }
  67. /**
  68. * 获取单个列的值或做统计查询
  69. * 使用 queryForObject(String sql, Class<Long> requiredType)
  70. */
  71. @Test
  72. public void testQueryForObject2() {
  73. String sql = "SELECT count(id) FROM employees";
  74. long count = jdbcTemplate.queryForObject(sql, Long.class);
  75. System.out.println(count);
  76. }
  77. }

在实际的使用中,一般会创建一个dao类来封装对某个对象的所有增删改查操作.

比如,创建一个EmployeeDao类如下:

[java] view plain copy
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.jdbc.core.RowMapper;
  5. import org.springframework.stereotype.Repository;
  6. @Repository
  7. public class EmployeeDao {
  8. @Autowired
  9. private JdbcTemplate jdbcTemplate;
  10. public Employee get(Integer id) {
  11. String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?";
  12. RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
  13. Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id);
  14. return employee;
  15. }
  16. }

在这个Dao类中实现了通过id来获取记录并封装成对象返回的方法。如果有需要还可以实现其他操作如插入、删除、更新等。

由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间):

[html] view plain copy
  1. <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>

测试一下EmployeeDao:

[java] view plain copy
  1. @Test
  2. public void testEmployeeDao() {
  3. EmployeeDao employeeDao = (EmployeeDao) ctx.getBean("employeeDao");
  4. Employee employee = employeeDao.get(1);
  5. System.out.println(employee);
  6. }

打印输出如下:

总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。

Spring-jdbc:JdbcTemplate使用简介相关推荐

  1. 使用Spring JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)

    http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...

  2. Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...

    以User为操作对象 package com.swift.jdbc;public class User {private Long user_id; private String user_code; ...

  3. Spring JDBC和JdbcTemplate CRUD与DataSource示例

    Spring JDBC示例和JdbcTemplate CRUD与DataSource示例 Spring JDBC是本教程的主题.数据库是大多数企业应用程序不可或缺的一部分.因此,当谈到Java EE框 ...

  4. Java回顾(十二) File类、Druid连接池、JDBCTemplate(Spring JDBC)、HTML和CSS

    1.File类 1.1.File类概述和构造方法 File:是文件和目录路径名的抽象表示 文件和路径是可以通过File封装为对象的 以下是三种实现的方法,一般来说,用第一种就可以 public cla ...

  5. Spring JDBC,JDBCTemplate对象简化JDBC的开发

    Spring JDBC,JDBCTemplate对象简化JDBC的开发 本篇文章中使用到了Druid数据库连接池,和自己创建的一个配合数据库连接池的工具类,本篇文章对于这些没有进行详细说明,对于这个, ...

  6. Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块

    概述 功能简介 环境准备 构建工具Maven 数据库脚本Oracle 建立工程 类包及Spring配置文件规划 持久层 建立领域对象 用户领域对象 登录日志领域对象 UserDao LoginLogD ...

  7. Spring——DAO层、Spring JDBC、Spring事务控制

    目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...

  8. Spring JDBC的原理与实现

    1.简介 1.1 为什么使用Spring框架中的JDBC? 1.2 使用Spring JDBC需要使用的模板类 2.实现 2.1 准备依赖 <?xml version="1.0&quo ...

  9. Java EE---通过Spring JDBC实现数据库的增、删、改、查

    Spring JDBC之update.query方法 1.项目清单 2.全部代码 2.1.student 2.2.stuDao 2.3.applicationContext.xml 2.4.test ...

  10. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

最新文章

  1. [特征工程系列五]基于蒙特卡洛搜索树的半自动特征工程方案
  2. python基础教程是什么语言-终于懂得python中文入门教程
  3. C#常用类库(100多个)
  4. linux 多线程 多进程同步
  5. 【招聘(深圳)】敢为软件技术有限公司 .Net 工程师
  6. 判断系统是大端还是小段
  7. ES学习笔记之-ClusterState的学习
  8. 常用技巧 —— 位运算 —— 异或运算实现两个数的交换
  9. string 是值类型,还是引用类型(.net)
  10. 携程回应突发故障:「bug已修复」;罗永浩再嘲iPhone11浴霸相机;React 16.10.0发布|极客头条...
  11. re库中group(), groups(), groupdict() 用法
  12. POJ2208 Pyramids 四面体体积
  13. 三种加快计算机启动速度的办法,如何提高开机速度 几种提高开机速度的方法【图文】...
  14. VIT实战总结:非常简单的VIT入门教程,一定不要错过
  15. 【Java】01 初识 Java
  16. iOS 怎么查app的下载量
  17. HCIE课程笔记18-局域网二层技术
  18. 计网homework
  19. 计算机运算和控制核心的简称,计算机的核心是什么
  20. 如何拍一张好看的证件照?

热门文章

  1. html访问虚拟目录路径,IIS7.5虚拟目录物理路径指向共享文件夹详解
  2. 舒尔特注意力训练表格_舒尔特注意力训练,舒尔特方格练习入口
  3. REVERSE-PRACTICE-CTFSHOW-6
  4. 【PAT甲级 - 1028】List Sorting (25分)(模拟,排序)
  5. *【HDU - 6333】Problem B. Harvest of Apples (莫队,逆元,组合数学)(这样预处理正确吗?)
  6. js和php能生成一样的随机数_JavaScript_JS生成某个范围的随机数【四种情况详解】,前言: JS没有现成的函数,能 - phpStudy...
  7. 字符缓冲输入流,高效读取整行数据
  8. 管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】
  9. 《盘点那些秀你一脸的秒天秒地算法》(3)
  10. dp打开思路3:HDU1069 POJ3616 POJ1088