java spring boot 是否提供像 php CodeIgniter 查询生成器这样的查询生成器
Does java spring boot provides query builder like php CodeIgniter query builder
我们正在 spring 启动开发一个应用程序,我们将在运行时创建动态表单并将其发布到我们的应用程序中,以 post 将表单数据导入数据库(MySql) JSON 格式。我们想创建一个通用的 api 来处理所有动态表单的 CRUD 操作。
我们知道 php code-igniter 框架查询构建器,它能够构建和执行查询。
https://www.codeigniter.com/userguide3/database/query_builder.html#inserting-data
例如:
$query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
);
$this->db->insert('mytable', $data);
在java spring boot.
中有什么方法(任何插件或 Maven 依赖项)可以做同样的事情(作为 php code-igniter)
Map<String, String> map = new TreeMap<>();
map.put("name","User Name");
map.put("dob", "30-3-1995");
map.put("address", "Address Line");
map.put("city", "Jaipur");
/* insert into user table */
db.insert("user",map);
实现类似功能的方法很少:
使用Spring数据JPA(大部分使用)
此模块根据约定从方法生成(或派生)查询,例如:
interface UsersRepository extends CrudRepository<User, Long> {
List<User> findByLastname(String lastname);
}
调用personRepository.findByLastName("Doe")
可以翻译成:
SELECT * FROM users WHERE last_name = 'Doe'
但是,要使 Spring 发挥这种魔力,它需要将“原始”SQL 查询返回的结果集映射到一个对象。这就是 ORM 概念的用武之地。因此,您需要执行额外的步骤:配置实体(即您的对象)并在它们之间设置所需的关系。例如:
@Entity
@Table(name = "users")
public class User {
@Id
private String id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
//constructor, getters and setters
}
现在 Spring 知道如何将列映射到对象并自动为您生成查询。更准确地说,它是由 hibernate(即 ORM 框架)在后台完成的,但不要让术语让您感到困惑。我建议在谷歌上多搜索一下 Spring Data JPA vs JPA vs Hibernate,因为它超出了这个问题的范围。
Spring Guides. You can also read about it more in the official documentation here 上有很好的初学者教程。
使用SpringJdbcTemplate
它可能更类似于 CodeIgniter 所做的,但不是使用“内部 API”,jdbcTemplate 使用“原始”SQL 语句:
jdbcTemplate.query(
"SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh" },
(rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name"))
).forEach(customer -> log.info(customer.toString()));
但是,如您所见,它 returns 一个结果集,您需要在其中手动映射域对象。
代码示例位于 Spring Guides. More documentation is available here。
还有其他选择,例如 jOOQ, MyBatis, and QueryDSL。
就我个人而言,在我处理的“生产”应用程序中,除了“Spring Data JPA”之外,我没有遇到任何方法(可能是因为它更接近 Java 代码并在幕后隐藏了很多 SQL 内部结构),尽管对前两个非常熟悉。我建议选择第一个,因为它很受欢迎,但最终取决于您。
由于决定你应该选择哪个答案超出了答案的范围,我会 post 一些额外的链接:
- JPA vs Spring JdbcTemplate
更新:(处理评论)
我仍然认为即使您的表单是“动态的”,您的 table 模式本质上也是“固定的”。您可以:
使用 JPA 实体映射“固定”字段(例如 id、时间戳等)。创建 dynamicForm 字段作为此实体的一部分 - 它将包含一个 json 字符串 -> 在 DB 中为“TEXT”类型:
@Entity
@Table(name = "forms")
public class FormEntity {
@Id
private String id;
private LocalDateTime created;
@Column(name = "dynamic_form")
private String dynamicForm;
//constructor, getters and setters
}
在 Java 中,创建您的地图(使用示例中的任何键值)作为单独的 class
使用 Jackson 的 ObjectMapper 将其序列化为字符串(这将是 json)。
将其映射到实体的“dynamicForm”字段:
public class MyBusinessLogicService {
public void processForm(Map<String, String> map) {
FormEntity formEntity = new FormEntity();
formEntity.setDynamicForm(objectMapper.writeValueAsString(yourMap));
//.... setting other values
formEntityRepository.save(formEntity);
}
}
当您阅读表单时,您将反序列化 dynamicForm
字段。
解决方案不受地图限制,您可以存储任何类型的对象。您面临的挑战是了解其中存在什么类型的“对象”。如果它是地图,您将不知道地图内部的键值。
我们正在 spring 启动开发一个应用程序,我们将在运行时创建动态表单并将其发布到我们的应用程序中,以 post 将表单数据导入数据库(MySql) JSON 格式。我们想创建一个通用的 api 来处理所有动态表单的 CRUD 操作。
我们知道 php code-igniter 框架查询构建器,它能够构建和执行查询。
https://www.codeigniter.com/userguide3/database/query_builder.html#inserting-data
例如:
$query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
); $this->db->insert('mytable', $data);
在java spring boot.
中有什么方法(任何插件或 Maven 依赖项)可以做同样的事情(作为 php code-igniter) Map<String, String> map = new TreeMap<>();
map.put("name","User Name");
map.put("dob", "30-3-1995");
map.put("address", "Address Line");
map.put("city", "Jaipur");
/* insert into user table */
db.insert("user",map);
实现类似功能的方法很少:
使用Spring数据JPA(大部分使用)
此模块根据约定从方法生成(或派生)查询,例如:
interface UsersRepository extends CrudRepository<User, Long> { List<User> findByLastname(String lastname); }
调用
personRepository.findByLastName("Doe")
可以翻译成:SELECT * FROM users WHERE last_name = 'Doe'
但是,要使 Spring 发挥这种魔力,它需要将“原始”SQL 查询返回的结果集映射到一个对象。这就是 ORM 概念的用武之地。因此,您需要执行额外的步骤:配置实体(即您的对象)并在它们之间设置所需的关系。例如:
@Entity @Table(name = "users") public class User { @Id private String id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; //constructor, getters and setters }
现在 Spring 知道如何将列映射到对象并自动为您生成查询。更准确地说,它是由 hibernate(即 ORM 框架)在后台完成的,但不要让术语让您感到困惑。我建议在谷歌上多搜索一下 Spring Data JPA vs JPA vs Hibernate,因为它超出了这个问题的范围。
Spring Guides. You can also read about it more in the official documentation here 上有很好的初学者教程。
使用SpringJdbcTemplate
它可能更类似于 CodeIgniter 所做的,但不是使用“内部 API”,jdbcTemplate 使用“原始”SQL 语句:
jdbcTemplate.query( "SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh" }, (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name")) ).forEach(customer -> log.info(customer.toString()));
但是,如您所见,它 returns 一个结果集,您需要在其中手动映射域对象。
代码示例位于 Spring Guides. More documentation is available here。
还有其他选择,例如 jOOQ, MyBatis, and QueryDSL。
就我个人而言,在我处理的“生产”应用程序中,除了“Spring Data JPA”之外,我没有遇到任何方法(可能是因为它更接近 Java 代码并在幕后隐藏了很多 SQL 内部结构),尽管对前两个非常熟悉。我建议选择第一个,因为它很受欢迎,但最终取决于您。
由于决定你应该选择哪个答案超出了答案的范围,我会 post 一些额外的链接:
- JPA vs Spring JdbcTemplate
更新:(处理评论)
我仍然认为即使您的表单是“动态的”,您的 table 模式本质上也是“固定的”。您可以:
使用 JPA 实体映射“固定”字段(例如 id、时间戳等)。创建 dynamicForm 字段作为此实体的一部分 - 它将包含一个 json 字符串 -> 在 DB 中为“TEXT”类型:
@Entity @Table(name = "forms") public class FormEntity { @Id private String id; private LocalDateTime created; @Column(name = "dynamic_form") private String dynamicForm; //constructor, getters and setters }
在 Java 中,创建您的地图(使用示例中的任何键值)作为单独的 class
使用 Jackson 的 ObjectMapper 将其序列化为字符串(这将是 json)。
将其映射到实体的“dynamicForm”字段:
public class MyBusinessLogicService { public void processForm(Map<String, String> map) { FormEntity formEntity = new FormEntity(); formEntity.setDynamicForm(objectMapper.writeValueAsString(yourMap)); //.... setting other values formEntityRepository.save(formEntity); } }
当您阅读表单时,您将反序列化
dynamicForm
字段。
解决方案不受地图限制,您可以存储任何类型的对象。您面临的挑战是了解其中存在什么类型的“对象”。如果它是地图,您将不知道地图内部的键值。