4 - JdbcTemplate

spring 框架如何处理对数据库的操作呢?

1. 基本介绍

文档:JdbcTemplate APIs : /spring-framework-5.3.8/docs/javadoc-api/index.html

JdbcTemplate 是 Spring 提供的访问数据库的技术。可以将 JDBC 的常用操作封装为模板方法

已经提供了特别多的 API  


2. 使用实例 

2.1 JdbcTemplate 使用准备

1)创建数据库及表

-- 创建数据库
CREATE DATABASE spring
USE spring
-- 创建表 monster
CREATE TABLE monster(
id INT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',
skill VARCHAR(64) NOT NULL DEFAULT ''
)CHARSET=utf8
INSERT INTO monster VALUES(100, '青牛怪', '吐火');
INSERT INTO monster VALUES(200, '黄袍怪', '吐烟');
INSERT INTO monster VALUES(300, '蜘蛛怪', '吐丝');

2)配置 src/jdbc.properties

jdbc.userName=root
jdbc.password=hsp
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring

3)配置文件 src/JdbcTemplate_ioc.xml

<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.userName}"></property><property name="password" value="${jdbc.password}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>

配置 JdbcTemplate_ioc.xml,将数据源分配给 JdbcTemplate bean

<!-- 配置 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 将上面的数据源分配给 jdbcTemplate --><property name="dataSource" ref="dataSource"/>
</bean>

2.2 测试

1)添加一个新的 monster

@Test
public void addDataByJdbcTemplate() {ApplicationContext ioc = newClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate bean = ioc.getBean(JdbcTemplate.class);// 1. 添加方式 1// String sql = "INSERT INTO monster VALUES(400, '红孩儿', '枪法厉害')";// bean.execute(sql);//2. 添加方式 2, 绑定参数String sql = "INSERT INTO monster VALUES(?, ?, ?)";int affected = bean.update(sql, 700, "红孩儿 2", "枪法厉害 2");System.out.println("add ok affected= " + affected);
}

2)更新一个 monster 的 skill

@Test
public void updateDataByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate bean = ioc.getBean(JdbcTemplate.class);String sql = "UPDATE monster SET skill = ? WHERE id=?";int affected = bean.update(sql, "美女计", 300);System.out.println("affected= " + affected);
}

3)批量添加二个 monster

@Test
public void addBatchDataByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);//添加..String sql = "INSERT INTO monster VALUES(?, ?, ?)";List<Object[]> param_list = new ArrayList<Object[]>();param_list.add(new Object[]{500, "白蛇精", "skill1"});param_list.add(new Object[]{600, "青蛇精", "skill2"});bean.batchUpdate(sql, param_list);System.out.println("batch add ok");
}

4)查询单个 monster 并封装到 Monster 实体对象

@Test
public void selectDataByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate bean = ioc.getBean(JdbcTemplate.class);String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id =?";//下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<Monster>(Monster.class);Monster monster = bean.queryForObject(sql, rowMapper, 100);System.out.println("monster= " + monster);
}

5)查询多个 monster 并封装实体对象

@Test
public void selectMulDataByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate bean = ioc.getBean(JdbcTemplate.class);String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id >=?";//下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<Monster>(Monster.class);List<Monster> monster_list = bean.query(sql, rowMapper, 200);for (Monster monster : monster_list) {System.out.println(monster);}
}

6)查询返回结果只有一行一列

@Test
public void selectScalarByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate bean = ioc.getBean(JdbcTemplate.class);String sql = "SELECT name FROM monster WHERE id =100";String name = bean.queryForObject(sql, String.class);System.out.println(name);
}

7)使用 Map 传入具名参数完成操作

src\JdbcTemplate_ioc.xml, 增加配置

<!-- 配置 NamedParameterJdbcTemplate,支持具名参数 -->
<bean id="namedParameterJdbcTemplate"class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><!-- 这里需要使用构造器关联数据源 --><constructor-arg name="dataSource" ref="dataSource"/>
</bean>

测试:使用 Map 传入具名参数完成操作

注:sql 语句里的属性名,要和 map_parameter 的 key 保持一致

@Test
public void testDataByNamedParameterJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 NamedParameterJdbcTemplate beanNamedParameterJdbcTemplate namedParameterJdbcTemplate =ioc.getBean(NamedParameterJdbcTemplate.class);String sql = "INSERT INTO monster VALUES(:my_id, :name, :skill)";Map<String, Object> map_parameter = new HashMap<String, Object>();map_parameter.put("my_id", 800);map_parameter.put("name", "螃蟹精");map_parameter.put("skill", "钳子无敌大法");namedParameterJdbcTemplate.update(sql, map_parameter);System.out.println("add data ok~");
}

8)使用 sqlparametersoruce 来封装具名参数、

注:这里的 sql 里的属性名称,要和 Monster bean 的属性名保持一致

@Test
public void operDataBySqlparametersoruce() {ApplicationContext ioc = new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 NamedParameterJdbcTemplate beanNamedParameterJdbcTemplate namedParameterJdbcTemplate =ioc.getBean(NamedParameterJdbcTemplate.class);String sql = "INSERT INTO monster VALUES(:monsterId, :name, :skill)";Monster monster = new Monster(900, "狐狸精", "狐媚之术");SqlParameterSource source = new BeanPropertySqlParameterSource(monster);namedParameterJdbcTemplate.update(sql, source);System.out.println("add ok~");
}

2.3 Dao 对象中使用 JdbcTemplate 

1)创建对象

MonsterDao.java

@Repository
public class MonsterDao {@Autowiredprivate JdbcTemplate jdbcTemplate;//添加 monsterpublic void save(Monster monster) {String sql = "INSERT INTO monster VALUES(?, ?, ?)";jdbcTemplate.update(sql, monster.getMonsterId(),monster.getName(), monster.getSkill());}
}

2)修改 \src\JdbcTemplate_ioc.xml

<!-- 加入自动扫描包 -->
<context:component-scan base-package="com.hspedu.spring.jdbctemplate.dao"/>

3)测试

@Test
public void operDataByDao() {ApplicationContext ioc =new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");MonsterDao bean = ioc.getBean(MonsterDao.class);Monster monster = new Monster(1000, "大虾精", "夹子功");bean.save(monster);
}

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

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

相关文章

Linux网络文件共享服务之FTP协议

目录 一、存储类型 1、直连式存储&#xff08;DAS&#xff09; 2、存储区域网络&#xff08;SAN&#xff09; 3、网络附加存储&#xff08;NAS&#xff09; 二、 FTP文件传输协议 1、FTP协议的工作原理 1.1 FTP协议的工作流程 1.2 FTP协议的两种工作模式 1.2.1 主动模…

flutter报错Cannot hit test a render box that has never been laid out

出现这个问题的原因可能是因为你把一个ListView或者GridView放到了一个没有设置大小的容器里面导致的&#xff0c;所以意思是不能渲染那一个没有布局过的容器。我这里遇到的错误是因为我把GridView放到了一个Container里面&#xff0c;并且我没有设置Container宽高。 就导致了那…

嵌入式工作岗位未来会不会越来越少?

今日话题&#xff0c;嵌入式工作岗位未来会不会越来越少&#xff1f;未来的嵌入式岗位机会将会逐渐增多&#xff0c;因为嵌入式技术是万物互联的基础&#xff0c;从智能手表到智能汽车&#xff0c;嵌入式都扮演着关键角色。虽然相比计算机科学CS&#xff0c;嵌入式领域的天花板…

中间件框架知识进阶

概述 近期从不同渠道了解到了一些中间件相关的新的知识&#xff0c;记录一下收获。涉及到的中间件包括RPC调用、动态配置中心、MQ、缓存、数据库、限流等&#xff0c;通过对比加深理解&#xff0c;方便实际应用时候更明确如何进行设计和技术选型。 一、RPC框架中间件系列 1、…

华清远见作业第二十七天——网络编程(第二天)

思维导图&#xff1a; 在虚拟机实现客户端控制机械臂 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <a.h> #define SER_PORT 8888 //服务端口 #d…

SpringBoot 启动优化实践!

背景 公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓慢&#xff0c;常常需要 6-7 分钟才能暴露端口&#xff0c;严重降低开发效率。通过 SpringBoot 的 SpringApplicationRunListener 、BeanPostProcessor 原理和源码调试等手段排查发现&#xff0c;在 Bean 扫描…

Linux安装Rdkafka PHP 扩展(Kafka使用教程)

以是centos为例 #可以查看php版本 php -v#查看php安装的扩展库 php -m 1、首先&#xff0c;确保你已经安装了 PHP 和相关的开发工具。你可以使用以下命令来安装它们&#xff1a; sudo yum install php-devel 中间会问你是否ok&#xff0c;输入y回车&#xff0c;出现complete…

pycharm debug显示的变量过多

问题&#xff1a; https://blog.csdn.net/Hodors/article/details/117535731 解决方法&#xff1a; 把"Show console variables by default"前面的勾取消掉就行 参考&#xff1a; https://stackoverflow.com/questions/48969556/hide-console-variables-in-pychar…

数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q

目录 二叉树的定义&#xff1a; *特殊的二叉树&#xff1a; 二叉树的性质&#xff1a; 二叉树的声明&#xff1a; 二叉树的先序遍历&#xff1a; 二叉树的中序遍历&#xff1a; 二叉树的后序遍历&#xff1a; 二叉树的层序遍历&#xff1a; 二叉树的节点个数&#xff1a; 二叉…

使用netdxf(C#)框架实现dxf文件读取与导出坐标

使用netdxf&#xff08;C#&#xff09;框架实现dxf文件读取与导出坐标 一、新建窗体应用程序DxfToolDemo&#xff0c;将默认的Form1重命名为FormDxfTool 窗体FormDxfTool.Designer.cs设计器源程序如下&#xff1a; namespace DxfToolDemo {partial class FormDxfTool{/// <…

x-cmd pkg | magic-wormhole - (魔法虫洞)文件传输工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 magic-wormhole 是一个用于在两台计算机之间安全传输文件的工具。它通过创建一个临时的点对点连接&#xff0c;允许用户将文件或文本从一台计算机发送到另一台计算机。 它使用 PAKE 这一系列的加密算法&#xff0c;通…

扫地机行业研究:预计2028年将达到78.51亿美元

吸尘器、扫地机器人、洗地机为清洁电器中最亮眼的三大品类。吸尘器主要用来吸尘&#xff0c;扫地机的主要作用也是用于除尘&#xff0c;具备扫拖一体功能的扫地机&#xff0c;干湿混合垃圾暂时做不到干净清理。洗地机集齐了“吸、拖、洗”三种功能为一体&#xff0c;并且具备自…

消息队列-RockMQ-定时延时发送消息

定时延时发送消息 任务需要延迟一段时间再进行处理。 生产者 public class Producer {public static void main(String[] args) throws Exception {DefaultMQProducer producer new DefaultMQProducer("producer_group");producer.setNamesrvAddr("ip:9876&q…

【Python 数据分析】数据预处理:z-score 标准化、min-max 归一化、数据缺失值处理、数据重复处理

目录 简述 / 前言1. z-score 标准化2. min-max 归一化3. 数据缺失值处理4. 数据重复处理 简述 / 前言 本篇文章分享数据分析中最重要的一个步骤&#xff1a;数据预处理。我们在做数据分析之前&#xff0c;都需要采集很多数据&#xff0c;这些数据可能是从官网下载的&#xff0…

【docker-compose】【nginx】内网环境https配置

目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上&#xff0c;新建cert目录&#xff0c;执行以下指令&#xff0c;然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…

linux yum仓库

yum是基于rpm包构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 常用命令 查询 yum list [软件名] 显示可用的安装包&#xff0c;如果不加软件名则显示所有的可用包 yum info [软件名] 显示安装包的详细信息 如果不加软件名是显示所有包…

2024年【上海市安全员B证】考试试卷及上海市安全员B证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证考试试卷根据新上海市安全员B证考试大纲要求&#xff0c;安全生产模拟考试一点通将上海市安全员B证模拟考试试题进行汇编&#xff0c;组成一套上海市安全员B证全真模拟考试试题&#xff0c;学员可通过…

海外短剧APP小程序开发 随心随意畅享大片

随着智能手机的普及和网络的高速发展&#xff0c;短剧APP已经成为当今热门的观影方式。作为一种全新的观影体验&#xff0c;海外短剧APP以其丰富多样的内容吸引了大量用户。本文将为您介绍海外短剧APP开发的相关知识和其所带来的优势&#xff0c;以及市场前景和发展趋势。 海外…

jsonschema,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - jsonschema。 Github地址&#xff1a;https://github.com/python-jsonschema/jsonschema JSON&#xff08;JavaScript Object Notation&#xff09;是…

MySQL 多版本并发控制 MVCC

MVCC出现背景 事务的4个隔离级别以及对应的三种异常 读未提交&#xff08;Read uncommitted&#xff09; 读已提交&#xff08;Read committed&#xff09;&#xff1a;脏读 可重复读&#xff08;Repeatable read&#xff09;&#xff1a;不可重复读 串行化&#xff08;Se…