gpt4 book ai didi

java spring mvc 使用hibernate做update

转载 作者:行者123 更新时间:2023-11-29 02:47:15 24 4
gpt4 key购买 nike

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

假设我想更新用户名。我的 mySQL 用户表有列:id、user_id、email、display_name。我的方法是:

  1. 定义用户:

用户.java:

package bean;
public class User {

String displayName;
String email;
String userId;

getters/setters...
}

2.定义一个DAO:

用户道.java:

package dao;
import bean.StandardResponse;

public interface UserDao {
public StandardResponse updateUserName(String user_id,String userName);
}

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;
}
}

3. Controller

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;
}
}

我只是把重要的类(class)放在这里。我相信你能理解我在这里做什么。因此,如果有人访问 URL:****/user/updateUserName 并提供 userId 和 userName,他就可以更新该记录的用户名。它是功能性的。

我用同样的方法完成了整个项目。这是工作。然后,我请一位有经验的程序员看我的代码,因为我是根据自己的理解弄清楚的。我想知道他们在工业上的表现如何。他给了我一些宝贵的意见。

  1. 整个结构是错误的。我的道不应该有逻辑。我至少应该有 dao、服务和操作层。 dao 只处理数据库访问,service 处理所有逻辑和操作,处理通信并决定调用哪个服务。
  2. 在代码中手写 SQL 是一种非常糟糕的方法。我应该使用 Hibernate。
  3. 我应该使用反向控制和依赖注入(inject)。(我不会在这篇文章中处理这个问题。)

所以我开始更新我的代码以使用 Hibernate。

  1. 定义用户:

用户.java:

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...
}
  1. 道:

用户道.java:

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....

}
  1. 服务:

用户服务.java:

package service;

import java.util.List;

import model.User;

public interface UserService {

public void updateUser(User p);
other methods....

}

UserServiceImpl.java:

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 服务。整个结构看起来比我的好。但是,该请求不会给我整个用户对象。我能得到的只是 user_id 和 user_name。我也不允许将逻辑放在 dao 中。所以我必须先查询表以获取整个用户对象,然后更新用户名。与我以前做的相比,一个 SQL 处理更新。现在使用 Hibernate,我需要 1 个查询和 1 个更新。

我在 StackOverflow 上找到了一个解决方案,我可以使用 HQL 一步完成。但我认为使用 Hibernate 的目的是将我们从编写 SQL 中解放出来。如果我需要编写 HQL,为什么我不继续使用编写 SQL 的方法。

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

很抱歉,我为这个问题使用了一个非常长的例子。但是我想不出其他的方法来把整个故事说清楚。

最佳答案

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

可以看下面的代码:

UserDAOImpl class:

    @Repository
//you are calling this in ur code as PersonDAOImpl..change it to UserDAOImpl
public class UserDAOImpl implements UserDAO {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}

@Override
public int updateUser(String userId, String userName) {
Session session = this.sessionFactory.getCurrentSession();
Query query = session.createQuery("update User set userName =:userName where userId = :userName ");
query.setString("userName", userName);
query.setString(userName, userName);
int result = query.executeUpdate();
return result;
}
}

UserServiceImpl class:

@Service
public class UserServiceImpl implements UserService {

private UserDAO userDAO;

public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}

@Override
@Transactional
public void updateUserName(String userId, String userName) {

if(userId !=null && userName != null) {
int result = this.userDAO.updateUser(userId, userName);

if(result==0) //userid not available {
//if userid is NOT available, what to do? check your requirement and handle properly
}

}
} else {
//throw exception
}
}
implementation of other methods...
}

Controller Class:

@Controller
@RestController
@RequestMapping("user")
public class UserController {

@Autowired
private UserService userService;

@RequestMapping(value = "/updateUserName", method = RequestMethod.POST)
public StandardResponse updateUserName(HttpServletRequest request, HttpServletResponse reponses, Model model) {
StandardResponse srObject = userService.updateUserName(request.getparameter("userId"),request.getParameter("userName"));
return srObject;
}
}

关于java spring mvc 使用hibernate做update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40366696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com