原文轉自:http://blog.csdn.net/wuyt2008/article/details/8243544
Hibernate有很機械的pojo類和hbm文件要寫,這部分用myeclipse來做,能省不少事情,終於又感覺到myeclipse的好處了。
1、先在mysql裏面建個表
- CREATE TABLE `t_user` (
- `pk_user_id` bigint(20) NOT NULL AUTO_INCREMENT,
- `login_name` varchar(45) DEFAULT NULL,
- `email` varchar(45) DEFAULT NULL,
- `password` varchar(45) DEFAULT NULL,
- PRIMARY KEY (`pk_user_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、讓myeclipse連接到數據庫,還會幫我們自動生成hibernate的配置文件,和一個sessionFactory類。
3、用myeclipse生成實體類和映射配置文件,在myeclipse的db browser裏面,打開數據庫,選中表。
最後會生成這樣一堆文件
整理一下,我是這麼放的
4、把myeclipse添加的lib引用去掉,換成hibernate4。
就是這兩個hibernate 3.3的,去掉。
hibernate最新版是4.1.8,下載地址http://sourceforge.net/projects/hibernate/files/hibernate4/
解壓開後,在lib目錄下有個叫required的目錄,下面放的是最基本的包,這個我喜歡,比struts和spring做的好。
引入這些包就好了
此外還需要mysql的連接包,最新版本5.1.22,下載地址:http://www.mysql.com/downloads/connector/j/
5、現在開始來修改,從web頁面開始
在網站根目錄下,增加一個user目錄,下面添加一個add.jsp文件。
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'add.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- </head>
- <body>
- <form name="form1" method="post" action="user!add.action">
- <p>
- <label for="loginname">loginname</label>
- <input type="text" name="loginname">
- </p>
- <p>
- <label for="email">email</label>
- <input type="text" name="email">
- </p>
- <p>
- <label for="password">password</label>
- <input type="text" name="password">
- </p>
- <p>
- <input type="submit" name="submit" value="提交">
- </p>
- </form>
- This is my JSP page. <br>
- </body>
- </html>
這個頁面,將內容提交到了UserAction類的add方法,現在來修改UserAction類。
UserAction類裏面要添加add方法,和接收頁面信息的屬性及方法。
- package demo.myssh.action;
- import com.opensymphony.xwork2.ActionSupport;
- import demo.myssh.business.UserService;
- import demo.myssh.model.User;
- @SuppressWarnings("serial")
- public class UserAction extends ActionSupport {
- @Override
- public String execute() throws Exception {
- this.addActionMessage("UserAction working");
- // this.addActionMessage("hello world.");
- this.addActionMessage(userService.doing());// 修改下,確認注入成功。
- return ActionSupport.SUCCESS;
- }
- // 注入用屬性
- private UserService userService;
- // 注入用的方法
- public void setUserService(UserService userService) {
- this.userService = userService;
- }
- public String add() throws Exception {
- userService.save(new User(loginname, email, password));
- return ActionSupport.SUCCESS;
- }
- private String loginname;
- private String email;
- private String password;
- public void setLoginname(String loginname) {
- this.loginname = loginname;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
這裏面,用到了UserService類裏面的save方法,繼續修改UserService。
- package demo.myssh.business;
- import demo.myssh.dao.UserDAO;
- import demo.myssh.model.User;
- public class UserService {
- public String doing() {
- return "UserService working";
- }
- private UserDAO userDAO;
- public void setUserDAO(UserDAO userDAO) {
- this.userDAO = userDAO;
- }
- public void save(User user) {
- userDAO.save(user);
- }
- }
UserDAO這個類不需要多少修改,只需要把裏面日誌有關的地方去掉就可以了。因爲,我沒有引入那個類。大家都喜歡用log4j,打算之後加入log4j。
- package demo.myssh.dao;
- import java.util.List;
- import org.hibernate.LockMode;
- import org.hibernate.Query;
- import org.hibernate.criterion.Example;
- import demo.myssh.model.User;
- public class UserDAO extends BaseHibernateDAO {
- // property constants
- public static final String LOGIN_NAME = "loginName";
- public static final String EMAIL = "email";
- public static final String PASSWORD = "password";
- public void save(User transientInstance) {
- try {
- getSession().save(transientInstance);
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public void delete(User persistentInstance) {
- try {
- getSession().delete(persistentInstance);
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public User findById(java.lang.Long id) {
- try {
- User instance = (User) getSession().get("User", id);
- return instance;
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public List findByExample(User instance) {
- try {
- List results = getSession().createCriteria("User")
- .add(Example.create(instance)).list();
- return results;
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public List findByProperty(String propertyName, Object value) {
- try {
- String queryString = "from User as model where model."
- + propertyName + "= ?";
- Query queryObject = getSession().createQuery(queryString);
- queryObject.setParameter(0, value);
- return queryObject.list();
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public List findByLoginName(Object loginName) {
- return findByProperty(LOGIN_NAME, loginName);
- }
- public List findByEmail(Object email) {
- return findByProperty(EMAIL, email);
- }
- public List findByPassword(Object password) {
- return findByProperty(PASSWORD, password);
- }
- public List findAll() {
- try {
- String queryString = "from User";
- Query queryObject = getSession().createQuery(queryString);
- return queryObject.list();
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public User merge(User detachedInstance) {
- try {
- User result = (User) getSession().merge(detachedInstance);
- return result;
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public void attachDirty(User instance) {
- try {
- getSession().saveOrUpdate(instance);
- } catch (RuntimeException re) {
- throw re;
- }
- }
- public void attachClean(User instance) {
- try {
- getSession().lock(instance, LockMode.NONE);
- } catch (RuntimeException re) {
- throw re;
- }
- }
- }
BaseHibernateDAO 不用改,沿用
- package demo.myssh.dao;
- import org.hibernate.Session;
- public class BaseHibernateDAO implements IBaseHibernateDAO {
- public Session getSession() {
- return HibernateSessionFactory.getSession();
- }
- }
IBaseHibernateDAO 不用改,沿用
- package demo.myssh.dao;
- import org.hibernate.Session;
- public interface IBaseHibernateDAO {
- public Session getSession();
- }
HibernateSessionFactory這個類要修改,因爲hibernate 4 創建session的方法變了。
- package demo.myssh.dao;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.service.ServiceRegistry;
- import org.hibernate.service.ServiceRegistryBuilder;
- public class HibernateSessionFactory {
- private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
- private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
- private static Configuration configuration = new Configuration();
- private static org.hibernate.SessionFactory sessionFactory;
- private static String configFile = CONFIG_FILE_LOCATION;
- private static ServiceRegistry serviceRegistry;
- static {
- try {
- //hibernate 3 的方法
- // configuration.configure(configFile);
- // sessionFactory = configuration.buildSessionFactory();
- //hibernate 4 的方法
- serviceRegistry = new ServiceRegistryBuilder().applySettings(
- configuration.configure().getProperties())
- .buildServiceRegistry();
- sessionFactory = configuration.buildSessionFactory(serviceRegistry);
- } catch (HibernateException e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- private HibernateSessionFactory() {
- }
- public static Session getSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- if (session == null || !session.isOpen()) {
- if (sessionFactory == null) {
- rebuildSessionFactory();
- }
- session = (sessionFactory != null) ? sessionFactory.openSession()
- : null;
- threadLocal.set(session);
- }
- return session;
- }
- public static void rebuildSessionFactory() {
- try {
- // configuration.configure(configFile);
- // sessionFactory = configuration.buildSessionFactory();
- serviceRegistry = new ServiceRegistryBuilder().applySettings(
- configuration.configure().getProperties())
- .buildServiceRegistry();
- sessionFactory = configuration.buildSessionFactory(serviceRegistry);
- } catch (HibernateException e) {
- System.err.println("%%%% Error Creating SessionFactory %%%%");
- e.printStackTrace();
- }
- }
- public static void closeSession() throws HibernateException {
- Session session = (Session) threadLocal.get();
- threadLocal.set(null);
- if (session != null) {
- session.close();
- }
- }
- public static org.hibernate.SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static void setConfigFile(String configFile) {
- HibernateSessionFactory.configFile = configFile;
- sessionFactory = null;
- }
- public static Configuration getConfiguration() {
- return configuration;
- }
- }
User實體類不用改,不過還是貼出來吧。
- package demo.myssh.model;
- public class User implements java.io.Serializable {
- private static final long serialVersionUID = -8290754809696899650L;
- private Long userID;
- private String loginName;
- private String email;
- private String password;
- /** default constructor */
- public User() {
- }
- /** full constructor */
- public User(String loginName, String email, String password) {
- this.loginName = loginName;
- this.email = email;
- this.password = password;
- }
- // Property accessors
- public Long getUserID() {
- return this.userID;
- }
- public void setUserID(Long userID) {
- this.userID = userID;
- }
- public String getLoginName() {
- return this.loginName;
- }
- public void setLoginName(String loginName) {
- this.loginName = loginName;
- }
- public String getEmail() {
- return this.email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getPassword() {
- return this.password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
還有映射文件,記得添加下package,讓hibernate能找到實體類
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="demo.myssh.model">
- <class name="User" table="t_user" catalog="myssh">
- <id name="userID" type="java.lang.Long">
- <column name="pk_user_id" />
- <generator class="identity"></generator>
- </id>
- <property name="loginName" type="java.lang.String">
- <column name="login_name" length="45"/>
- </property>
- <property name="email" type="java.lang.String">
- <column name="email" length="45"/>
- </property>
- <property name="password" type="java.lang.String">
- <column name="password" length="45"/>
- </property>
- </class>
- </hibernate-mapping>
然後是hibernate的配置文件,
- <?xml version='1.0' encoding='utf-8'?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- properties -->
- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://localhost:3306/myssh</property>
- <property name="connection.username">root</property>
- <property name="connection.password"></property>
- <property name="connection.autocommit">true</property>
- <!-- mapping files -->
- <mapping resource="demo/myssh/model/User.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
最後,修改spring的配置文件applicationContext.xml,提供注入
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-3.0.xsd">
- <bean id="userAction" class="demo.myssh.action.UserAction">
- <property name="userService" ref="userService" />
- </bean>
- <bean id="userService" class="demo.myssh.business.UserService">
- <property name="userDAO" ref="userDAO"></property>
- </bean>
- <bean id="userDAO" class="demo.myssh.dao.UserDAO">
- </bean>
- </beans>
運行訪問:http://localhost:8080/user/add.jsp
提交以後,又轉回index.jsp,查看數據庫
大功告成,最基本簡單的ssh框架搭建終於完成。
程序結構再貼下