4 - JdbcTemplate

news2024/11/15 9:17:41

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 = new
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate 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 bean
    JdbcTemplate 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 bean
    JdbcTemplate 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 bean
    JdbcTemplate 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 bean
    JdbcTemplate 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 bean
    NamedParameterJdbcTemplate 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 bean
    NamedParameterJdbcTemplate 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 {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    //添加 monster
    public 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.coloradmin.cn/o/1387668.html

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

相关文章

说一说文件转换服务的系统设计

一、背景 我们需要把word/ppt转换为pdf&#xff0c;刚开始自研&#xff0c;后改为和第三方服务合作。 因为涉及到第三方服务的源码及软件著作的安全问题&#xff0c;我们约定把待转换的文件下载到对方管控的机器里&#xff0c;而不是在我们的机器上安装第三方的转换工具。 这…

从0开始学Git指令(3)

从0开始学Git指令 因为网上的git文章优劣难评&#xff0c;大部分没有实操展示&#xff0c;所以打算自己从头整理一份完整的git实战教程&#xff0c;希望对大家能够起到帮助&#xff01; 远程仓库 Git是分布式版本控制系统&#xff0c;同一个Git仓库&#xff0c;可以分布到不…

VUE项目快速打包发布

VUE项目快速打包发布 首先在你的VS Code中新建一个终端 输入 npm run build 回车等运行结束之后会在你的项目中生成一个dist目录 此时再iis部署的时候把你添加的网站指定的目录指向dist即可

202405读书笔记|《作家榜名著:宋词三百首(马未都亲笔推荐版)》——绿酒初尝人易醉,一枕小窗浓睡

《作家榜名著&#xff1a;宋词三百首&#xff08;马未都亲笔推荐版&#xff09;》画很美&#xff0c;词也是&#x1f618;&#x1f618;&#xff0c;既廖远又色彩明艳&#xff0c;丰富而丰盈&#xff0c;看的很欢乐的一本书。部分节选如下&#xff1a; 艳溢香融 天遥地远&…

为什么很多人不看好鸿蒙?轻舟已过万重山

其实这个争议存在很久了。但是到2023年9月份开始&#xff0c;华为秋季发布会上宣布了“鸿蒙不再兼容Android”当时就已经炸开了锅。这个消息让很多不看好鸿蒙的人都闭上了嘴。我们作为国人应该支持自己的操作系统。 鸿蒙4.0&#xff0c;轻舟已过万重山&#xff01; 鸿蒙Harmo…

第七在线智能商品计划签约潮流风向标Alexander Wang亚历山大·王

Alexander Wang&#xff08;亚历山大•王&#xff09;是由华裔设计师王大仁于2004年创立的同名服装品牌&#xff0c;源自纽约&#xff0c;隶属意大利YOOX集团。主营业务涉及成衣、包袋、鞋履、配饰等。并以其简洁、时尚、前卫的设计风格而备受瞩目&#xff0c;它的设计融入了时…

代码随想录算法训练营Day21| 93.复原IP地址、78.子集、90.子集||

LeetCode 93 复原 IP 地址 本题思路&#xff1a;最重要的是想到一个收集结果的条件&#xff0c;也就是终止条件。 当 . 的个数达到三个时候&#xff0c;并且&#xff0c;判断最后剩余的是否符合要求&#xff0c;如果符合&#xff0c;说明整个ip地址可以&#xff0c;就加入到结…

16位单片机单片机S1C17153

16位单片机单片机 .16KB ROM / 2KB内存 * S1C17653对于程序开发很有用。 .产生具有内置振荡器的操作时钟。 - OSC3B振荡器电路&#xff1a;2MHz/1MHz/500kHz&#xff08;类型&#xff09;内部振荡器电路 -OSC1无振荡器电路&#xff1a;32.768 kHz&#xff08;类型&#xf…

SpringBoot中整合ElasticSearch快速入门以及踩坑记录

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 参考上面搭建项目。 ElaticSearch Elasticsearch 是java开发的&#xff0c;基于 Lucene 的搜索引擎。它提供了一…

【计算机组成与体系结构Ⅱ】MIPS指令系统(实验)

实验2&#xff1a;MIPS指令系统 一&#xff1a;实验目的 了解和熟悉指令级模拟器。熟练掌握MIPSsim模拟器的操作和使用方法。熟悉MIPS指令系统及其特点&#xff0c;加深对MIPS指令操作语义的理解。熟悉MIPS体系结构。 二&#xff1a;实验要求 采用指令集和流水线操作级模拟器…

安卓开发-02-基础

文章目录 一、基本UI组件文本类组件TextViewEditText 按钮类组件普通按钮为普通按钮添加的单击事件监听器 图片按钮单选按钮复选框&#xff08;进行多选&#xff09; 日期时间类组件日期选择器时间选择器计时器 二、高级UI组件进度条组件拖动条组件星级评分条图像类组件图像切换…

ML:2-2 neural network 如何完成预测

文章目录 1. 神经网络层2. 更复杂的神经网络3. 神经网络的前向传播forword propagation 【吴恩达机器学习笔记p47-49】 1. 神经网络层 【了解神经网络如何完成预测的】 input&#xff1a;4个数字的向量。3个神经元分别做logistic regression。下角标&#xff1a;标识第 i 个神…

AbstractHttpMessageConverter + easyexcell优雅下载附件

介绍 AbstractHttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的抽象基类。它用于处理来自 HTTP 请求的消息,并将其转换为特定的 Java 对象,或者将 Java 对象转换为 HTTP 响应消息。 这个抽象类允许开发人员创建自定义的 HTTP 消息转换器,以便在 Spring MVC…

构建基于RHEL8系列(CentOS8,AlmaLinux8,RockyLinux8等)的支持63个常见模块的PHP8.1.20的RPM包

本文适用&#xff1a;rhel8系列&#xff0c;或同类系统(CentOS8,AlmaLinux8,RockyLinux8等) 文档形成时期&#xff1a;2023年 因系统版本不同&#xff0c;构建部署应略有差异&#xff0c;但本文未做细分&#xff0c;对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

计算机毕业设计 | SpringBoot+vue校园问卷调查系统(附源码)

1&#xff0c;绪论 研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金…

企业组网搭建有哪些?

在当今全球化的商业环境中&#xff0c;集团公司必须建立起一个无缝连接的网络&#xff0c;以确保高效的信息传输和资源共享。为实现这一目标&#xff0c;选择可靠而安全的网络组网方案至关重要。本文将介绍几种主要的集团公司网络组网方案&#xff0c;以帮助企业根据其具体需求…

算法通关村番外篇-跳表

大家好我是苏麟 , 今天来聊聊调表 . 跳表很少很少实现所以我们只了解就可以了 . 跳表 链表在查找元素的时候&#xff0c;因为需要逐一查找&#xff0c;所以查询效率非常低&#xff0c;时间复杂度是O(N)&#xff0c;于是就出现了跳表。跳表是在链表基础上改进过来的&#xff0…

算法第十九天-二叉搜索树节点最小距离

二叉搜索树节点最小距离 题目要求 解题思路 今天题目重点&#xff1a; 1.二叉搜索树&#xff08;BST&#xff09; 2.任意两个不同节点 遇到二叉搜索树&#xff0c;立即想到这句话&#xff1a;[二叉搜索树&#xff08;BST&#xff09;的中序遍历是有序的]。这是解决所有二叉搜…

DNS主从服务器配置

主从服务器配置&#xff1a; &#xff08;1&#xff09;完全区域传送&#xff1a;复制整个区域文件 #主DNS服务器的配置【主dns服务器的ip地址为192.168.168.129】 #编辑DNS系统配置信息&#xff08;我这里写的增加的信息&#xff0c;源文件里面有很多内容&#xff09; [root…

新手做抖音小店如何选品?选什么样的品?这几点一定要记住

大家好&#xff0c;我是电商花花。 抖音小店如何选品&#xff1f;大家应该自己的选品方法和渠道&#xff0c;但是选品归根结底就是抓住用户的喜好&#xff0c;清楚他们想要什么样的商品&#xff0c;只有抓住用户的需求&#xff0c;客户才会买单&#xff0c;店铺才会出单。 所…