- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在Java后端开发中,我们经常需要根据前端传递的参数(如字段名)来动态查询数据库中的数据。这种需求通常出现在需要实现通用查询功能或者复杂查询接口的场景中。为了实现这个功能,我们需要结合Java的反射机制、MyBatis或JPA等持久层框架,以及SQL动态拼接等技术。本文将详细讲解如何实现这一功能,并提供完整的代码示例.
<if>
、<choose>
、<when>
、<otherwise>
、<trim>
、<where>
、<set>
等标签,可以方便地实现动态SQL。以下是一个完整的示例,包括前端请求、后端控制器、服务层、MyBatis Mapper以及数据库实体类.
package com.example.demo.entity;
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// Getters and Setters
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.jdbc.SQL;
import java.util.List;
import java.util.Map;
public interface UserMapper {
@SelectProvider(type = UserSqlProvider.class, method = "dynamicSelect")
List<User> dynamicSelect(@Param("params") Map<String, Object> params);
class UserSqlProvider {
public String dynamicSelect(@Param("params") Map<String, Object> params) {
return new SQL() {{
SELECT("*");
FROM("user");
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
WHERE(entry.getKey() + " = #{params." + entry.getKey() + "}");
// 注意:这里为了简单起见,只考虑了单个字段的等值查询,
// 实际应用中可以扩展为支持多个字段、多种条件的查询
break; // 如果有多个字段,需要修改这里的逻辑,比如使用 AND 连接多个条件
}
}
}}.toString();
}
}
}
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> queryByField(String fieldName, Object value) {
Map<String, Object> params = new HashMap<>();
params.put(fieldName, value);
return userMapper.dynamicSelect(params);
}
}
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/query")
public List<User> queryByField(@RequestParam String fieldName, @RequestParam Object value) {
return userService.queryByField(fieldName, value);
}
}
这里以application.yml为例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.demo.entity
注意:如果使用注解方式配置MyBatis Mapper,则不需要mapper-locations配置.
假设数据库中有一个名为user的表,结构如下:
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100)
);
启动Spring Boot应用,通过浏览器或Postman等工具发送HTTP GET请求:
复制代码
http://localhost:8080/users/query?fieldName=name&value=John
如果数据库中有一个名为John的用户,则应该返回该用户的所有信息.
本文详细讲解了如何在Java后端根据前端传递的字段名动态查询数据库中的数据。通过结合反射机制、MyBatis动态SQL拼接等技术,我们实现了这一功能。该示例代码可以直接运行,并具有一定的参考价值和实际意义。在实际应用中,可以根据具体需求对代码进行扩展和优化,比如支持多个字段的查询、多种条件的查询等.
最后此篇关于Java根据前端返回的字段名进行查询数据的文章就讲到这里了,如果你想了解更多关于Java根据前端返回的字段名进行查询数据的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!