Spring-jdbc:JdbcTemplate使用简介
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.
作为 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 JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)
http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...
- Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
以User为操作对象 package com.swift.jdbc;public class User {private Long user_id; private String user_code; ...
- Spring JDBC和JdbcTemplate CRUD与DataSource示例
Spring JDBC示例和JdbcTemplate CRUD与DataSource示例 Spring JDBC是本教程的主题.数据库是大多数企业应用程序不可或缺的一部分.因此,当谈到Java EE框 ...
- Java回顾(十二) File类、Druid连接池、JDBCTemplate(Spring JDBC)、HTML和CSS
1.File类 1.1.File类概述和构造方法 File:是文件和目录路径名的抽象表示 文件和路径是可以通过File封装为对象的 以下是三种实现的方法,一般来说,用第一种就可以 public cla ...
- Spring JDBC,JDBCTemplate对象简化JDBC的开发
Spring JDBC,JDBCTemplate对象简化JDBC的开发 本篇文章中使用到了Druid数据库连接池,和自己创建的一个配合数据库连接池的工具类,本篇文章对于这些没有进行详细说明,对于这个, ...
- Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块
概述 功能简介 环境准备 构建工具Maven 数据库脚本Oracle 建立工程 类包及Spring配置文件规划 持久层 建立领域对象 用户领域对象 登录日志领域对象 UserDao LoginLogD ...
- Spring——DAO层、Spring JDBC、Spring事务控制
目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...
- Spring JDBC的原理与实现
1.简介 1.1 为什么使用Spring框架中的JDBC? 1.2 使用Spring JDBC需要使用的模板类 2.实现 2.1 准备依赖 <?xml version="1.0&quo ...
- Java EE---通过Spring JDBC实现数据库的增、删、改、查
Spring JDBC之update.query方法 1.项目清单 2.全部代码 2.1.student 2.2.stuDao 2.3.applicationContext.xml 2.4.test ...
- Spring JDBC详解
<Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...
最新文章
- [特征工程系列五]基于蒙特卡洛搜索树的半自动特征工程方案
- python基础教程是什么语言-终于懂得python中文入门教程
- C#常用类库(100多个)
- linux 多线程 多进程同步
- 【招聘(深圳)】敢为软件技术有限公司 .Net 工程师
- 判断系统是大端还是小段
- ES学习笔记之-ClusterState的学习
- 常用技巧 —— 位运算 —— 异或运算实现两个数的交换
- string 是值类型,还是引用类型(.net)
- 携程回应突发故障:「bug已修复」;罗永浩再嘲iPhone11浴霸相机;React 16.10.0发布|极客头条...
- re库中group(), groups(), groupdict() 用法
- POJ2208 Pyramids 四面体体积
- 三种加快计算机启动速度的办法,如何提高开机速度 几种提高开机速度的方法【图文】...
- VIT实战总结:非常简单的VIT入门教程,一定不要错过
- 【Java】01 初识 Java
- iOS 怎么查app的下载量
- HCIE课程笔记18-局域网二层技术
- 计网homework
- 计算机运算和控制核心的简称,计算机的核心是什么
- 如何拍一张好看的证件照?
热门文章
- html访问虚拟目录路径,IIS7.5虚拟目录物理路径指向共享文件夹详解
- 舒尔特注意力训练表格_舒尔特注意力训练,舒尔特方格练习入口
- REVERSE-PRACTICE-CTFSHOW-6
- 【PAT甲级 - 1028】List Sorting (25分)(模拟,排序)
- *【HDU - 6333】Problem B. Harvest of Apples (莫队,逆元,组合数学)(这样预处理正确吗?)
- js和php能生成一样的随机数_JavaScript_JS生成某个范围的随机数【四种情况详解】,前言:
JS没有现成的函数,能 - phpStudy...
- 字符缓冲输入流,高效读取整行数据
- 管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】
- 《盘点那些秀你一脸的秒天秒地算法》(3)
- dp打开思路3:HDU1069 POJ3616 POJ1088