Java spring mvc使用hibernate进行更新
两个月前,我开始使用JavaSpringMVC为iOS应用程序开发API。 为了澄清起见,我将用一个例子来解释我的问题 假设我想更新一个用户名。 我的mySQL用户表有以下列:id、user\u id、email、display\u name。 我的做法是: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
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,他可以更新该记录的用户名。这是功能性的
我用同样的方法完成了整个项目。它正在工作。然后,我请一位有经验的程序员来看看我的代码,因为我是根据自己的理解理解出来的。我想知道他们在工业界做得怎么样。他给了我一些有价值的评论
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...
}
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....
}
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.