当前位置: 首页 > news >正文

springboot第12集:DAO功能代码

在Spring Boot中,DAO是数据访问对象的缩写,它是一种设计模式用于提供对数据库操作的抽象层。通过使用DAO模式,我们可以将数据操作与业务逻辑分离,并提供一个单独的接口来执行所有的数据库操作。

在Spring Boot中,通常使用Spring Data JPA来实现DAO。Spring Data JPA是Spring Framework的子项目之一,用于简化JPA(Java Persistence API)的开发。Spring Data JPA提供了一些默认实现,如自动生成常见的SQL查询等。

要使用DAO,首先需要创建一个DAO接口并继承自Spring Data JPA提供的CrudRepository或JpaRepository接口。然后,定义该接口所代表的实体类及其主键类型。例如:

public interface UserRepository extends JpaRepository<User, Long> {// 自定义查询方法List<User> findByLastName(String lastName);
}

在上面的示例中,UserRepository是一个DAO接口,其中User是实体类,Long是主键类型。findByLastName是一个自定义的查询方法。

最后,在Service或Controller中注入该DAO接口并调用其方法即可完成对数据库的操作。

  1. 确保com.example.app.dao.ILoginDao接口已经被定义为一个Bean并被Spring容器管理了。可以通过在该接口上加上@Component注解或者在配置文件中使用<bean>标签来将它声明为一个bean。

  2. 确保com.example.app.service.impl.LoginService类已经被Spring容器管理了。可以在该类上加上@Service注解或者在配置文件中使用<bean>标签来将它声明为一个bean。

  3. 确保在com.example.app.service.impl.LoginService类中,已经正确地注入了com.example.app.dao.ILoginDao类型的bean。可以在该字段上加上@Autowired注解或者在构造函数中进行注入。

在Spring Boot中,DAO(Data Access Object)是一种设计模式,它提供了一个抽象层来访问数据库。使用DAO模式能够将数据操作与业务逻辑分离,并提供统一的接口来执行所有的数据库操作。Spring Boot通过整合Spring Data JPA和MyBatis等ORM框架来实现DAO功能。

下面是一个使用Spring Data JPA实现DAO的示例:

1.创建一个实体类User,用来映射数据库表的字段:

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String username;@Column(nullable = false)private String password;@Column(nullable = false)private String email;// getters and setters
}

2.创建一个继承自JpaRepository的接口UserRepository,用于定义User实体的数据访问接口:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);Boolean existsByUsername(String username);Boolean existsByEmail(String email);
}

3.在Service层中使用UserRepository

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long id) {return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));}public User saveUser(User user) {return userRepository.save(user);}public void deleteUser(Long userId) {userRepository.deleteById(userId);}
}

在这个示例中,UserService类注入了一个UserRepository的实例,并使用内置的方法来实现对用户数据的增删改查操作。

4.在Controller层中调用UserService

@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.getUserById(id);return ResponseEntity.ok(user);}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.saveUser(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.deleteUser(id);return ResponseEntity.noContent().build();}
}

在这个示例中,UserController通过注入UserService实例来访问和操作用户数据。其中,@GetMapping@PostMapping@DeleteMapping注解分别对应HTTP GET、POST和DELETE请求,Spring Boot会自动将JSON格式的请求体解析成Java对象。

综上所述,使用DAO模式可以将数据操作与业务逻辑分离,并提供统一的接口来执行所有的数据库操作。在Spring Boot中,我们可以使用ORM框架(如Spring Data JPA和MyBatis)来实现DAO功能。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsd"><bean id="loginDao" class="com.example.app.dao.LoginDaoImpl"/></beans>

@Autowired(required=true)注解表示该属性必须在Spring容器中找到对应的bean进行注入,如果找不到就会抛出异常。如果想要取消这个强制依赖关系,可以将required属性设置为false

DefaultResultSetHandler.instantiateCollectionPropertyIfAppropriate() 是 MyBatis 中用于实例化集合类型属性的方法。当查询语句返回多条记录时,MyBatis 会调用该方法将结果集封装到一个集合对象中,以便后续处理。

具体来说,该方法首先会检查传入参数 resultContext 是否包含集合类型属性,并且该属性为 null 或空集合。如果是,则会通过反射创建一个新的集合对象,并将其赋值给对应的属性。这个集合对象的类型由 resultMap 中定义的集合类型指定。如果 resultMap 中没有指定集合类型,则默认使用 java.util.ArrayList

需要注意的是,该方法仅在 resultType 为集合类型(例如 ListSet 等)时才会被调用。如果 resultType 是其他类型(如自定义 Java 对象),则不会调用该方法。

假设我们有一个 User 类,其中包含一个名为 orders 的属性,表示用户的订单列表:

public class User {private Integer id;private String name;private List<Order> orders;// getters and setters
}public class Order {private Integer id;private String product;private Integer quantity;// getters and setters
}

在 MyBatis 中,我们可以编写如下的查询语句来查询用户及其订单:

<select id="getUserWithOrders" resultMap="userResultMap">SELECT u.*, o.id AS order_id, o.product, o.quantityFROM user uLEFT JOIN order o ON u.id = o.user_idWHERE u.id = #{id}
</select>

这里使用了 LEFT JOIN 来将用户和订单关联起来,查询结果中可能包含多条记录。在对这个查询结果进行映射时,MyBatis 会通过以下步骤处理集合类型属性 orders

  1. userResultMap 中,我们需要使用 <collection> 元素来指定如何映射 orders 属性:

<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="product" column="product"/><result property="quantity" column="quantity"/></collection>
</resultMap>

"Initializing Spring DispatcherServlet 'dispatcherServlet'"是Spring框架在启动时输出的日志信息之一。它表示正在初始化Spring MVC中的DispatcherServlet,即Web请求的入口点。

DispatcherServlet是Spring MVC模式中的核心组件之一。它负责接收来自客户端的HTTP请求,并将请求分派到合适的控制器(Controller)进行处理。在Spring框架中,可以通过配置多个DispatcherServlet实例来处理不同URL模式的请求。

  1. 使用@Component注解:使用@Component注解可以将一个类声明为组件,并且告诉Spring容器需要将它实例化为一个bean。使用这个注解后,可以在其他组件中通过@Autowired来引用该bean。

  2. 使用@Configuration和@Bean注解:使用@Configuration注解可以将一个类声明为配置类,表示它会定义一组Bean。通过在方法上添加@Bean注解,可以将该方法返回的对象声明为一个Bean,Spring容器就会使用该方法创建并管理该Bean。

  3. 使用@Import注解:使用@Import注解可以将其他类或配置类导入到当前配置类中。通过这种方式,可以将其他Java类或配置类中定义的Bean添加到当前应用程序上下文中。

  4. 使用@Conditional注解:使用@Conditional注解可以根据条件仅仅创建某些bean。当特定条件满足时,该bean才会被创建并添加到应用程序上下文中。

  5. 使用FactoryBean接口:实现FactoryBean接口可以创建一个工厂类,用于创建其他Bean的实例。FactoryBean接口提供了标准的生命周期回调方法,因此可以控制Bean的创建过程。

注解 @SpringBootApplication 用于启动Spring Boot应用程序、@MapperScan("com.example.app.dao") 用于扫描Mybatis Mapper接口并生成代理对象、@ImportResource("classpath:applicationContext.xml") 用于加载XML配置文件。

另外,该类还继承了 SpringBootServletInitializer 并重写了它的 configure() 方法,这表明正在使用 WAR 部署方式来部署的应用程序。

在MyBatis框架中,@MapperScan("com.example.app.dao")@MapperScan("com.example.app.mapper")注解的作用是扫描指定包下的Java接口,将其注册为MyBatis的Mapper接口。

通常情况下,这两个注解没有本质上的区别,只是命名不同而已。开发者可以根据自己的实际业务需求来选择更加合适的命名方式,以方便阅读和维护代码。

需要注意的是,使用时应该确保注解中的包路径与Mapper接口所在的包路径相匹配,否则可能会导致Mapper接口无法被正确扫描和注册。

将 com.example.app.entity.Login 类型的对象强制转换为 com.alibaba.fastjson.JSONObject 类型,但是这两个类不能直接互相转换导致了异常。

要修复这个问题,需要检查代码中涉及到这两个类的部分,看看是否错误地进行了类型转换或者使用了错误的数据类型。可能需要修改代码以确保正确的类型转换才能够顺利执行。

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

相关文章:

springboot第12集:DAO功能代码

在Spring Boot中&#xff0c;DAO是数据访问对象的缩写&#xff0c;它是一种设计模式用于提供对数据库操作的抽象层。通过使用DAO模式&#xff0c;我们可以将数据操作与业务逻辑分离&#xff0c;并提供一个单独的接口来执行所有的数据库操作。 在Spring Boot中&#xff0c;通常使…...

基于KZG多项式承诺方案的RLN

1. 引言 RLN——Rate-Limiting Nullifier为PSE团队主导的项目&#xff0c;源自&#xff1a; Barry White Hat 2019年博客 Semaphore RLN, rate limiting nullifier for spam prevention in anonymous p2p setting RLN&#xff08;Rate-Limiting Nullifier&#xff09;是一种…...

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了&#xff0c;在这段时间里&#xff0c;随着Java版本的不断迭代&#xff0c;Java新特性的不断出现&#xff0c;使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一&#xff0c;Java一直排行在编程语言热门程度的前3名。 可想而…...

敏捷ACP.敏捷估计与规划.Mike Cohn.

第一部分 传统规划失败的原因 vs 敏捷规划有效的原因 传统的项目规划方式往往会让我们失望。要回答-一个 新产品的范围/进度/资源的组合问题&#xff0c;传统规划过程不一定会产生令人非常满意的答案和最终产品。以下- -些论据可以支持这个结论: ●大约2/3的项目会显著超…...

[创新工具和方法论]-01- DOE课程基础知识

文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究&#xff1f;步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…...

LeetCode-1033. 移动石子直到连续

题目链接 LeetCode-1033. 移动石子直到连续 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 这题目挺难懂的&#xff0c;得画画图才能更好的理解 这也是LeetCode的尿性&#xff0c;习惯了&#xff0c;非得整这种别人看不懂的鸟语 你可以这样理解&a…...

JVM调优入门指南:掌握步骤、参数和场景

前言 作为Java开发者&#xff0c;我们经常需要优化应用的性能&#xff0c;其中JVM调优是非常重要的一部分。在本文中&#xff0c;我们将介绍JVM调优的一般步骤和方法&#xff0c;了解JVM调优参数&#xff0c;如堆大小、新生代比例、GC算法等参数的作用和配置方式&#xff0c;并…...

基于JSP+MySQL的跳蚤市场网站设计与开发

摘 要 在当今社会,网络信息已经不是什么很陌生的词汇,每天都在这个信息时代里生活着并且享受着它带来的与众不同。网络购物可以说是飞速发展的,这种购物方式逐渐的影响着人们的衣食住行。所以利用计算机实现 跳蚤市场网站设计与开发势在必行。本网站是一个校园的跳蚤市场网…...

内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络

并非为了教学&#xff0c;仅供自己记录&#xff0c;方便下次用。所以内容不会刻意花时间写的很细节详细。 1. 服务器NPS配置 NPS install安装后&#xff0c;配置文件会在其他位置&#xff0c;通过是 /etc/nps/nps.conf目录。 找到进行修改&#xff0c;主要修改的是http_proxy_p…...

ToLua框架

ToLua 是一个用于在 Unity 中为 Lua 提供 C# 语言绑定的框架。通过 ToLua&#xff0c;你可以方便地将 C# 代码暴露给 Lua 脚本&#xff0c;并在 Lua 脚本中调用 C# 类、方法和属性。 更新流程 原理&#xff1a;使用AssetBundle进行资源的更新&#xff0c;而由于lua运行时才编…...

Golang-常见数据结构Map

Map map 是一种特殊的数据结构&#xff1a;一种元素对&#xff08;pair&#xff09;的无序集合&#xff0c;pair 的一个元素是 key&#xff0c;对应的另一个元素是 value&#xff0c;所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构&#xff1a;给定 key&…...

基于空间矢量脉宽调制(SVPWM)的并网逆变器研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

介绍tcpdump在centos中的使用方法

tcpdump是一款强大的命令行数据包分析器&#xff0c;支持多种过滤和抓包参数。下面将介绍tcpdump的常用抓包参数。当需要监控CentOS系统的网络流量或者进行网络故障排查时&#xff0c;可以使用tcpdump来捕获数据包并进行分析。 下面介绍在CentOS中使用tcpdump的方法&#xff1…...

机器学习实战:Python基于DT决策树模型进行分类预测(六)

文章目录 1 前言1.1 决策树的介绍1.2 决策树的应用 2 Scikit-learn数据集演示2.1 导入函数2.2 导入数据2.3 建模2.4 评估模型2.5 可视化决策树2.6 优化模型2.7 可视化优化模型 3 讨论 1 前言 1.1 决策树的介绍 决策树&#xff08;Decision Tree&#xff0c;DT&#xff09;是一…...

操作系统之进程同异步、互斥

引入 异步性是指&#xff0c;各并发执行的进程以各自独立的、不可预知的速度向前推进。 但是在一定的条件之下&#xff0c;需要进程按照一定的顺序去执行相关进程&#xff1a; 举例说明1&#xff1a; 举例说明2: 读进程和写进程并发地运行&#xff0c;由于并发必然导致异步性…...

你了解这2类神经性皮炎吗?常常预示着这5类疾病!

神经性皮炎属于慢性皮肤病&#xff0c;患者皮肤可出现局限性苔藓样变&#xff0c;同时伴有阵发性瘙痒。神经性皮炎易发生在颈部两侧和四肢伸侧&#xff0c;中年人是高发人群。到目前为止神经性皮炎病因还并不是很明确&#xff0c;不过一部分病人发病前常常出现精神神经方面异常…...

二叉搜索树【Java】

文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树&#xff0c;是一种具有一定性质的特殊的二叉树&#xff1b; 二叉搜索树的性质 若它的左子树不为空&#xff0c;则左子树上结点的值均小于根节点的值&#xff1b; 若它的右子树不为空&a…...

二叉树的遍历方式

文章目录 层序遍历——队列实现分析Java完整代码 先序遍历——中左右分析递归实现非递归实现——栈实现 中序遍历——左中右递归实现非递归实现——栈实现 后续遍历——左右中递归实现非递归实现——栈加标志指针实现 总结 层序遍历——队列实现 给你二叉树的根节点 root &…...

SpringCloud01

SpringCloud01 微服务入门案例 实现步骤 导入数据 实现远程调用 MapperScan("cn.itcast.order.mapper") SpringBootApplication public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}…...

SpringBoot整合Redis实现点赞、收藏功能

前言 点赞、收藏功能作为常见的社交功能&#xff0c;是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库&#xff0c;可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能&#xff0c;并提供前后端页面的…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...