📅  最后修改于: 2023-12-03 15:20:22.172000             🧑  作者: Mango
在开发Web应用程序时,常常需要使用到数据库来保存和读取数据。Hibernate是一个流行的数据库访问框架,它可以帮助我们处理底层SQL语句,并提供了方便的对象关系映射(ORM)功能。而Struts 2是一个开源的Java Web应用程序框架,它可以帮助我们处理Web应用程序中的各种请求和响应。
在本文中,我们将介绍如何在Struts 2应用程序中集成Hibernate框架,以实现更方便的数据库访问。
我们需要在项目中添加以下依赖项,以便能够使用Hibernate框架:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
其中,hibernate-core
、hibernate-entitymanager
和hibernate-c3p0
是Hibernate框架的核心依赖项,mysql-connector-java
是MySQL数据库的驱动程序。
在src/main/resources
目录下,创建一个名为hibernate.cfg.xml
的文件,并添加以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
</session-factory>
</hibernate-configuration>
这个文件配置了Hibernate框架需要连接的数据库的信息,包括数据库的URL、用户名、密码以及数据库方言等。
在session-factory
元素中,我们还可以配置一些其他的属性,例如:
hibernate.show_sql
:是否在控制台中显示SQL语句,建议在开发阶段启用;hibernate.hbm2ddl.auto
:是否自动创建数据库表,建议在开发阶段启用,生产环境应该关闭。在使用Hibernate框架访问数据库时,我们需要定义一个Java类来表示数据库中的表,并使用注解来映射数据表和类属性。例如,假设我们有一个名为User
的表,该表包含id
、name
和email
三个字段,则可以创建一个名为UserEntity
的类,定义如下:
@Entity
@Table(name = "user")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
// getters and setters
}
在上面的代码中,我们使用@Entity
和@Table
注解来指定该类对应的数据表以及表的名称,在类的属性上使用@Column
注解来指定对象属性与数据库字段之间的映射关系。
DAO(Data Access Object)是一个用于访问数据库的对象,它封装了数据访问的细节,使得其他部分的代码可以专注于业务逻辑而不必关心底层的数据库操作。因此,我们需要创建一个名为UserDAO
的类,用于访问User
表:
@Repository
public class UserDAO {
@Autowired
private EntityManager entityManager;
public void save(UserEntity user) {
entityManager.persist(user);
}
public List<UserEntity> getAll() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<UserEntity> cq = cb.createQuery(UserEntity.class);
Root<UserEntity> root = cq.from(UserEntity.class);
cq.select(root);
TypedQuery<UserEntity> query = entityManager.createQuery(cq);
return query.getResultList();
}
}
在上面的代码中,我们使用EntityManager
对象来访问数据库,其中的persist
方法用于保存实体对象到数据库中,createQuery
方法用于查询数据库中的对象。
UserDAO
类使用@Repository
注解标记,表示该类是一个数据访问对象,并且Spring容器会负责创建和管理它。
Action是Struts 2应用程序中执行请求处理逻辑的对象。在此处,我们需要创建一个名为UserAction
的Action,用于处理用户请求:
@Namespace("/")
@ResultPath("/")
public class UserAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private UserDAO userDAO;
private UserEntity user;
private List<UserEntity> userList;
private Long id;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
public List<UserEntity> getUserList() {
return userList;
}
public void setUserList(List<UserEntity> userList) {
this.userList = userList;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String list() {
userList = userDAO.getAll();
return SUCCESS;
}
public String add() {
userDAO.save(user);
return SUCCESS;
}
}
在上面的代码中,我们使用@Namespace
注解来指定Action的命名空间,在ResultPath
注解中指定视图文件所在的目录。
UserAction
类使用了@Autowired
注解来注入UserDAO
对象,并且定义了一些不同的方法来处理不同的用户请求。例如,list
方法将查询所有的用户对象,并将结果保存在userList
属性中,而add
方法则将保存一个新的用户对象到数据库中。
在src/main/resources
目录下,创建一个名为struts.xml
的文件,并添加以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="userList" class="com.example.UserAction" method="list">
<result name="success">/userList.jsp</result>
</action>
<action name="userAdd" class="com.example.UserAction" method="add">
<result name="success">/userAdd.jsp</result>
</action>
</package>
</struts>
在上面的配置文件中,我们定义了一个名为default
的包,并在其中定义了两个Action,分别用于处理用户请求。
其中,/userList.jsp
和/userAdd.jsp
是用于展示用户列表和添加用户的页面。我们可以在jsp页面中使用标签库来显示和提交数据,例如:
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:iterator value="userList">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="email"/></td>
</tr>
</s:iterator>
<s:form action="userAdd" method="post">
<s:textfield name="user.name" label="Name" />
<s:textfield name="user.email" label="Email" />
<s:submit value="Submit" />
</s:form>
在上面的JSP代码中,我们使用<s:iterator>
标签库来迭代显示所有的用户对象,而<s:form>
标签库用于提交用户数据到服务器端。
现在,我们已经完成了所有的设置和配置,可以启动应用程序来测试它是否正常工作。我们可以使用一些常见的工具,例如Maven、Tomcat、Jetty等来启动Web应用程序。
在Web浏览器中访问http://localhost:8080/userList
,将会看到一个用户列表,该列表包括id
、name
和email
三个字段。我们可以在该页面上点击“添加用户”按钮来添加一个新的用户对象,该用户对象将被保存到数据库中。
通过以上步骤的操作,我们已经在Struts 2应用程序中成功集成了Hibernate框架,并使用它来访问数据库。这种集成方式可以提供更方便、更安全、更高效的数据访问方式,为Web应用程序的开发和维护带来了很多便利。