Spring 用法学习总结(四)之 JdbcTemplate 连接数据库

🐉目录

9 JdbcTemplate


9 JdbcTemplate

Spring 框架对 JDBC 进行了封装,使用 JdbcTemplate 方便实现对数据库操作
相关包:
 
百度网盘链接icon-default.png?t=N7T8https://pan.baidu.com/s/1Gw1l6VKc-p4gdqDyD626cg?pwd=6666
创建properties配置文件
💥注意:高版本 MySQL 需要将 useSSL 设置为 false
此外,还需将驱动器修改为适合  MySQL 的版本:  mysql-connector-java各种版本下载链接icon-default.png?t=N7T8https://mvnrepository.com/artifact/mysql/mysql-connector-java
如果仍报错则将 com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driverClassName=com.mysql.cj.jdbc.Driver
study 数据库中的 book 表
导入语法:source sql 文件地址, 无法插入中文,请修改数据库编码为 utf-8
create table book(
bookid int(10) primary key auto_increment,
bookname varchar(50),
booksale double(7,2));insert into book(bookname,booksale) values
('Spring揭秘',75.5),
('Spring实战',56),
('Spring源码深入解析',72);
创建 xml 文件
com.alibaba.druid.pool.DruidDataSource 用来配置连接池
org.springframework.jdbc.core.JdbcTemplate 用来连接数据库
<?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"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><!--加载配置文件--><context:property-placeholder location="classpath:user.properties" file-encoding="UTF-8"/><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="${url}" /><property name="username" value="${name}" /><property name="password" value="${password}" /><property name="driverClassName" value="${driverClassName}" /></bean><!-- JdbcTemplate 对象 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!--注入 dataSource--><property name="dataSource" ref="dataSource"></property></bean><!-- 组件扫描 --><context:component-scan base-package="springstudy4"></context:component-scan>
</beans>

Book 类存储书籍信息

Dao 是数据库操作,其中 BookDao 为接口并且声明了对数据库操作的方法,BookDaoIml 类实现了 BookDao 接口

Service 是业务操作,可以调用 BookDao 接口中的方法

Test 类进行测试,通过 Service 类调用 BookDao 接口中的方法

创建 BookDao 接口
package springstudy4;import java.util.List;public interface BookDao {//增void add(Book book);//批量添加void batchAddBook(List<Object[]> batchArgs);//删void delete(int id);//批量删除void batchDeleteBook(List<Object[]> batchArgs);//改void update(Book book);//批量修改void batchUpdateBook(List<Object[]> batchArgs);//查int selectCount();//查询返回对象Book findBookInfo(int id);//查询返回集合List<Book> findAllBook();
}

创建 BookService 类

package springstudy4;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BookService {//注入 dao@Autowiredprivate BookDao bookDao;//添加public void addBook(Book book) {bookDao.add(book);}//批量添加public void batchAdd(List<Object[]> batchArgs) {bookDao.batchAddBook(batchArgs);}//删除public void deleteBook(int id) {bookDao.delete(id);}//批量删除public void batchDelete(List<Object[]> batchArgs) {bookDao.batchDeleteBook(batchArgs);}//修改public void updateBook(Book book) {bookDao.update(book);}//批量添加public void batchUpdate(List<Object[]> batchArgs) {bookDao.batchUpdateBook(batchArgs);}//查找public void findBook(int id) {bookDao.findBookInfo(id);}//查找全部public List<Book> findAll() {return bookDao.findAllBook();}
}

创建 Book 类

package springstudy4;public class Book {private int bookid;private String bookname;private double booksale;public int getBookid() {return bookid;}public void setBookid(int bookid) {this.bookid = bookid;}public String getBookname() {return bookname;}public void setBookname(String bookname) {this.bookname = bookname;}public double getBooksale() {return booksale;}public void setBooksale(double booksale) {this.booksale = booksale;}@Overridepublic String toString() {return "Book{" +"bookid=" + bookid +", bookname='" + bookname + '\'' +", booksale=" + booksale +'}';}
}

👀创建 BookDaoIml 类(重点)👀

BookDaoIml 类定义了 CRUD 方法,通过 JdbcTemplate 模块可以对数据库中的一条或多条数据进行操作

package springstudy4;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.Arrays;
import java.util.List;@Repository
public class BookDaoImpl implements BookDao {//注入 JdbcTemplate@Autowiredprivate JdbcTemplate jdbcTemplate;//增@Overridepublic void add(Book book) {String sql = "insert into book values(?,?,?)";jdbcTemplate.update(sql, book.getBookid(), book.getBookname(), book.getBooksale());}//批量添加@Overridepublic void batchAddBook(List<Object[]> batchArgs) {String sql = "insert into book values(?,?,?)";int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);System.out.println(Arrays.toString(ints));}//删@Overridepublic void delete(int id) {String sql = "delete from book where bookid=?";int update = jdbcTemplate.update(sql, id);System.out.println(update);}//批量删除@Overridepublic void batchDeleteBook(List<Object[]> batchArgs) {String sql = "delete from book where bookid=?";int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);System.out.println(Arrays.toString(ints));}//改@Overridepublic void update(Book book) {String sql = "update book set bookname=?,booksale=? where bookid=?";Object[] args = {book.getBookname(), book.getBooksale(),book.getBookid()};int update = jdbcTemplate.update(sql, args);System.out.println(update);}//批量修改@Overridepublic void batchUpdateBook(List<Object[]> batchArgs) {String sql = "update book set bookname=?,booksale=? where bookid=?";int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);System.out.println(Arrays.toString(ints));}//查@Overridepublic int selectCount() {String sql = "select count(*) from book";Integer count = jdbcTemplate.queryForObject(sql, Integer.class);return count;}//查询返回对象@Overridepublic Book findBookInfo(int id) {String sql = "select * from book where bookid=?";//调用方法Book book = jdbcTemplate.queryForObject(sql, newBeanPropertyRowMapper<Book>(Book.class), id);return book;}//查询返回集合@Overridepublic List<Book> findAllBook() {String sql = "select * from book";//调用方法List<Book> bookList = jdbcTemplate.query(sql, newBeanPropertyRowMapper<Book>(Book.class));return bookList;}
}

创建 Test 类

package springstudy4;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("bean4.xml");BookService bookService = context.getBean("bookService", BookService.class);Book book = new Book();List<Book> bookList;List<Object[]> batchArgs = new ArrayList<>();//查找所有bookList = bookService.findAll();for(Book i : bookList) {System.out.println(i);}
//        //增加一条
//        book.setBookid(5);
//        book.setBookname("算法导论");
//        book.setBooksale(65);
//        bookService.addBook(book);
//        //批量添加测试
//        batchArgs.clear();
//        Object[] a1 = {6,"java",26};
//        Object[] a2 = {7,"c++", 66};
//        Object[] a3 = {8,"MySQL",62};
//        batchArgs.add(a1);
//        batchArgs.add(a2);
//        batchArgs.add(a3);
//        //调用批量添加
//        bookService.batchAdd(batchArgs);//批量删除batchArgs.clear();Object[] b1 = {6};Object[] b2 = {7};batchArgs.add(b1);batchArgs.add(b2);//调用方法实现批量删除bookService.batchDelete(batchArgs);//批量修改batchArgs.clear();Object[] c1 = {"java", 66.5, 6};Object[] c2 = {"c++", 77.0, 7};Object[] c3 = {"MySQL",88.5, 8};batchArgs.add(c1);batchArgs.add(c2);batchArgs.add(c3);//调用方法实现批量修改bookService.batchUpdate(batchArgs);}
}

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

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

相关文章

如何使用python 挑战将ai生成的概念图制作成2d游戏

要使用Python将AI生成的概念图制作成2D游戏&#xff0c;你可以遵循以下步骤&#xff1a; 生成概念图&#xff1a; 使用AI图像生成工具&#xff08;如DALL-E、DeepArt等&#xff09;来创建你的游戏概念图。保存生成的图像文件&#xff0c;通常为PNG或JPEG格式。 选择游戏引擎&a…

STM32的三种下载方式

结果jlink&#xff0c;串口&#xff0c;stlink方式都没有问题&#xff0c;是当时缩减代码&#xff0c;看真正起作用的代码段有哪些&#xff0c;就把GPIO初始化中 /*开启GPIO外部时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 把开启外部时钟的代码注释掉了。…

vue-路由(六)

阅读文章你可以收获什么&#xff1f; 1 明白什么是单页应用 2 知道vue中的路由是什么 3 知道如何使用vueRouter这个路由插件 4 知道如何如何封装路由组件 5 知道vue中的声明式导航router-link的用法 6 知道vue中的编程式导航的使用 7 知道声明式导航和编程式导航式如何传…

2024.2.15 模拟实现 RabbitMQ —— 消息持久化

目录 引言 约定存储方式 消息序列化 重点理解 针对 MessageFileManager 单元测试 小结 统一硬盘操作​​​​​​​ 引言 问题&#xff1a; 关于 Message&#xff08;消息&#xff09;为啥在硬盘上存储&#xff1f; 回答&#xff1a; 消息操作并不涉及到复杂的增删查改消…

MIT-BEVFusion系列八--onnx导出2 spconv network网络导出

这里写目录标题 export-scn.py加载模型设置每层的精度属性初始化输入参数导出模型model.encoder_layers 设置初始化参数设置 indice_key 属性更改 lidar backbone 的 forward更改lidar网络内各个层的forward带参数装饰器&#xff0c;钩子函数代码使用装饰器修改forward举例 跟踪…

Codeforces Round 926 (Div. 2)

C:Sasha and the Casino 类似于倍投法&#xff0c;就是在一赔一的情况下,第一次压一块钱,每输一次就押注上一次两倍的金额. 假如资金无限的话,这种方法赢的期望为无穷大.原理类似于二进制&#xff0c;不论你输再多次,只要赢一次总额就增加了1.比如 15 二进制1111&#xff0c;…

【嵌入式】校招信息表(持续更新)

相关文章 写一份让HR过目不忘的简历 嵌入式校招信息表 一、校招信息表二、注意事项三、最后 一、校招信息表 二、注意事项 三、最后 【校招】如何写出HR最喜欢的简历&#xff0c;一个视频讲清楚

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

如何减少HTTP请求次数

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 如何减少HTTP请求次数? 减少 HTTP 请求次数自然也就提升了 HTTP 性能&#xff0c;可以从这 3 个方面入手: 减少重定向请求次数合并请求延迟发送请求 减少重定向请求次数 我们先来看看什么是重定向请…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

【C++】C++11上

C11上 1.C11简介2.统一的列表初始化2.1 {} 初始化2.2 initializer_list 3.变量类型推导3.1auto3.2decltype3.3nullptr 4.范围for循环5.final与override6.智能指针7. STL中一些变化8.右值引用和移动语义8.1左值引用和右值引用8.2左值引用与右值引用比较8.3右值引用使用场景和意义…

HarmonyOS—@State装饰器:组件内状态

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&a…

【Linux】线程同步

线程同步 一、条件变量1. 同步概念2. 条件变量概念3. 条件变量接口&#xff08;1&#xff09;pthread_cond_init()&#xff08;2&#xff09;pthread_cond_destroy()&#xff08;3&#xff09;pthread_cond_wait()&#xff08;4&#xff09;pthread_cond_signal()&#xff08;5…

备战蓝桥杯---图论之建图基础

话不多说&#xff0c;直接看题&#xff1a; 首先&#xff0c;这个不是按照字典序的顺序&#xff0c;而是以只要1先做&#xff0c;在满足后让2先做。。。。 就是让数字小的放前面做拓扑排序。 我们可以先做1&#xff0c;看看它的前驱。 举个例子&#xff1a; 我们肯定要把1放…

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

【JavaEE】_HTTP请求报头header

目录 1. Host 2. Content-Length与Content-Type 2.1 Content-Length 2.2 Content-Type 3. User-Agent&#xff08;UA&#xff09; 4. Referer 5. Cookie header的整体格式是“键值对”结构&#xff0c;一行是一个键值对&#xff0c;这些键值对都是HTTP定义好的、有特殊含…

初识数据库:探索数据的世界

初识数据库&#xff1a;探索数据的世界 1. 什么是数据库&#xff1f;2. 数据库的类型2.1 关系型数据库&#xff08;RDBMS&#xff09;2.2 非关系型数据库&#xff08;NoSQL&#xff09; 3. 为什么使用数据库&#xff1f;4. 如何选择合适的数据库&#xff1f;5. 结语 在信息技术…

ubuntu 22.04.3 live server安装JDK21与远程编程环境和maven

ubuntu 22.04.3 live server安装JDK21与远程编程环境 一、安装jdk21 解压jdk压缩包&#xff0c;命令&#xff1a; tar -zxvf jdk-21_linux-x64_bin.tar.gz打开环境变量&#xff0c;命令&#xff1a; sudo vim /etc/profile配置环境变量 export JAVA_HOME/root/jdk-21.0.2 …

洛谷P8627 饮料换购 题解

#题外话&#xff08;第27篇题解&#xff09;&#xff08;本题为普及-难度&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P8627 #思路&#xff08;用while循环&#xff0c;循环到山穷水尽为止&#xff0c;用一个计数的计量&#xff09; #代码 #include …