【问题标题】:Need example of INNER JOIN for 2 tables - Entity and EntityCategory - for MVC architecture需要 2 个表的 INNER JOIN 示例 - Entity 和 EntityCategory - 适用于 MVC 架构
【发布时间】:2020-10-27 23:22:18
【问题描述】:

我需要一个适用于 MVC 架构的示例工作 Java Web 应用程序的工作示例。需要的技术只有:带 JSP 和 Servlet 的 JDBC,最好是 MySQL。 我不需要 Hybernate 和 Spring。 示例数据库可能仅包含 2 个表,如用户和用户角色或(产品和产品类别等),它们通过 INNER JOIN 连接。

尽管非常感谢您提供示例项目的链接,但我也希望对我应该使用什么提出建议:

  1. 示例项目的

    UserRole class 还是 enum

  2. reference "私有 UserRole userRole;"或“私有 int userRoleId;”在 User 类中?

  3. 作为 ListAllRecords 方法的示例,如何利用连接 usersuser_roles 表的查询结果:

    SELECT users.*, user_roles.name FROM users INNER JOIN user_roles ON user_role_id = user_roles.id;

以下是我想要了解的项目的详细信息:

我的设计是:

实体类:

package com.project.entity.temp;

public class User {
    private int id;
    private String name;
    private String password;
    private UserRole userRole;
}

public class UserRole {
    private int id;
    private String name;
}

SQL 查询:

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`user_roles`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`user_roles` ;

CREATE TABLE IF NOT EXISTS `mydb`.`user_roles` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`users`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`users` ;

CREATE TABLE IF NOT EXISTS `mydb`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  `user_role_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
  INDEX `fk_users_user_roles_idx` (`user_role_id` ASC) VISIBLE,
  CONSTRAINT `fk_users_user_roles`
    FOREIGN KEY (`user_role_id`)
    REFERENCES `mydb`.`user_roles` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    试试下面

    Maven 依赖 -

    javax.persistence
    javax.persistence-api
    2.2

    或者

    javax.persistence 持久性API 1.0.2
     package com.project.entity.temp;
    
    import javax.persistence.Entity;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    
    @Entity
    public class User {
        @Id
        private int id;
        private String name;
        private String password;
    
        @OneToOne
        private UserRole userRole;
    }
    
    
    @Entity
    public class UserRole {
        
    
        @Id 
        private int id;
    
        @OneToOne
        private User user; 
    
        private String name;
    }
    

    【讨论】:

    • Mahesh,非常感谢您的建议,但不幸的是,此解决方案使用了 Hibernate 中的注释。但是,正如我在最初的求助请求中提到的,解决方案不应包括 Hibernate 或 Spring。你有原生 JDBC/JSP/Servlets/EL 的东西吗?
    • 好的,我已经更新了答案,这些来自 Javax.persistence 即 JPA 实现,而不是来自 spring 或 hibernate 包。如果您尝试完全原始,那么您可以使用基于结果集的对象映射来创建您的或查询。
    • 再次感谢,Mahesh!尽管如此,它仍在使用与 Hibernate 相关的注释。我将使用我之前遵循的方式,但是如果有人可以改进它,欢迎更新当前线程。
    【解决方案2】:

    我遵循这种方法,但想知道这是否是实现目标的正确方法:

    1. 使用此查询获得结果集
      SELECT users.*, user_roles.name FROM users INNER JOIN user_roles ON user_role_id = user_roles.id;
    2. 循环遍历记录并从 ResultSet 数据填充 UserRoles 对象
        user = new User();
        userRole = new UserRole();
        user.setId(resultSet.getInt("id"));
        user.setName(resultSet.getString("name"));
        user.setPassword(resultSet.getString("password"));
        userRole.setId(resultSet.getInt("user_role_id"));
        userRole.setName(resultSet.getString("user_roles.name"));
        user.setUserRole(userRole);
    
    1. 从 JSP 表单获取数据时会使用隐藏字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2016-11-24
      相关资源
      最近更新 更多