一、前言
暂无
二、操作过程
①、创建数据库及表并填入数据
②、生成数据库表对应的Java类对象和映射文件
Ⅰ、在Database Explorer视图中,点击连接的数据库,右键点击指定的数据库表,在弹出的快捷菜单中选着Hibernate Reverse Engineering。如下图所示,启动Hibernate反向工程向导界面。
Ⅱ、选择生成的Java类和映像文件所在的位置,生成Hibernate映射文件和Java POJO类。
内容 | 说明 |
Create POJO<>DB Table mapping information | 创建POJO与数据库表之间的映射信息,通俗点就是创建映射文件 |
Create a Hibernate mapping file (*.hbm.xml) for each database table | 为每个数据库表创建hibernate映射文件。 |
Add Hibernate mapping annotations to POJO (Hibernate 3.2 and above) | 添加hibernate映射注解到POJO (hibernate 3.2版本及以上支持) |
Update Hibernate configuation with mapping resource location | 更新本地映射文件 |
Java Data Object(POJO<>DB Table) | 通过数据表创建java数据对象,即创建实体。其下两个选项分别是创建抽象类以及选择父类,这个按用户需求自行选择。 |
Java Data Access Object(DAO)(Hibernate 3 only) | 创建数据访问对象,即创建DAO。 |
Ⅲ、选择主键生成策略Id Generate为identity
Ⅳ(这一步可以直接忽略)、Include referenced tables (A->B) 和 Include referenced tables (A<-B) ,这两个一定要选择,否则myeclipse不能给你生成一对多、多对多等映射,如果只想生成单项映射,可以去掉一个,一般我们都选择,双项映射。
③、创建Dao、Service、Action类
分别在src目录下创建dao.system、service.system、action.system这3个包,然后分别在这3个包中创建3个类文件:UserDao.java、UserService.java、LoginAction.java
其中UserDao.java文件代码如下
package dao.system;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import model.system.TUser; //引入Hibernate的数据库表映射文件映射文件
public class UserDao extends HibernateDaoSupport{
public void add(TUser m){
getHibernateTemplate().save(m);
}
public List<TUser> showAllUser(){
return getHibernateTemplate().find("from user");
}
public void update(TUser m){
getHibernateTemplate().update(m);
}
public void delete(String id){
getHibernateTemplate().delete(getHibernateTemplate().get(TUser.class, id));
}
public TUser getUserById(String id){
TUser m = (TUser)getHibernateTemplate().get(TUser.class, id);
return m;
}
public boolean checkUser(String userName,String userPassword){
boolean flag = false;
String hql = "from TUser as user where user.username = '" + userName + "' and user.password = '" + userPassword + "'";
List<TUser> userList = this.getHibernateTemplate().find(hql);
if(userList.size() > 0){
flag = true; //用户名和密码匹配正确,则flag变量返回true值
}
return flag;
}
}
其中UserService.java文件代码如下
package service.system;
import dao.system.UserDao;
public class UserService {
private UserDao userDao;
public UserDao getUserDao(){
return userDao;
}
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public boolean checkUser(String userName,String userPassword){
return userDao.checkUser(userName, userPassword);
}
}
其中LoginAction.java文件代码如下
package action.system;
import com.opensymphony.xwork2.ActionSupport;
import service.system.UserService;
public class LoginAction extends ActionSupport{
private static final long serivalVersionUID = 6989533817661294988L;
private String username;
private String password;
UserService userService = new UserService();
public UserService getUserService(){
return userService;
}
public void setUserService(UserService userService){
this.userService = userService;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
boolean flag = false;
if(username == null || username.trim().equals("")){
this.addFieldError("username", "用户名不能为空");
return "fail";
}else if(password == null || password.trim().equals("")){
this.addFieldError("password", "密码不能为空");
return "fail";
}else{
flag = userService.checkUser(username,password);
if(flag){
return "success";
}else{
return "fail";
}
}
}
}
④、配置相关文件
(1).log4j配置文件
工程需要使用log4j作为日志输出工具,故需要log4j的配置文件。在src下创建log4j.properties文件,配置内容如下:
#log4j.properties
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] -%m%n
(2).修改Web.xml,添加如下代码
<!-- 以下3项参数与log4j的配置相关 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
(3).修改applicationContext.xml,添加如下代码
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
<!-- 加载映射文件,指明hibernate配置文件的位置 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="mappingResources">
<list>
<value>model/system/TUser.hbm.xml</value>
</list>
</property>
</bean>
<!-- 1、定义DAO -->
<bean id="userDao" class="dao.system.UserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 2、配置LoginAction.java类文件 -->
<bean id="LoginAction" class="action.login.LoginAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<!-- 3、配置service层 -->
<bean id="userService" class="service.system.UserService">
<property name="userDao" ref="userDao"/>
</bean>
(4).修改struts.xml,添加如下代码
<struts>
<!-- 下述语句是将struts2交给spring管理 -->
<constant name="struts.objectFactory" value="spring"/>
<!--将action内容放在package元素下,package元素的name值与extends值可以使用默认值,如下所示 -->
<package name="ssh" extends="struts-default">
<!--例如与用户登录相关的LoginAction,配置如下,其中,class值与applicationContext.xml文件中该action的id值相对应,name值作为标识-->
<action name="loginAction" class="LoginAction">
<!--result元素设置页面跳转值,其中name值为目标页面的字符串标识,如下,登录失败时回到fail.jsp页面,成功时,转向success.jsp页面 -->
<result name="fail">/jsp/login/fail.jsp</result>
<result name="success">/jsp/login/main.jsp</result>
</action>
</package>
</struts>
⑤、编写登录界面、登录成功和登录失败界面
a.登录界面index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<title>登录</title>
</head>
<body>
<div id="login">
<form action="loginAction" method="post">
<input type="text" name="username"/>
<input type="text" name="password"/>
<input type="submit" value="登录"/>
</form>
</div>
</body>
</html>
b.登录成功界面success.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<title>登录成功</title>
</head>
<body>
登陆成功。<br>
</body>
</html>
c.登录失败界面fail.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<title>登录失败</title>
</head>
<body>
非法用户,登陆失败。<br>
</body>
</html>
三、运行结果
a.登录界面
b.登录成功
c.登录失败
四、注意事项
列名 | 内容/说明 |
错误类型 | java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session; |
原因 | 由于 hibernate 高版本已经又完善了好多功能,导致与之前跟 spring 整合的方法有些出入。 Hibernate 4之后,Spring 3.1将HibernateDaoSupport类去除了,包括数据访问都不需要Hibernatetemplate。 |
解决方法 | 方法一 在Dao类中添加SessionFactory属性,再添上它的setter方法。使用sessionFactory.getCurrentSession()方法或者sessionFactory.openSession()方法(该方法需要手动打开和手动关闭)。 方法二 将Hibernate的版本更改为3.3版本,即Spring和Hibernate同为3.*版本 方法三 将Spring的版本改为4.*版本,即Spring和Hibernate同为4.*版本 |
由于Hibernate4已经完全可以实现事务了, 与Spring3.1中的hibernatedao,hibernateTemplete等有冲突,所以Spring3.1里已经不提供Hibernatedaosupport,HibernateTemplete了,只能用Hibernate原始的方式用session:
Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
在basedao里可以用注入的sessionFactory获取session。 注意,配置事务的时候必须将父类baseServiceImpl也配上,要不然会出现错误:No Session found for currentthread,以前是不需要的。