Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring mvc使用hibernate进行更新_Java_Mysql_Hibernate_Spring Mvc - Fatal编程技术网

Java spring mvc使用hibernate进行更新

Java spring mvc使用hibernate进行更新,java,mysql,hibernate,spring-mvc,Java,Mysql,Hibernate,Spring Mvc,两个月前,我开始使用JavaSpringMVC为iOS应用程序开发API。 为了澄清起见,我将用一个例子来解释我的问题 假设我想更新一个用户名。 我的mySQL用户表有以下列:id、user\u id、email、display\u name。 我的做法是: 定义用户: User.java: package bean; public class User { String displayName; String email; String userId; getters/se

两个月前,我开始使用JavaSpringMVC为iOS应用程序开发API。 为了澄清起见,我将用一个例子来解释我的问题

假设我想更新一个用户名。 我的mySQL用户表有以下列:id、user\u id、email、display\u name。 我的做法是:

  • 定义用户:
  • User.java:

    package bean;
    public class User {
    
      String displayName;
      String email;
      String userId;
    
      getters/setters... 
    }
    
    package model;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="User")
    public class User {
    
      @Id
      @Column(name="id")
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;
    
      @Column(name = "user_id")
      private String userId;
    
      @Column(name = "user_name")
      private String displayName;
    
      @Column(name = "email")
      private String emai;
    
      all getters/setters...
    }
    
    2.定义DAO:

    UserDao.java:

    package dao;
    import bean.StandardResponse;
    
    public interface UserDao {
        public StandardResponse updateUserName(String user_id,String userName);
    }
    
    package dao;
    import model.User;
    import java.util.List;
    public interface UserDAO {
    
      public void updateUser(User p);
      other methods....
    
    }
    
    UserDaoImpl.java:

    package implement;
    import bean.User;
    import common.DatabaseConnect;
    
    public UserDaoImpl implements UserDao {
        private DatabaseConnect dbConnect; 
    
        public UserDaoImpl(DatabaseConnect dbConnect) {
          this.dbConnect = dbConnect;
        }
    
        public StandardResponse updateUserName(userId,userName) {
          if ((userId == null || userId.isEmpty()) ||(userName == null || userName.isEmpty())) return new StandardResponse("Error","Parameters not set!");
          String sql = null;
          Statement smt = dbConnect.createDataBaseConnectResourse();
          StandardResponse result = new StandardResponse("Error","Fail to update the record!");
          sql = "update User set user_name="+userName+" where user_id='"+userId+"'";
          int updateResult = 0;
          try {
            updateResult = smt.executeUpdate(sql);
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } finally {
            dbConnect.closeDatabaseConnectResource();
          }
          if (updateResult == 1) {
            result = new StandardResponse("Success","The record has been updated!");
          }
    
          return result;        
      }
    }
    
    package service;
    
    import java.util.List;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import dao.UserDAO;
    import model.User;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        private UserDAO userDAO;
    
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
    
        @Override
        @Transactional
        public void updateUser(User p) {
           this.userDAO.updateUser(p);
        }
    
        implementation of other methods...
    
    }
    
    3.控制器

    import org.springframework.stereotype.Controller;
    import java.util.List;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import bean.StandardResponse;
    import bean.User;
    import common.DatabaseConnect;
    import common.SpringApplicationContext;
    import dao.UserDao;
    import implement.UserDAOImpl;
    
    @Controller
    @RestController
    @RequestMapping("user")
    public class UserController {
    
      DatabaseConnect dbConnect = SpringApplicationContext.getApplicationContext().getBean("databaseConnect", DatabaseConnect.class);
      UserDao uiObject = new UserDaoImpl(dbConnect);
    
      @RequestMapping(value = "/updateUserName", method = RequestMethod.POST)
      public StandardResponse updateUserName(HttpServletRequest request, HttpServletResponse reponses, Model model) {
        StandardResponse srObject = uiObject.updateUserName(request.getparameter("userId"),request.getParameter("userName"));
        return srObject;
      }
    }
    
    我只是把重要的课程放在这里。我相信你能理解我在这里做什么。因此,如果有人访问提供用户名和用户名的URL:***/user/updateUserName,他可以更新该记录的用户名。这是功能性的

    我用同样的方法完成了整个项目。它正在工作。然后,我请一位有经验的程序员来看看我的代码,因为我是根据自己的理解理解出来的。我想知道他们在工业界做得怎么样。他给了我一些有价值的评论

  • 整个结构是错误的。我的刀不应该有逻辑。我至少应该有dao、服务和操作层。dao只处理数据库访问,服务处理所有逻辑和动作,handels通信并决定调用哪个服务
  • 在代码中手工编写SQL是非常糟糕的方法。我应该使用Hibernate
  • 我应该使用控制反转和依赖注入
  • 所以我开始更新我的代码以使用Hibernate

  • 定义用户:
  • User.java:

    package bean;
    public class User {
    
      String displayName;
      String email;
      String userId;
    
      getters/setters... 
    }
    
    package model;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="User")
    public class User {
    
      @Id
      @Column(name="id")
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;
    
      @Column(name = "user_id")
      private String userId;
    
      @Column(name = "user_name")
      private String displayName;
    
      @Column(name = "email")
      private String emai;
    
      all getters/setters...
    }
    
  • 道:
  • UserDao.java:

    package dao;
    import bean.StandardResponse;
    
    public interface UserDao {
        public StandardResponse updateUserName(String user_id,String userName);
    }
    
    package dao;
    import model.User;
    import java.util.List;
    public interface UserDAO {
    
      public void updateUser(User p);
      other methods....
    
    }
    
    UserDaoImpl.java

    package dao;
    import model.User;
    import java.util.List;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.stereotype.Repository;
    
    import model.User;
    
    @Repository
    public class PersonDAOImpl implements PersonDAO {
    
        private SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sf){
            this.sessionFactory = sf;
        }
    
        @Override
        public void updatePerson(Person p) {
            Session session = this.sessionFactory.getCurrentSession();
            session.update(p);
        }
    
        implementations of other methods....
    
    }
    
  • 服务:
  • UserService.java:

    package service;
    
    import java.util.List;
    
    import model.User;
    
    public interface UserService {
    
        public void updateUser(User p);
        other methods....
    
    }
    
    UserServiceImpl.java:

    package implement;
    import bean.User;
    import common.DatabaseConnect;
    
    public UserDaoImpl implements UserDao {
        private DatabaseConnect dbConnect; 
    
        public UserDaoImpl(DatabaseConnect dbConnect) {
          this.dbConnect = dbConnect;
        }
    
        public StandardResponse updateUserName(userId,userName) {
          if ((userId == null || userId.isEmpty()) ||(userName == null || userName.isEmpty())) return new StandardResponse("Error","Parameters not set!");
          String sql = null;
          Statement smt = dbConnect.createDataBaseConnectResourse();
          StandardResponse result = new StandardResponse("Error","Fail to update the record!");
          sql = "update User set user_name="+userName+" where user_id='"+userId+"'";
          int updateResult = 0;
          try {
            updateResult = smt.executeUpdate(sql);
          } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } finally {
            dbConnect.closeDatabaseConnectResource();
          }
          if (updateResult == 1) {
            result = new StandardResponse("Success","The record has been updated!");
          }
    
          return result;        
      }
    }
    
    package service;
    
    import java.util.List;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import dao.UserDAO;
    import model.User;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        private UserDAO userDAO;
    
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
    
        @Override
        @Transactional
        public void updateUser(User p) {
           this.userDAO.updateUser(p);
        }
    
        implementation of other methods...
    
    }
    
    现在,我只需要编写一个类来处理请求并调用这个updateUser服务。整个结构看起来比我的好。但是,请求不会给我整个用户对象。我只能得到用户名和用户名。我也不允许在dao中放置逻辑。因此,我必须首先查询表以获得整个用户对象,然后更新用户名。与我以前做的相比,一个SQL处理更新。现在使用Hibernate,我需要一个查询和一个更新

    我在StackOverflow上找到了一个解决方案,我可以使用HQL一步完成这项工作。但是我认为使用Hibernate的目的是让我们不用编写SQL。如果我需要编写HQL,为什么不继续使用编写SQL的方法呢

    那么,有没有一种方法可以使用Hibernate进行更新,而不首先在该结构中查询表?或者这是为了更好的结构而进行的权衡?


    很抱歉,我用了一个很长的例子来回答这个问题。但我想不出其他方法来清楚地解释整个故事

    那么,有没有一种方法可以使用Hibernate进行更新,而不首先在这个结构中查询表?或者这是为了更好的结构而进行的权衡? 没有折衷,您可以像在SQL中一样使用HQL(Hibernate查询语言)进行更新

    您可以查看以下代码:

    UserDAOImpl类:

    UserServiceImpl类:

    控制器类:


    您需要从哪里获取用户名和用户名?从UI?是的。我从UI中获取用户id和用户名。它来自iOS应用程序或网页。hibernate主要用于ORM(对象关系映射)。通常,您必须编写通用sql来执行所需的操作。因此,使用Hibernate的目的不是为了避免代码中的sql语句?在java代码中编写SQL语句并不是不专业的行为?对于复杂的SQL查询,您可以编写本机查询,但这样做的目的是通过调用beanObject.save()、beanObject.update()等来避免它们。但是如果您有条件,您需要像下面的示例中那样编写SQL语句,谢谢,@javaguy。我知道我能做到。但我的困惑是:我以前可以用一条SQL语句进行更新。现在我正在使用Hibernate,我必须进行额外的查询(选择),然后更新。一个额外的DB命中,所以我用性能来换取更好的结构?谢谢你,@javaguy。我想HQL是实现这一点的唯一方法。我想也许Hibernate有一种简单的方法可以在没有HQL的情况下进行更新因为我从使用SQL语句改为使用hibernate的主要原因是,他们告诉我,我正在编写包含SQL语句的糟糕代码……因此,我觉得如果我必须使用HQL来完成这项工作,那是很讽刺的。如果SQL查询涉及联合,我可以同意这是一个复杂的SQL。但是对于“update User set User_name='Peter'where User_id=1”这样的语句…我想我对Hibernate的期望太高了…非常感谢你的解释。我非常感谢你的帮助answer@javaguy.