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接口并调用其方法即可完成对数据库的操作。
确保
com.example.app.dao.ILoginDao接口已经被定义为一个Bean并被Spring容器管理了。可以通过在该接口上加上@Component注解或者在配置文件中使用<bean>标签来将它声明为一个bean。确保
com.example.app.service.impl.LoginService类已经被Spring容器管理了。可以在该类上加上@Service注解或者在配置文件中使用<bean>标签来将它声明为一个bean。确保在
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 为集合类型(例如 List、Set 等)时才会被调用。如果 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:
在
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模式的请求。
使用@Component注解:使用@Component注解可以将一个类声明为组件,并且告诉Spring容器需要将它实例化为一个bean。使用这个注解后,可以在其他组件中通过@Autowired来引用该bean。
使用@Configuration和@Bean注解:使用@Configuration注解可以将一个类声明为配置类,表示它会定义一组Bean。通过在方法上添加@Bean注解,可以将该方法返回的对象声明为一个Bean,Spring容器就会使用该方法创建并管理该Bean。
使用@Import注解:使用@Import注解可以将其他类或配置类导入到当前配置类中。通过这种方式,可以将其他Java类或配置类中定义的Bean添加到当前应用程序上下文中。
使用@Conditional注解:使用@Conditional注解可以根据条件仅仅创建某些bean。当特定条件满足时,该bean才会被创建并添加到应用程序上下文中。
使用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中,DAO是数据访问对象的缩写,它是一种设计模式用于提供对数据库操作的抽象层。通过使用DAO模式,我们可以将数据操作与业务逻辑分离,并提供一个单独的接口来执行所有的数据库操作。 在Spring Boot中,通常使…...
基于KZG多项式承诺方案的RLN
1. 引言 RLN——Rate-Limiting Nullifier为PSE团队主导的项目,源自: Barry White Hat 2019年博客 Semaphore RLN, rate limiting nullifier for spam prevention in anonymous p2p setting RLN(Rate-Limiting Nullifier)是一种…...
《站在巨人的肩膀上学习Java》
Java从诞生距今已经有28年了,在这段时间里,随着Java版本的不断迭代,Java新特性的不断出现,使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一,Java一直排行在编程语言热门程度的前3名。 可想而…...
敏捷ACP.敏捷估计与规划.Mike Cohn.
第一部分 传统规划失败的原因 vs 敏捷规划有效的原因 传统的项目规划方式往往会让我们失望。要回答-一个 新产品的范围/进度/资源的组合问题,传统规划过程不一定会产生令人非常满意的答案和最终产品。以下- -些论据可以支持这个结论: ●大约2/3的项目会显著超…...
[创新工具和方法论]-01- DOE课程基础知识
文章目录 1.DOE实验设计的介绍1.1 什么是实验设计DOE?1.2 DOE的优势有哪些?1.3 如何开展DoE研究?步骤 2.DOE实验培训3.数据分析步骤4.实验的随机化5.偏差6.R方 相关系数假设检验 7.三因子二水平全因子设计 1.DOE实验设计的介绍 实验设计是一种安排实验和分析实验数…...
LeetCode-1033. 移动石子直到连续
题目链接 LeetCode-1033. 移动石子直到连续 题目描述 题解 题解一(Java) 作者:仲景 这题目挺难懂的,得画画图才能更好的理解 这也是LeetCode的尿性,习惯了,非得整这种别人看不懂的鸟语 你可以这样理解&a…...
JVM调优入门指南:掌握步骤、参数和场景
前言 作为Java开发者,我们经常需要优化应用的性能,其中JVM调优是非常重要的一部分。在本文中,我们将介绍JVM调优的一般步骤和方法,了解JVM调优参数,如堆大小、新生代比例、GC算法等参数的作用和配置方式,并…...
基于JSP+MySQL的跳蚤市场网站设计与开发
摘 要 在当今社会,网络信息已经不是什么很陌生的词汇,每天都在这个信息时代里生活着并且享受着它带来的与众不同。网络购物可以说是飞速发展的,这种购物方式逐渐的影响着人们的衣食住行。所以利用计算机实现 跳蚤市场网站设计与开发势在必行。本网站是一个校园的跳蚤市场网…...
内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络
并非为了教学,仅供自己记录,方便下次用。所以内容不会刻意花时间写的很细节详细。 1. 服务器NPS配置 NPS install安装后,配置文件会在其他位置,通过是 /etc/nps/nps.conf目录。 找到进行修改,主要修改的是http_proxy_p…...
ToLua框架
ToLua 是一个用于在 Unity 中为 Lua 提供 C# 语言绑定的框架。通过 ToLua,你可以方便地将 C# 代码暴露给 Lua 脚本,并在 Lua 脚本中调用 C# 类、方法和属性。 更新流程 原理:使用AssetBundle进行资源的更新,而由于lua运行时才编…...
Golang-常见数据结构Map
Map map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key&…...
基于空间矢量脉宽调制(SVPWM)的并网逆变器研究(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
介绍tcpdump在centos中的使用方法
tcpdump是一款强大的命令行数据包分析器,支持多种过滤和抓包参数。下面将介绍tcpdump的常用抓包参数。当需要监控CentOS系统的网络流量或者进行网络故障排查时,可以使用tcpdump来捕获数据包并进行分析。 下面介绍在CentOS中使用tcpdump的方法࿱…...
机器学习实战: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 决策树的介绍 决策树(Decision Tree,DT)是一…...
操作系统之进程同异步、互斥
引入 异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。 但是在一定的条件之下,需要进程按照一定的顺序去执行相关进程: 举例说明1: 举例说明2: 读进程和写进程并发地运行,由于并发必然导致异步性…...
你了解这2类神经性皮炎吗?常常预示着这5类疾病!
神经性皮炎属于慢性皮肤病,患者皮肤可出现局限性苔藓样变,同时伴有阵发性瘙痒。神经性皮炎易发生在颈部两侧和四肢伸侧,中年人是高发人群。到目前为止神经性皮炎病因还并不是很明确,不过一部分病人发病前常常出现精神神经方面异常…...
二叉搜索树【Java】
文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树,是一种具有一定性质的特殊的二叉树; 二叉搜索树的性质 若它的左子树不为空,则左子树上结点的值均小于根节点的值; 若它的右子树不为空&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实现点赞、收藏功能
前言 点赞、收藏功能作为常见的社交功能,是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库,可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能,并提供前后端页面的…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
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通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
