Spring JdbcTemplate

文章源码

JdbcTemplate 概述

它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。Spring 框架提供了很多的操作模板类。

操作关系型数据的:JdbcTemplate、HibernateTemplate

操作 NoSQL 数据库的:RedisTemplate

操作消息队列的:JmsTemplate

要使用 JdbcTemplate,需要 spring-jdbc 包。

JdbcTemplate CRUD

bean.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="cn.parzulpan"/> <!-- 添加继承 JdbcDaoSupport 的实现类到容器,并注入 jdbcTemplate-->
<bean id="accountDAO2" class="cn.parzulpan.dao.AccountDAOImpl2">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springT?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean> </beans>

JdbcTemplate 对象的创建和基本使用:

package cn.parzulpan;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate; /**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : JdbcTemplate 对象的创建和基本使用
*/ public class JdbcTemplateTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
JdbcTemplate jt = ac.getBean("jdbcTemplate", JdbcTemplate.class);
jt.execute("insert into bankAccount(name, money) values ('caf', 25415.6)");
}
}

AccountDAOImpl.java

package cn.parzulpan.dao;

import domain.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; import javax.annotation.Resource;
import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 账户持久层实现类,这种方式即可以实现注解配置,也可以使用 xml 配置
*/ @Repository("accountDAO")
public class AccountDAOImpl implements AccountDAO {
@Resource(name = "jdbcTemplate")
JdbcTemplate jdbcTemplate; @Override
public List<Account> findAll() {
return jdbcTemplate.query("select * from bankAccount",
new BeanPropertyRowMapper<>(Account.class));
} @Override
public Account findById(Integer id) {
List<Account> accounts = jdbcTemplate.query("select * from bankAccount where id = ?",
new BeanPropertyRowMapper<>(Account.class),
id);
return accounts.isEmpty() ? null : accounts.get(0);
} @Override
public Account findByName(String name) {
List<Account> accounts = jdbcTemplate.query("select * from bankAccount where name = ?",
new BeanPropertyRowMapper<>(Account.class),
name);
if (accounts.isEmpty()) {
return null;
} if (accounts.size() > 1) {
throw new RuntimeException("结果集不唯一!");
} return accounts.get(0);
} @Override
public void update(Account account) {
jdbcTemplate.update("update bankAccount set name = ? , money = ? where id = ?",
account.getName(), account.getMoney(), account.getId());
} @Override
public void insert(Account account) {
jdbcTemplate.update("insert into bankAccount(name, money) values (?, ?)",
account.getName(), account.getMoney());
} @Override
public void delete(Integer id) {
jdbcTemplate.update("delete from bankAccount where id = ?",
id);
} @Override
public Long getCount() {
return jdbcTemplate.queryForObject("select count(*) from bankAccount;",
Long.class);
}
}

AccountDAOImpl2.java

package cn.parzulpan.dao;

import domain.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository; import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 账户持久层实现类,继承 JdbcDaoSupport
*
* JdbcDaoSupport 是 Spring 框架提供的一个类,该类中定义了一个 JdbcTemplate 对象,
* 可以直接获取使用,但是要想创建该对象,需要为其提供一个数据源。
*
* 这种的好处是当有很多个 DAO 时,不需要注入很多 jdbcTemplate
*
* 注意:这种方式只能使用 xml 配置,因为 JdbcDaoSupport 中已经定义了 jdbcTemplate,且提供其 setter
*/ public class AccountDAOImpl2 extends JdbcDaoSupport implements AccountDAO {
@Override
public List<Account> findAll() {
return super.getJdbcTemplate().query("select * from bankAccount",
new BeanPropertyRowMapper<>(Account.class));
} @Override
public Account findById(Integer id) {
List<Account> accounts = getJdbcTemplate().query("select * from bankAccount where id = ?",
new BeanPropertyRowMapper<>(Account.class),
id);
return accounts.isEmpty() ? null : accounts.get(0);
} @Override
public Account findByName(String name) {
List<Account> accounts = getJdbcTemplate().query("select * from bankAccount where name = ?",
new BeanPropertyRowMapper<>(Account.class),
name);
if (accounts.isEmpty()) {
return null;
} if (accounts.size() > 1) {
throw new RuntimeException("结果集不唯一!");
} return accounts.get(0);
} @Override
public void update(Account account) {
getJdbcTemplate().update("update bankAccount set name = ? , money = ? where id = ?",
account.getName(), account.getMoney(), account.getId());
} @Override
public void insert(Account account) {
getJdbcTemplate().update("insert into bankAccount(name, money) values (?, ?)",
account.getName(), account.getMoney());
} @Override
public void delete(Integer id) {
getJdbcTemplate().update("delete from bankAccount where id = ?",
id);
} @Override
public Long getCount() {
return getJdbcTemplate().queryForObject("select count(*) from bankAccount;",
Long.class);
}
}

AccountDAOImplTest.java

package cn.parzulpan.dao;

import domain.Account;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; /**
* @Author : parzulpan
* @Time : 2020-12
* @Desc : 账户持久层实现类的测试
*/ public class AccountDAOImplTest {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
// AccountDAO ad = ac.getBean("accountDAO1", AccountDAO.class);
AccountDAO ad = ac.getBean("accountDAO2", AccountDAO.class); @Test
public void findAll() {
List<Account> accounts = ad.findAll();
for (Account account : accounts) {
System.out.println(account);
}
} @Test
public void findById() {
Account account = ad.findById(1);
System.out.println(account);
} @Test
public void findByName() {
Account account = ad.findByName("aaa");
System.out.println(account);
} @Test
public void update() {
ad.update(new Account(6, "update", 214.0));
} @Test
public void insert() {
ad.insert(new Account(99, "insert", 3125616.425));
} @Test
public void delete() {
ad.delete(7);
} @Test
public void getCount() {
Long count = ad.getCount();
System.out.println(count);
}
}

总结和练习

【Spring】Spring JdbcTemplate的更多相关文章

  1. 【转】spring - ioc和aop

    [转]spring - ioc和aop 1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对 ...

  2. 【Spring】Spring随笔索引

    Spring随笔索引 [Spring]Spring bean的实例化 [Spring]手写Spring MVC [Spring]Spring Data JPA

  3. 【转】Spring总结以及在面试中的一些问题

    [转]Spring总结以及在面试中的一些问题. 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建 ...

  4. 【转】Spring学习---Spring IoC容器的核心原理

    [原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...

  5. 【原】Spring整合Redis(第二篇)—SDR环境搭建具体步骤

    [环境参数] Spring版本:4.2.6.RELEASESpring-Data-Redis版本:1.7.2.RELEASE Redis版本:redis-2.4.5-win32-win64 [简要说明 ...

  6. 【转】Spring中事务与aop的先后顺序问题

    [原文链接] http://my.oschina.net/HuifengWang/blog/304188 [正文] Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候,会遇到跟sp ...

  7. 【目录】Spring 源码学习

    [目录]Spring 源码学习 jwfy 关注 2018.01.31 19:57* 字数 896 阅读 152评论 0喜欢 9 用来记录自己学习spring源码的一些心得和体会以及相关功能的实现原理, ...

  8. 【进阶】Spring中的注解与反射

    [进阶]Spring中的注解与反射 目录 [进阶]Spring中的注解与反射 前言 一.内置(常用)注解 1.1@Overrode 1.2@RequestMapping 1.3@RequestBody ...

  9. 【转载】Spring JdbcTemplate详解

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

  10. 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析

    Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...

随机推荐

  1. Codeforces Edu Round 52 A-E

    A. Vasya and Chocolate 模拟题.数据会爆\(int\),要开\(long\) \(long\) #include <iostream> #include <cs ...

  2. LibreOj-10012-「一本通-1-2-例-2」Best-Cow-Fences

    题目地址 思路 二分平均值,区间为$0$~$2000$.将每个$a[i]$减去平均值,就只用考虑字段和是否$>=0$了. 关于计算子段和,可以使用前缀和表示,$sum[i]$表示前$i$个数的和 ...

  3. 深入理解Java虚拟机(八)——类加载机制

    是什么是类加载机制 Java虚拟机将class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制. 类的生命周期 一个类从加载到内存 ...

  4. 关于 SFML 在 Visual Studio下的环境搭建

    SFML 全称 Simple and Fast Multimedia Library,它是一个开放源代码,跨平台,支持多种编程语言绑定,并且提供简单易用的接口,用于多媒体程序和游戏开发,是替代SDL的 ...

  5. qq获取验证码接口

    测试 获取验证码 import smtplib from email.mime.text import MIMEText from email.utils import formataddr #定义参 ...

  6. NMO not setuid-root (Unix-only)

    EM操作Reorganize Objects时提示的错误 错误提示: NMO not setuid-root (Unix-only) 解决方法: 1.停止EM emctl stop dbconsole ...

  7. 一文带你彻底了解大数据处理引擎Flink内存管理

    摘要: Flink是jvm之上的大数据处理引擎. Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低.full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性.同 ...

  8. vue中的样式绑定

    样式绑定 样式绑定有class绑定和style绑定,这里我们分别说说 class绑定 class样式绑定与有两种语法:对象语法(v-bind:class='{active:isActive}').数组 ...

  9. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  10. Web服务器-并发服务器-多进程(3.4.1)

    @ 目录 1.优化分析 2.代码 3. 关于作者 1.优化分析 在单进程的时候,相当于 是来一个客户,派一个人去服务一下 效率低,现在使用多进程来服务 假设场景 100个人同时访问页面 单进程:一次处 ...