Spring框架-Spring JDBC

文章目录

    • Spring JDBC
      • 实例
        • 1,导入依赖
        • 2,配置数据源
        • 3,数据库
        • 4,实体类
        • 5,dao层
        • 5,配置Dao Bean
        • 6,业务逻辑层
        • 7,配置Service Bean
        • 8,测试
      • JdbcTemplate
        • 常用方法
        • 1,导入依赖
        • 2,配置数据源
        • 4,dao层
        • 5,配置Dao Bean
        • 6,业务逻辑
        • 7,配置Service Bean
        • 8,测试

Spring JDBC

Spring JDBC是Spring框架提供的用于简化JDBC编程的模块,它封装了JDBC的繁琐的操作,提供了一套简单易用的API,可以帮助开发者更加轻松的访问和操作数据库。

Spring JDBC的主要特征:

  • 简化了JDBC的繁琐操作
    • 使用原生的 JDBC 进行数据库操作时,需要手动创建连接、编写 SQL 语句、处理异常、释放资源等,代码量较大且容易出错。
    • Spring JDBC 提供了 JdbcTemplate 和 NamedParameterJdbcTemplate 等模板类,封装了这些繁琐的操作,简化了数据库访问的流程。
  • 异常处理和资源管理
    • Spring JDBC 处理了 JDBC 中的常见异常,并对资源的释放进行了封装,开发者不再需要手动编写大量的 try-catch-finally 代码块来处理异常和释放资源。
  • 支持面向对象的操作方式
    • Spring JDBC 将 JDBC 的结果集映射为 Java 对象的过程进行了抽象和封装,开发者可以更加方便地将数据库中的数据映射为 Java 对象,从而实现面向对象的数据库操作。
  • 事务管理
    • Spring JDBC 可以与 Spring 的事务管理模块结合使用,提供了对事务的支持,开发者可以通过声明式的方式管理事务,而不再需要手动管理事务的提交和回滚。

使用 Spring JDBC 可以大大简化数据库访问的流程,减少了开发者的工作量,提高了开发效率,并且使代码更加清晰和易于维护。

实例

1,导入依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.13</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
</dependency>
  • spring-jdbc
    • Spring框架提供的JDBC抽象层的核心包,用于简化和优化数据库访问操作,它包含了许多用于执行SQL语句,处理结果集和管理事务的类和接口。
  • mysql-connector-java
    • MySQL官方提供的Java连接器,用于在Java应用程序中连接和操作MySQL数据库。它实现了JDBC规范,提供了与MySQL数据库的通信功能。通过该包,可以使用Java代码与MySQL数据库建立连接,执行SQL语句,处理结果集等操作。
2,配置数据源
<?xml version="1.0" encoding="UTF-8"?><!-- XML声明,xml版本和编码格式 --><!-- spring配置文件起点  -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--配置数据源DriverManagerDataSource: spring框架提供的一个数据源实现类,用于管理和配置基于JDBC的数据源,它实现了Java.sql.DataSource接口,可以被用于其他Spring JDBC API的数据源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!-- 数据库连接驱动 --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><!-- 数据库连接URL --><property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;characterEncoding=utf8"/><!-- 数据库连接用户名 --><property name="username" value="root"/><!-- 数据库连接密码 --><property name="password" value="123456"/></bean></beans>
3,数据库
create table user(id int primary key  auto_increment comment '主键id',name varchar(20) character set utf8mb4 not null comment '姓名',email varchar(20) character set utf8mb4 not null comment '邮箱'
)charset =utf8mb4;insert into user(name, email) values('张三','123@qq.com');
4,实体类
package com.sin.pojo;public class User {private long id;private String name;private String email;public User(){}public User(String name, String email) {this.name = name;this.email = email;}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +'}';}
}
5,dao层
package com.sin.dao;import com.sin.pojo.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;/*** @createTime 2024/1/4 11:52* @createAuthor SIN* @use*/
public class UserDao {private JdbcTemplate jdbcTemplate;public void setDatabase(DataSource database){this.jdbcTemplate = new JdbcTemplate(database);}public User getUserById(int id){String sql = "SELECT * FROM user WHERE id = ? ";return jdbcTemplate.queryForObject(sql,new Object[]{id},new BeanPropertyRowMapper<>(User.class));}public void addUser(User user){String sql = "INSERT INTO user (id,name,email) VALUES (?,?,?)";jdbcTemplate.update(sql,user.getId(),user.getName(),user.getEmail());}}
5,配置Dao Bean
<!--  配置bean  --><bean id="userDao" class="com.sin.dao.UserDao"><!--name : 属性名,映射到UserDao类中的setDatabase()方法中ref : 属性值,引用数据源中的Bean--><property name="database" ref="dataSource"/></bean>

为什么database映射的是setDatabase方法呢???
在 Spring 中,属性名和对应的 setter 方法名遵循一定的命名规则即为驼峰命名法。具体来说,如果一个属性的名称是 database,则对应的 setter 方法应该命名为 setDatabase。

​ 因为,在 Spring 中,通过反射机制来调用 setter 方法时,会根据属性名称自动生成方法名,并自动调用该方法进行属性的注入。因此,我们需要严格遵循属性和方法的命名规则,以确保属性能够正确地被注入到对象中。

如果属性名为database1,那么需要映射的方法名为setDatabase1

6,业务逻辑层
package com.sin.service;import com.sin.dao.UserDao;
import com.sin.pojo.User;
import org.springframework.stereotype.Service;/*** @createTime 2024/1/3 14:37* @createAuthor SIN* @use*/
public interface UserService {public void setUserDao(UserDao userDao);public User getUserById(int userId);public void addUser(User user);
}
package com.sin.service.impl;import com.sin.dao.UserDao;
import com.sin.pojo.User;
import com.sin.service.UserService;
import org.springframework.stereotype.Service;/*** @createTime 2024/1/3 15:14* @createAuthor SIN* @use*/
@Service
public class UserServiceImpl implements UserService {private UserDao userDao;@Overridepublic void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic User getUserById(int userId) {return userDao.getUserById(userId);}@Overridepublic void addUser(User user) {userDao.addUser(user);}
}
7,配置Service Bean
<bean id="userService" class="com.sin.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/>
</bean>
8,测试
package com.sin.test;import com.sin.pojo.User;
import com.sin.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @createTime 2024/1/4 9:17* @createAuthor SIN* @use*/
public class AppTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService =  context.getBean("userService",UserService.class);User user =  new User("李四","123456@11.com");userService.addUser(user);System.out.println(userService.getUserById(1));System.out.println(userService.getUserById(2));}
}

JdbcTemplate

JdbcTemplate是Spring框架提供的一个用于简化JDBC操作的工具类,它封装了一系列常用的数据库操作方法,能够更好的帮助我们进行数据库的增删改查的操作。

常用方法
方法说明
query(String sql, RowMapper rowMapper)执行查询操作,并将结果映射为一个对象列表。sql 参数为查询语句,rowMapper 参数为结果集的映射器
queryForObject(String sql, RowMapper rowMapper)执行查询操作,并返回单个对象。如果查询结果为空或多于一个对象,则会抛出异常
queryForList(String sql)执行查询操作,并将结果映射为一个列表。适用于返回一列或多列的结果
update(String sql)执行更新操作,如插入、更新和删除等。sql 参数为要执行的更新语句
update(String sql, Object… args)执行带参数的更新操作。sql 参数为带有占位符的更新语句,args 参数为占位符的值
batchUpdate(String sql, List<Object[]> batchArgs)批量执行更新操作。sql 参数为要执行的更新语句,batchArgs 参数为批量更新的参数列表
execute(String sql)执行任意的 SQL 语句,如创建表、删除表等
call(CallableStatementCreator csc, List declaredParameters)调用存储过程或函数
1,导入依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.13</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
</dependency>
2,配置数据源
<?xml version="1.0" encoding="UTF-8"?><!-- XML声明,xml版本和编码格式 --><!-- spring配置文件起点  -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><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/demo?useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="123456"/></bean>
</beans>
4,dao层
package com.sin.dao;import com.sin.pojo.User;
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 javax.sql.DataSource;
import java.util.List;/*** @createTime 2024/1/4 11:52* @createAuthor SIN* @use*/
@Repository // 表示该类为dao层
public class UserDao {private JdbcTemplate jdbcTemplate;public void  setDataSource(DataSource dataSource){this.jdbcTemplate = new JdbcTemplate(dataSource);}public List<User> findAll() {String sql = "SELECT * FROM user";List<User> users = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(User.class));return users;}public User findById(Long id) {String sql = "SELECT * FROM user WHERE id = ? ";return jdbcTemplate.queryForObject(sql,new Object[]{id},new BeanPropertyRowMapper<>(User.class));}public void save(User user) {String sql = "INSERT INTO user(name, email) VALUES(?,?)";Object[] args = {user.getName(), user.getEmail()};jdbcTemplate.update(sql, args);}public void update(User user) {String sql = "UPDATE user SET name=?, email=? WHERE id=?";Object[] args = {user.getName(), user.getEmail(), user.getId()};jdbcTemplate.update(sql, args);}public void delete(Long id) {String sql = "DELETE FROM user WHERE id=?";Object[] args = {id};jdbcTemplate.update(sql, args);}
}
5,配置Dao Bean
<bean id="userDao" class="com.sin.dao.UserDao"><property name="dataSource" ref="dataSource"/>
</bean>
6,业务逻辑
package com.sin.service;import com.sin.pojo.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;import java.util.List;/*** @createTime 2024/1/5 9:08* @createAuthor SIN* @use*/
public interface UserService {public List<User> findAll();public User findById(Long id);public void save(User user);public void update(User user);public void delete(Long id);
}
package com.sin.service.impl;import com.sin.dao.UserDao;
import com.sin.pojo.User;
import com.sin.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;import java.util.List;/*** @createTime 2024/1/5 9:09* @createAuthor SIN* @use*/
@Service
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic List<User> findAll() {return userDao.findAll();}@Overridepublic User findById(Long id) {return userDao.findById(id);}@Overridepublic void save(User user) {if (user != null) {userDao.save(user);}}@Overridepublic void update(User user) {userDao.update(user);}@Overridepublic void delete(Long id) {if (id != null) {userDao.delete(id);}}
}
7,配置Service Bean
<bean id="userService" class="com.sin.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/>
</bean>
8,测试
package com.sin.test;import com.sin.pojo.User;
import com.sin.service.UserService;
import com.sin.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;/*** @createTime 2024/1/5 9:21* @createAuthor SIN* @use*/
public class UserServiceTest {public static UserService getUserService() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");return applicationContext.getBean("userService", UserService.class);}@Testpublic void testFindAll(){List<User> users = getUserService().findAll();for(User user : users){System.out.println(user);}}@Testpublic void testFindById() {User user = getUserService().findById(1L);System.out.println(user);}@Testpublic void testSave() {User user = new User();user.setName("张三");user.setEmail("121212.@111");getUserService().save(user);}@Testpublic void testUpdate() {User user = getUserService().findById(2L);user.setName("李四");user.setEmail("1212121212@11.com");getUserService().update(user);}@Testpublic void testDelete() {getUserService().delete(1L);}}

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

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

相关文章

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

【2024系统架构设计】 系统架构设计师第二版-通信系统架构设计理论与实践

目录 一 通信系统网络架构 二 网络构建的关键技术 三 网络构建和设计方法 四 案例分析 注:本节内容可作为知识储备,做一个基本的了解即可。

50天精通Golang(第12天)

channel通道 通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动&#xff0c;数据可以从一端发送到另一端&#xff0c;通过通道接收。 在前面讲Go语言的并发时候&#xff0c;我们就说过&#xff0c;当多个Goroutine想实现共享数据的时候&#xff0…

Linux-命名管道

文章目录 前言一、命名管道接口函数介绍二、使用步骤 前言 上章内容&#xff0c;我们介绍与使用了管道。上章内容所讲的&#xff0c;是通过pipe接口函数让操作系统给我们申请匿名管道进行进程间通信。 并且这种进程间通信一般只适用于父子进程之间&#xff0c;那么对于两个没有…

原来这些小众知识库软件这么好用,挖到宝了

在企业管理中&#xff0c;知识库的作用越来越被重视。它不仅可以提高工作流程的效率&#xff0c;还可以最大限度地利用企业中的知识资源。然而&#xff0c;在众多的知识库工具中选择一款合适的并非易事。不用担心&#xff0c;今天我要为大家揭晓一些小众却非常好用的知识库软件…

【华为OD机试真题2023CD卷 JAVAJS】中文分词模拟器

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 中文分词模拟器 知识点图字符串 时间限制:5s 空间限制:256MB 限定语言:不限 题目描述: 给定一个连续不包含空格字符串,该字符串仅包含英文小写字母及英文文标点符号(逗号、分号、句号),同时给定词库,对该字符串进…

python函数装饰器基础

1 python函数装饰器基础 python2.5开始支持函数装饰器。装饰器语法&#xff1a;自动调用装饰器函数&#xff0c;返回可调用对象重新绑定到主体函数名。 1.1 基础用法 函数装饰器用法&#xff0c;装饰器函数&#xff0c;下一行接def 主体函数&#xff1a; decorator def fm(…

微信小程序实战-02翻页时钟-2

微信小程序实战系列 《微信小程序实战-01翻页时钟-1》 文章目录 微信小程序实战系列前言计时功能实现clock.wxmlclock.wxssclock.js 运行效果总结 前言 接着《微信小程序实战-01翻页时钟-1》&#xff0c;继续完成“6个页面的静态渲染和计时”功能。 计时功能实现 clock.wxm…

python类装饰器基础

1 python类装饰器基础 类装饰器是管理类的一种方式&#xff0c;不是包装单个函数或方法&#xff0c;而是用装饰器的额外逻辑&#xff0c;来包装实例的构建和调用&#xff0c;从而实现对主体类的扩展。 主体类被装饰后&#xff0c;通过主体类创建实例对象时&#xff0c;自动调…

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址&#xff1a;https://github.com/akbiggs/UnityTimer/tree/master 导入&#xff1a;URL&#xff1a;https://github.com/akbiggs/UnityTimer.git 基本功能&#xff1a; 创建计时器&#xff1a; Time…

深入理解 Hadoop (四)HDFS源码剖析

HDFS 集群启动脚本 start-dfs.sh 分析 启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。 JournalNode 核心工作和启动流程源码剖析 // 启动 JournalNode 的核心业务方法 public void start() throws IOException …

【打卡】牛客网:BM80 买卖股票的最好时机(一)

模板的&#xff1a; 我的想法是&#xff0c;这个题就是找最大差。两个递归是可以解决的&#xff0c;时间复杂度是o(n^2)。但是题目要求时间复杂度是o(n)。 模板用了一个两行的dp数组&#xff0c;在一次for循环中&#xff0c;更新两行&#xff0c;是亮点。 第一行记录利润。全…

OpenHarmony之hdc

OpenHarmony之hdc 简介 hdc&#xff08;OpenHarmony Device Connector&#xff09;是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在Windows/Linux/MacOS等系统上与开发机或者模拟器进行交互。 类似于Android的adb&#xff0c;和adb类似&a…

探索Java中的Map:领略键值对的无限魅力

目录 1、前言 2、介绍Map 2.1 什么是Map 2.2 Map的特点 3、常用的Map实现类 3.1 HashMap 3.2 TreeMap 3.3 LinkedHashMap 3.4 Hashtable 3.5 ConcurrentHashMap 4、操作Map的常用方法 5、Map的应用场景 5.1 缓存 5.2 数据存储 5.3 计数器 6、常见问题解答 6.1…

Spring中线程池ThreadPoolTaskExecutor的使用

一、为什么要使用线程池 在项目中使用多线程时&#xff0c;通常建议使用线程池而不是直接使用 new Thread 的方式来创建线程。下面是一些原因&#xff1a; 资源管理和性能优化&#xff1a; 使用线程池可以更好地管理系统资源&#xff0c;控制并发线程数&#xff0c;避免创建过…

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…

k8s的存储卷

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消…

获取直播间的最新评论 - python 取两个list的差集

python 取两个list的差集 作用&#xff1a;比如我要获取评论区列表&#xff0c;先获取了一遍&#xff0c;这个时候有人评论了几条&#xff0c;我再获取一遍后&#xff0c;找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…

微信公众号——微信公众号实现发送模板消息

准备工作 在调用微信接口获取AccessToken时&#xff0c;需要使用到微信公众号的appid及appsecret&#xff0c;获取方式如下&#xff1a; 1.已有公众号 已有公众号&#xff1a; 有属于自己的公众号账户&#xff0c;登录微信公众平台(https://mp.weixin.qq.com)&#xff0c;在…