问:说说SpringDAO及ORM的用法?

一、SpringDao组件概述

在Spring框架中,DAO(Data Access Object)组件用于实现与数据库交互的数据访问操作。Spring提供了多种方式来使用DAO,包括JdbcTemplate、HibernateTemplate以及Spring Data JPA等。这些工具简化了数据库操作,提高了开发效率,并减少了代码复杂性。

二、SpringDao组件的基本用法

1. 添加依赖

首先,需要在项目的构建文件中添加Spring JDBC的依赖。例如,对于Maven项目,可以在pom.xml文件中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2. 配置数据源

在Spring的配置文件中配置数据源(DataSource),用于连接数据库。例如:

<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/mydatabase"/><property name="username" value="username"/><property name="password" value="password"/>
</bean>

3. 创建DAO接口

定义一个DAO接口,用于声明数据访问的方法。例如:

public interface UserDao {User getUserById(int id);void addUser(User user);void updateUser(User user);void deleteUser(int id);
}

4. 实现DAO接口

创建一个DAO的实现类,实现DAO接口中定义的方法。例如:

@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic User getUserById(int id) {String sql = "SELECT id, name, email FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));}@Overridepublic void addUser(User user) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, user.getName(), user.getEmail());}@Overridepublic void updateUser(User user) {String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());}@Overridepublic void deleteUser(int id) {String sql = "DELETE FROM users WHERE id = ?";jdbcTemplate.update(sql, id);}
}

5. 配置组件扫描

在Spring的配置文件中配置组件扫描,以便能够自动发现和注册DAO组件。例如:

<context:component-scan base-package="com.example.dao"/>

6. 使用DAO

在需要使用DAO的地方,通过@Autowired注解将DAO引入到其他类中,即可使用DAO提供的数据访问方法。例如:

@Service
public class UserService {@Autowiredprivate UserDao userDao;public User getUserById(int id) {return userDao.getUserById(id);}public void addUser(User user) {userDao.addUser(user);}// 其他方法...
}

三、不同ORM的SpringDao用法

1. Spring Data JPA

Spring Data JPA是Spring对JPA(Java Persistence API)的封装和扩展,通过简单的接口和注解,可以实现自动生成SQL语句、事务管理等功能。

1.1 添加依赖

在项目的pom.xml文件中添加Spring Data JPA的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
1.2 配置数据源和JPA属性

application.propertiesapplication.yml文件中配置数据源和JPA相关属性:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
1.3 创建实体类

定义实体类,并使用JPA注解来映射数据库表。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "user")
public class User {@Idprivate Long id;private String name;private Integer age;// 其他字段及getter和setter方法
}
1.4 创建仓库接口

创建一个继承自JpaRepositoryCrudRepository的接口,并指定实体类。例如:

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {// 可以在这里定义自定义查询方法
}
1.5 使用仓库

在服务层注入仓库,并使用其提供的方法进行数据库操作。例如:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User findById(Long id) {return userRepository.findById(id).orElse(null);}// 其他服务方法...
}

2. Hibernate

Hibernate是一个流行的ORM框架,Spring提供了对Hibernate的良好支持。

2.1 添加依赖

在项目的pom.xml文件中添加Hibernate的依赖:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.21.Final</version>
</dependency>
2.2 配置Hibernate

在Spring的配置文件中配置Hibernate的SessionFactory。例如:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan" value="com.example.entity"/><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop></props></property>
</bean>
2.3 创建实体类

使用Hibernate注解来映射数据库表。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "user")
public class User {@Idprivate Long id;private String name;private Integer age;// 其他字段及getter和setter方法
}
2.4 创建DAO接口和实现类

定义一个DAO接口,并创建一个实现类来执行数据库操作。例如:

public interface UserDao {User getUserById(Long id);void addUser(User user);void updateUser(User user);void deleteUser(Long id);
}@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate SessionFactory sessionFactory;@Overridepublic User getUserById(Long id) {return sessionFactory.getCurrentSession().get(User.class, id);}@Overridepublic void addUser(User user) {sessionFactory.getCurrentSession().save(user);}@Overridepublic void updateUser(User user) {sessionFactory.getCurrentSession().update(user);}@Overridepublic void deleteUser(Long id) {User user = sessionFactory.getCurrentSession().load(User.class, id);sessionFactory.getCurrentSession().delete(user);}
}

3. MyBatis

MyBatis是一个基于Java的持久层框架,通过XML或注解的方式将SQL语句与Java代码分离。

3.1 添加依赖

在项目的pom.xml文件中添加MyBatis的依赖:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>
3.2 配置MyBatis

application.propertiesapplication.yml文件中配置MyBatis的相关属性。例如:

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
3.3 创建实体类

定义实体类,并使用MyBatis注解或XML映射文件来映射数据库表。例如:

public class User {private Long id;private String name;private Integer age;// getter和setter方法
}
3.4 创建Mapper接口和XML映射文件

定义一个Mapper接口,并创建一个对应的XML映射文件来定义SQL语句。例如:

public interface UserMapper {User selectUserById(@Param("id") Long id);void insertUser(User user);void updateUser(User user);void deleteUser(@Param("id") Long id);
}

对应的XML映射文件UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><select id="selectUserById" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO user (name, age) VALUES (#{name}, #{age})</insert><update id="updateUser" parameterType="com.example.entity.User">UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteUser" parameterType="long">DELETE FROM user WHERE id = #{id}</delete>
</mapper>
3.5 使用Mapper

在服务层注入Mapper,并使用其提供的方法进行数据库操作。例如:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectUserById(id);}public void addUser(User user) {userMapper.insertUser(user);}// 其他服务方法...
}

四、SpringDao组件的常见异常类型及处理方式

在Spring Framework中,DAO层通常会抛出各种数据访问相关的异常。以下是一些常见的异常类型及其简要描述和处理方式:

1. DataAccessException

  • 描述:Spring框架中所有数据访问异常的通用父异常。它捕获了底层数据访问技术(如JDBC、Hibernate、JPA等)可能抛出的异常,并提供了一个一般性的异常类型,以便在DAO层捕获和处理这些异常。
  • 处理方式:在DAO层捕获DataAccessException,并根据具体异常类型进行相应处理。例如,可以记录日志、回滚事务或向用户返回错误信息等。

2. DuplicateKeyException

  • 描述:当尝试在数据库中插入具有唯一约束的数据,并且已经存在具有相同唯一键值的记录时,将引发此异常。通常对应于SQL中的唯一键冲突。
  • 处理方式:在插入数据前检查是否已存在相同键值的记录,或者捕获DuplicateKeyException并提示用户该键值已存在。

3. DataIntegrityViolationException

  • 描述:表示数据库约束完整性的违反,如外键约束、非空约束等。当数据库操作违反了这些约束时,将抛出此异常。
  • 处理方式:检查数据库操作是否违反了约束条件,并在必要时修改数据或业务逻辑以避免此类异常。

4. UncategorizedSQLException

  • 描述:一个通用的SQL异常,用于表示在执行SQL操作时发生的未分类的问题。通常,这种异常包含有关底层数据库错误的详细信息。
  • 处理方式:根据异常信息诊断问题原因,并采取相应的修复措施。例如,可能是SQL语句语法错误或数据库连接问题。

5. InvalidDataAccessApiUsageException

  • 描述:表示在使用Spring的数据访问API时发生的非法操作。例如,使用不支持的特性或方法可能会引发此异常。
  • 处理方式:检查API使用方法是否正确,并确保遵循Spring数据访问API的规范。

6. TransientDataAccessResourceException

  • 描述:当底层数据资源(例如数据库服务器)出现临时问题时,可能会抛出此异常。通常,这是一个短暂的错误,可以尝试重新执行操作。
  • 处理方式:捕获此异常并重试操作,或者向用户提示稍后再试。

7. ObjectOptimisticLockingFailureException

  • 描述:用于表示在乐观锁定机制下的并发冲突。当两个或多个客户端尝试同时修改相同的数据时,可能会发生此异常。
  • 处理方式:实现冲突解决策略,如提示用户重新加载数据并再次尝试提交更改。

8. IncorrectResultSizeDataAccessException

  • 描述:当查询的结果集大小与预期不符时,将抛出此异常。例如,期望只有一个结果但查询返回多个结果时,或者期望多个结果但查询只返回一个结果时。
  • 处理方式:检查查询条件和逻辑,确保查询结果符合预期。

9. EmptyResultDataAccessException

  • 描述:当查询未返回任何结果但期望至少有一个结果时,将抛出此异常。
  • 处理方式:处理空结果集的情况,例如返回默认值或向用户提示未找到数据。

10. CannotAcquireLockException

  • 描述:在尝试获取锁时失败时抛出此异常,例如在数据库事务中无法获得锁定资源时。
  • 处理方式:实现重试逻辑或调整事务隔离级别以减少锁竞争。

五、结尾

SpringDao组件是Spring框架中用于实现数据访问操作的重要部分。通过集成不同的ORM框架(如JPA、Hibernate、MyBatis等),SpringDao组件提供了灵活且强大的数据访问能力。在实际开发中,了解并掌握SpringDao组件的基本用法和常见异常处理方式是至关重要的。

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

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

相关文章

使用 Go 实现将任何网页转化为 PDF

在许多应用场景中&#xff0c;可能需要将网页内容转化为 PDF 格式&#xff0c;比如保存网页内容、生成报告、或者创建网站截图。使用 Go 编程语言&#xff0c;结合一些现有的库&#xff0c;可以非常方便地实现这一功能。本文将带你一步一步地介绍如何使用 Go 语言将任何网页转换…

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

基础IO2

文章目录 磁盘结构磁盘存储结构磁盘的逻辑结构引入文件系统理解文件系统inode 映射 data blocks文件名与inode的关系dentry树文件描述符与进程之间的关系 深刻理解软硬链接软链接硬链接 动静态库静态库1. 手动制作静态库2.调用静态库(1)安装到系统(2)自己指定查找路径(3)自己创…

计算机网络:运输层 —— TCP的流量控制

文章目录 TCP的流量控制TCP的流量控制方法滑动窗口机制持续计时器 TCP的流量控制 当 TCP 客户端持续发送大量数据时&#xff0c;应用程序可能正忙于其他任务&#xff0c;并不一定能够立刻取走数据&#xff0c;这会造成接收方接收缓存的溢出&#xff0c;导致数据丢失。 TCP 为应…

Flink_DataStreamAPI_执行环境

DataStreamAPI_执行环境 1创建执行环境1.1getExecutionEnvironment1.2createLocalEnvironment1.3createRemoteEnvironment 2执行模式&#xff08;Execution Mode&#xff09;3触发程序执行 Flink程序可以在各种上下文环境中运行&#xff1a;我们可以在本地JVM中执行程序&#x…

鸿蒙中如何实现图片拉伸效果

2024年10月22日&#xff0c;华为发布会上&#xff0c;推出鸿蒙5.0。现在加入恰逢时机&#xff0c;你&#xff0c;我皆是鸿蒙时代合伙人。无论为了学习技术&#xff0c;还是为了谋福利&#xff0c;在鸿蒙的浩瀚海洋中分到一杯羹。现在学习鸿蒙正当时。 一文了解鸿蒙中图片拉伸的…

Unity 2022 Nav Mesh 自动寻路入门

untiy 2022 window-PackageManager-AINavigation 安装 Install 2.创建一个空物体命名Nav&#xff0c;在其自身挂载 NavMeshSurface 然后点击bake 烘焙地形即可 3.创建palyer和怪物 怪物AI代码 using System.Collections; using System.Collections.Generic; using UnityEngi…

基于gradio+networkx库对图结构进行可视化展示

前言 在gradio框架下对蛋白质-蛋白质相互作用网络&#xff08;PPI网络&#xff09;进行可视化&#xff0c;并将其在网页前端进行展示。 方法 其实很简单 可以直接使用networkx画图后保存图片&#xff0c;然后使用Gradio框架的image组件进行展示即可。 但实际上gradio还配置…

MSTP知识点

多生成树协议 在 MSTP&#xff08;Multiple Spanning Tree Protocol&#xff09;中&#xff0c;根桥&#xff08;root&#xff09;、指定端口&#xff08;designated port&#xff09;、备用端口&#xff08;alternate port&#xff09;等角色都是确保网络中没有循环并且流量能…

为正在运行的 Docker 容器重启策略,以提高服务的可用性

为正在运行的 Docker 容器重启策略,以提高服务的可用性。 为正在运行的 Docker 容器添加 --restartalways –restartalways 是 Docker 中一个常用的参数&#xff0c;用来设置容器的重启策略。它的作用是确保容器在一定条件下能够自动重启&#xff0c;以提高服务的可用性。 方…

后台管理系统(开箱即用)

很久没有更新博客了&#xff0c;给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理&#xff0c;部门管理&#…

Cursor安装Windows / Ubuntu

一、安装 1、下载软件 2、安装依赖 #安装fuse sudo apt-get install fuse3、将cursor添加到应用程序列表 sudo mv cursor-0.42.5x86_64.AppImage /opt/cursor.appimage #使用自己版本号替换 sudo chmod x /opt/cursor.appimage #给予可执行权限 sudo nano /usr/share/applic…

谷粒商城のRedisESRabbit MQ集群

文章目录 前言一、搭建Redis集群三、搭建ES集群三、搭建Rabbit MQ集群 前言 本篇是谷粒商城集群部署篇&#xff0c;搭建Redis、ES、Rabbit MQ集群实践的个人笔记&#xff0c;也是谷粒商城笔记的最后一篇。集群相关的理论性内容&#xff0c;会放在面试篇的笔记中。 一、搭建Redi…

孙赢利_11月17日_超分周报

一. 康佳PC端实现&#xff1a;1080 → 4K 实时超分 1. 将图像预处理操作从 CPU → GPU 运行 2. 后处理部分操作 从 CPU → GPU 运行 inference_realesrgan_Animal_Video.py import argparse import cv2 import glob import os from basicsr.archs.rrdbnet_arch import RRDBNe…

录的视频怎么消除杂音?从录制到后期的杂音消除攻略

在录制视频时&#xff0c;杂音往往是一个令人头疼的问题。无论是环境噪音、设备噪音还是电磁干扰&#xff0c;杂音的存在都会极大地影响视频的听觉体验。录的视频怎么消除杂音&#xff1f;通过一些前期准备和后期处理技巧&#xff0c;我们可以有效地消除这些杂音&#xff0c;提…

论文《基于现实迷宫地形的电脑鼠设计》深度分析——智能车驱动算法

论文概述 《基于现实迷宫地形的电脑鼠设计》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实迷宫地…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目&#xff1a;分发糖果 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每…

vue3点击按钮el-dialog对话框不显示问题

vue3弹框不显示问题&#xff0c;控制台也没报错 把 append-to-body:visible.sync"previewDialogOpen" 改为 append-to-bodyv-model"previewDialogOpen" 就好了。

wordpress使用相关

这里写目录标题 遇到的相关问题WordPress安装插件过程中遇到需要ftp出现确实XMLReader 插件的提示cURL Support Missing&#xff08;curl 缺失&#xff09; 遇到的相关问题 WordPress安装插件过程中遇到需要ftp 一般在这个位置 出现确实XMLReader 插件的提示 解决&#xff1a…

21.3D surface

3D surface """ File : 05-decoding-Major Name : 3d_surface.py Author : lyq Date : 2024/11/16 23:10 Envi : PyCharm Description: files details """ import numpy as np import matplotlib.pyplot as plt# 设置全局默认字体…