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

作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种

方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  • update方法:update方法用于执行新增、修改、删除等语句;

  • batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;

  • call方法:用于执行存储过程、函数相关语句。

1、首先在数据库新建一张表

CREATE TABLE xwj_user (
id VARCHAR() NOT NULL,
last_name VARCHAR(),
age INT(),
email VARCHAR()
) ENGINE=INNODB DEFAULT CHARSET=utf8

2、在pom.xml文件中,增加依赖

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2..RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2..RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- 获取上下文 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- 连接到mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>

3、在resource下面增加两个配置文件db.properties、applicationContext.xml

  db.properties配置文件:

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://dev.yonyouccs.com:3001/icop-construct-busisubpack initPoolSize=
maxPoolSize=

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

    <!-- 读取配置文件 -->
<context:property-placeholder location="classpath:db.properties" /> <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="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

4、创建一个实体类User

package com.xwj.bean;

public class User {

    private String id;
private String lastName;
private int age;
private String email; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String toString() {
return "User [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age +"] ";
} }

5、创建一个测试类对JdbcTemplate的方法进行测试: 

package com.xwj.util;

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;
import org.springframework.util.CollectionUtils; import com.xwj.bean.User; public class TestJdbc { private ApplicationContext ctx = null;
private JdbcTemplate jdbcTemplate = null; {
ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
} /**
* 执行 INSERT
*/
@Test
public void testInsert() {
String sql = "INSERT INTO xwj_user(id, last_name, age) VALUES(?, ?, ?)";
jdbcTemplate.update(sql, "", "a-xwj", );
} /**
* 执行UPDATE
*/
@Test
public void testUpdate() {
String sql = "UPDATE xwj_user SET last_name = ? WHERE id = ?";
jdbcTemplate.update(sql, "b-xwj", );
} /**
* 执行 DELETE
*/
@Test
public void testDelete() {
String sql = "DELETE from xwj_user WHERE id = ?";
jdbcTemplate.update(sql, );
} /**
* 测试批量更新操作 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个
* List 来存放多个数组。
*/
@Test
public void testBatchUpdate() {
String sql = "INSERT INTO xwj_user(id, last_name, email) VALUES(?, ?, ?)"; List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] { "", "AA", "aa@atguigu.com" });
batchArgs.add(new Object[] { "", "BB", "bb@atguigu.com" });
batchArgs.add(new Object[] { "", "CC", "cc@atguigu.com" });
batchArgs.add(new Object[] { "", "DD", "dd@atguigu.com" }); 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 FROM xwj_user WHERE ID = ?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
// 在将数据装入对象时需要调用set方法。
User user = jdbcTemplate.queryForObject(sql, rowMapper, );
System.out.println(user);
} /**
* 一次查询多个对象
* 注意:调用的不是 queryForList 方法
*/
@Test
public void testQueryForList() {
String sql = "SELECT id, name, email FROM xwj_user WHERE id > ?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
List<User> userList = jdbcTemplate.query(sql, rowMapper, );
if (!CollectionUtils.isEmpty(userList)) {
userList.forEach(user -> {
System.out.println(user);
});
}
} /**
* 获取单个列的值或做统计查询
* 使用 queryForObject(String sql, Class<Long> requiredType)
*/
@Test
public void testQueryForCount() {
String sql = "SELECT count(id) FROM xwj_user";
long count = jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count);
} }

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

  本文源码地址:https://github.com/xuwenjin/xwj_repo/tree/master/springJdbc

  相关资源地址:JdbcTemplate使用简介

           Spring的JDBCTemplate批量更新的性能问题

Spring JdbcTemplate详解的更多相关文章

  1. Spring JdbcTemplate详解(转)

    原文地址:http://www.cnblogs.com/caoyc/p/5630622.html   尊重原创,请访问原文地址 JdbcTemplate简介 Spring对数据库的操作在jdbc上面做 ...

  2. Spring JdbcTemplate详解及项目中的运用

    1.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...

  3. 【转载】Spring JdbcTemplate详解

    JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  4. Spring JdbcTemplate详解(9)

    JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  5. Spring配置文件详解 – applicationContext.xml文件路径

    Spring配置文件详解 – applicationContext.xml文件路径 Java编程                 spring的配置文件applicationContext.xml的默 ...

  6. spring配置文件详解--真的蛮详细

    spring配置文件详解--真的蛮详细   转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...

  7. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  8. J2EE进阶(四)Spring配置文件详解

    J2EE进阶(四)Spring配置文件详解 前言 Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程 ...

  9. Spring RestTemplate详解

    Spring RestTemplate详解   1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...

随机推荐

  1. Abp mvc angular 添加视图

    在LawAndRegulation项目中添加导航路由(Abp添加菜单)对应的客户端页面. 创建文件 客户端页面在Abp模板项目中默认存放在Abp/Main/views文件夹下,在项目中我们创建属于字典 ...

  2. python——回文函数(reversed)

    回文数:正向排列与反向排列所得结果是相等的(即从左到右和从右到左的结果是相等的),例如:“123321”,“0000”等. reversed函数:反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭 ...

  3. NetCore入门篇:(二)Net Core项目创建

    一.新建项目 1.选择菜单:文件 -> 新建 -> 项目 2.选择模板:NET Core -> ASP.NET Core Web 应用程序,输入名称 3.选择框架:ASP.NET C ...

  4. dD Geometry Kernel ( Geometry Kernels) CGAL 4.13 -User Manual

    1 Introduction This part of the reference manual covers the higher-dimensional kernel. The kernel co ...

  5. fedora 国内源

    wget http://mirrors.163.com/.help/fedora-163.repowget http://mirrors.163.com/.help/fedora-updates-16 ...

  6. JavaScript基础DOM介绍和常用操作(5)

    day53 参考:https://www.cnblogs.com/liwenzhou/p/8011504.html JavaScript引入方式 location对象 window.location ...

  7. linux parallel rsync 拷贝N多文件

    先来个对比图看一下, 左边图是普通 rsync 目录拷贝, 右边图是借助 parallel 工具并发起了多个 rsync centos6.5安装 parallel #!/bin/bash # Inst ...

  8. elasticsearch中 refresh 和flush区别

    elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...

  9. elasticsearch 分片(Shards)的理解

    分片重要性 Es中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能.安全和稳定性, 所以很有必要了解一下它. 分片是什么? 简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块, ...

  10. 使用git时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    使用git时,出现Please make sure you have the correct access rights and the repository exists.问题已解决. 今天我在使用 ...