JdbcTemplate详解

1 概述

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

作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。

可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。

2 环境准备

2.1 导入JAR包

①IOC容器所需要的JAR包

commons-logging-1.1.1.jar

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

②JdbcTemplate所需要的JAR包

spring-jdbc-4.0.0.RELEASE.jar

spring-orm-4.0.0.RELEASE.jar

spring-tx-4.0.0.RELEASE.jar

③数据库驱动和数据源

​ c3p0-0.9.1.2.jar

​ mysql-connector-java-5.1.7-bin.jar

2.2 创建连接数据库基本信息属性文件

user=root
password=root
jdbcUrl=jdbc:mysql:///query_data
driverClass=com.mysql.jdbc.Driver 
initialPoolSize=30
minPoolSize=10
maxPoolSize=100
acquireIncrement=5
maxStatements=1000
maxStatementsPerConnection=10

2.3 在Spring配置文件中配置相关的bean

①数据源对象

<context:property-placeholder location="classpath:jdbc.properties"/><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${user}"/><property name="password" value="${password}"/><property name="jdbcUrl" value="${jdbcUrl}"/><property name="driverClass" value="${driverClass}"/><property name="initialPoolSize" value="${initialPoolSize}"/><property name="minPoolSize" value="${minPoolSize}"/><property name="maxPoolSize" value="${maxPoolSize}"/><property name="acquireIncrement" value="${acquireIncrement}"/><property name="maxStatements" value="${maxStatements}"/><property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}"/>
</bean>

②JdbcTemplate对象

<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>
</bean>

3 持久化操作

3.1 增删改

JdbcTemplate.update(String, Object…)

3.2 批量增删改

JdbcTemplate.batchUpdate(String, List<Object[]>)

​ Object[]封装了SQL语句每一次执行时所需要的参数

​ List集合封装了SQL语句多次执行时的所有参数

3.3 查询单行

JdbcTemplate.queryForObject(String, RowMapper<Department>, Object…)

img

3.4 查询多行

JdbcTemplate.query(String, RowMapper<Department>, Object…)

RowMapper对象依然可以使用BeanPropertyRowMapper

3.5 查询单一值

JdbcTemplate.queryForObject(String, Class, Object…)

4 使用具名参数的JdbcTemplate

4.1 关于具名参数

在Hibernate的HQL查询中我们体验过具名参数的使用,相对于基于位置的参数,具名参数具有更好的可维护性,在SQL语句中参数较多时可以考虑使用具名参数。

在Spring中可以通过NamedParameterJdbcTemplate类的对象使用带有具名参数的SQL语句。

4.2 通过IOC容器创建NamedParameterJdbcTemplate对象

<!-- 配置可以使用具名参数的JDBCTemplate类对象 -->
<bean id="namedTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><!-- 没有无参构造器,必须传入数据源或JdbcTemplate对象 --><constructor-arg ref="dataSource"/>
</bean>

4.3 具名参数在SQL语句中的格式

INSERT INTO depts (dept_name) VALUES (:deptName)

4.4 具名参数传入

①通过Map对象传入

NamedParameterJdbcTemplate.update(String, Map<String, ?>)

Map的键是参数名,值是参数值

②通过SqlParameterSource对象传入

img

String sql = "INSERT INTO depts (dept_name) VALUES (:deptName)";
Department department = new Department(null, "YYY", null);
SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(department);
namedTemplate.update(sql, sqlParameterSource);

5 使用JdbcTemplate实现Dao

5.1 通过IOC容器自动注入

JdbcTemplate类是线程安全的,所以可以在IOC容器中声明它的单个实例,并将这个实例注入到所有的Dao实例中。

@Repository
public class EmployeeDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public Employee get(Integer id){//…}
}

5.2 扩展JdbcDaoSupport类

/*** 不推荐*/
@Repository
public class DepartmentDao extends JdbcDaoSupport{@Autowiredpublic void setDataSource2(DataSource dataSource){//父类提供的setDataSource()方法是final修饰的,不能通过覆盖的方式注入dataSourcesetDataSource(dataSource);}public Department get(Integer id){String sql = "SELECT id, dept_name name FROM departments WHERE id = ?";RowMapper<Department> rowMapper = new BeanPropertyRowMapper<>(Department.class);return getJdbcTemplate().queryForObject(sql, rowMapper, id);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装Docker的多版本PHP和多版本MySQL共存

1: 先安装docker 安装完后执行,权限设置 sudo usermod -aG docker $USER或者sudo usermod -aG docker kentrl#添加当前用户到Docker用户组中 sudo newgrp docker#更新用户组数据,必须执行否则无效 sudo systemctl restart docker 先看目录结构: 2:按照目录结构挂载磁盘,…

探究C++20协程(6)——实现协程之间消息传递

之前主要关注的是协程与外部调用者的交互&#xff0c;这次也关注一下对等的协程之间的通信。 实现目标 在C中实现协程的Channel相对复杂&#xff0c;因为C标准库中并没有内置的协程间通信机制。C20引入了协程支持&#xff0c;但主要提供了底层的协程操作&#xff0c;如协程的…

反序列bit

#include <stdio.h> #include <stdint.h> #include <stdbool.h> // 定义描述反序列化信息的结构体 typedef struct { const uint32_t *data; // 数据数组 int num_elements; // 数据数组的元素数量 int bit_position; // 当前位偏移量&#xff08;以位为单位…

程序员学习编程新方式:【YDUIbuilder】,让技术触手可及!

想象一下&#xff0c;构建#软件# 就像搭积木一样简单有趣&#xff01;[#YDUIbuilder]#开源项目# 低代码平台&#xff0c;将这一梦想变为现实。这里&#xff0c;创新不再是#程序猿# 的专利&#xff0c;而是每个人的超能力&#xff01; 来[YDUIbuilder]&#xff0c;你将体验到&am…

System1和System2

System 1 和 System 2 是心理学家丹尼尔卡尼曼(Daniel Kahneman)在其著作《快思慢想》(Thinking, Fast and Slow)中描述的两种思维模式。这两个系统代表我们大脑处理信息和做决策的不同方式。 System 1(系统1) 这是我们的“快速思考”系统。它是无意识的、直觉的、自动…

【Qt常用控件】—— QWidget 核心属性

目录 &#xff08;一&#xff09;控件概述 1.1 关于控件体系的发展 &#xff08;二&#xff09;QWidget 核心属性 2.1 核心属性概览 2.2 enabled 2.3 geometry 2.4 windowTitle 2.5 windowIcon 2.6 windowOpacity 2.7 cursor 2.8 font 2.9 toolTip 2.10 focus…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

怎么办xgp会员一年多少钱xgp会员怎么开轻松教你xgp会员开通教程

怎么办&#xff1f;xgp会员一年多少钱&#xff1f;xgp会员怎么开&#xff1f;轻松教你xgp会员开通教程 XGP平台是由微软公司开发的xbox游戏平台的pc版本&#xff0c;为电脑玩家提供了一个游玩微软游戏的平台&#xff0c;XGP平台因其独特的会员服务而广受玩家们好评&#xff0…

git log 和git reflog命令的区别是什么

git log和git reflog是Git中用于查看仓库历史的两个不同命令&#xff0c;它们各自有不同的用途和显示的信息。 git log git log命令用于显示当前分支的提交历史。它会列出每次提交的SHA-1哈希、作者信息、提交日期和提交信息等。git log提供了许多选项来定制输出的历史记录&a…

《深度学习在医学图像分析中的应用(第二版)》

书籍&#xff1a;Deep Learning for Medical Image Analysis, 2nd Edition 作者&#xff1a;S. Kevin Zhou&#xff0c;Hayit Greenspan&#xff0c;Dinggang Shen 出版&#xff1a;Academic Press书籍下载-《深度学习在医学图像分析中的应用&#xff08;第二版&#xff09;》本…

采用php vue2 开发的一套医院安全(不良)事件管理系统源码(可自动生成鱼骨图)

采用php vue2 开发的一套医院安全&#xff08;不良&#xff09;事件管理系统源码&#xff08;可自动生成鱼骨图&#xff09; 医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;以事件…

Linux开发板配置静态IP

1、查看网口信息&#xff0c;易知eth0无IP地址 ifconfig2、首先分配一个IP地址 sudo ifconfig eth0 192.168.5.8 up3、此时配置的IP地址只是临时的&#xff0c;当你reboot重启板子上电后&#xff0c;ip地址会消失&#xff0c;因此需要为板子配置静态ip&#xff0c;避免每次上…

快速排序算法(Python版)

1、什么是快速排序算法 快速排序&#xff08;Quick Sort&#xff09;是一种经典的排序算法&#xff0c;属于比较排序的一种。它的基本思想是通过分治的策略将原始的无序序列划分成较小的子序列&#xff0c;然后分别对这些子序列进行排序&#xff0c;最终合并得到有序的序列。 …

【prometheus学习过程】

目录 一、linux服务器监控常用的监控指标 二、监控docker1、使用CAdvisor2.配置prometheus采集docker的样本数据3.添加触发器3.添加触发器 三、监控MySQL容器1.创建普通用户向数据库授予权限2.Docker部署部署MySQLD Exporter二进制安装mysqld-exporter 四、进程监控1、process …

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

System.Exception有哪些类型分别什么意思

在C#中&#xff0c;System.Exception 类是所有异常类的基类。它是处理错误和异常情况的基础。当程序执行期间发生错误时&#xff0c;通常会抛出&#xff08;throw&#xff09;一个异常对象。这个对象随后被捕获&#xff08;catch&#xff09;并处理&#xff0c;或者如果没有被捕…

【window环境、Linux环境、QT三种方法实现TCP通信】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Windows环境下实现TCP通信1.服务器2.客户端3.运行 二、Linux环境下实现TCP通信1.服务端2.客户端 三、Qt实现TCP通信1.服务端1.客户端 总结 前言 大多数项目…

datax与多种数据库间数据类型映射

文章目录 前言一、背景二、映射HiveHBaseMongoDBOraclePostgreSQLSqlServerMysqlODPSOSS 总结 前言 datax内置的enumType数据类型与不同数据库间都有些差异&#xff0c;本文整理出相应的映射关系&#xff0c;在配置自定义json时可以参考做一些类型转换 一、背景 DataX 是阿里…

告别SQL注入攻击之扰!揭秘强大防护策略,筑牢网站安全防线,畅享无忧体验!

SQL注入攻击是一种极具破坏性的Web漏洞&#xff0c;它利用应用程序对用户输入的处理不当&#xff0c;让恶意用户能够执行非授权的SQL查询&#xff0c;进而对数据库造成巨大损害。这种攻击方式可能导致数据泄露、系统崩溃等严重后果&#xff0c;因此必须引起高度重视。 为了有效…

(二)小程序学习笔记——初识:标签、数据绑定、指令介绍

1、rpx&#xff1a;是微信小程序的自适应的单位&#xff0c;根据不同设备的屏幕宽度进行自适应缩放。 2、小程序规定任何型号的手机的屏幕宽度都为 750rpx。 3、小程序中常用的组件&#xff1a;view、swiper&#xff08;滑块视图容器—轮播图的盒子&#xff09;和swipe-item&…