我们在搭建完Struts框架之后,从前台想后端传送数据就显得非常简单了。Struts的功能不仅仅是一个拦截器,这只是它的核心功能,此外我们也可以自定义拦截器,和通过注解的方式来更加的简化代码。
接下来就开始Hibernate的框架的开发。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库(摘自百度百科)。我们只需要知道Hibernate是对数据库操作的封装。
那么搭建Hibernate 首先要下载哪些包嘞?我把这些包列举出来,在后的项目里,你可以去下载。
将这些包放到项目的lib文件夹下,下一步,我就开始创建Hibernate.cfg.xml
Hibernate.cfg.xml 是Hibernate的配置文件,和struts.xml意思有点像。在Hibernate.cfg.xml里面我们会配置数据库的信息,连接数据库的配置,以及数据库中的表。
首先在src目录下新建一个xml文件,在里面声明
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
建好之后的Hibernate.cfg.xml 文件是这样的
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接驱动 --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- Oracle数据库连接的url --> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:xe</property> <!-- 用户名 --> <property name="connection.username">root</property> <!-- 密码 --> <property name="connection.password">root</property> <!-- 数据库语言 --> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <!-- 根据映射文件自动创建表(第一次创建,以后是修改) --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- 配置映射文件 --> <mapping resource="com/entity/Users.hbm.xml"/> </session-factory> </hibernate-configuration>
每个属性都标了注释。首先 数据库连接驱动的包,我们需要导进去。我这里用的是ojdbc14_11g.jar。把它放到lib文件夹下。
接下来我们可以看到,配置映射文件里,所以在建完Hibernate.cfg.xml之后,我们需要建实体类。
新建包com.entity并在里面新建类Users
package com.entity; public class Users { private String Name; private String Pwd; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getPwd() { return Pwd; } public void setPwd(String pwd) { Pwd = pwd; } public Users(){} public Users(String Name,String Pwd) { this.Name=Name; this.Pwd=Pwd; } }
然后我们建立相应的映射文件,步骤如下
1.右键Users.java 新建 xml(Basic xxx)
2.
3.取好名字后
4
5 点next->finish就好了。
在映射文件里面,我们需要添加如下的代码,让映射文件和数据库形成映射
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <class name="com.entity.Users" table="Users"> <id name="Name"> <generator class="native"/> </id> <property name="Pwd" length="15"/> </class> </hibernate-mapping>
这里class 是实体类的意思,table是映射到数据库中的表
后面的id是主键,property 是属性。<generator class="native"/> 的意思是
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
当然我们也可以在Oracle数据库中定义序列和触发器,在这里<generator class="identity">序列名称</generator>
实体类建完之后,我们还要建一个SessionFactory
首先:Session 接口是Hibernate 中的核心接口,持久化对象的生命周期,事务的管理和持久化对象的查询,更新和删除都是通过Session完成的。Hibernate 在操作数据库之前,必须先取的Session对象。
而Hibernate 的SessionFacroty 接口负责初始化Hibernate ,充当数据储存源的代理,并负责创建Session对象,因此要创建一个Session必须要构建一个SessionFactory 实例
在src目录下创建com.commom包,并在包中创建HibernateSessionFactory 类,在类中读取Hibernate.cfg.xml文件
package com.huizhi.common; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateSessionFactory { //指定要读取配置文件路径 private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; //实例化ThreadLocal类 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); //实例化Configuration类 private static Configuration configuration = new Configuration(); //声明SessionFactory接口 private static SessionFactory sessionFactory; //定义configFile变量并赋值 private static String configFile = CONFIG_FILE_LOCATION; static { try { //读取默认的配置文件hibernate.cfg.xml configuration.configure(configFile); //实例化SessionFactory sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } private HibernateSessionFactory() { }//创建无参的HibernateSessionFactory构造函数 //获取Session public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); //判断是否已经存在Session对象 if (session == null || !session.isOpen()) { //如果SessionFactory对象为null,则创建SessionFactory if (sessionFactory == null) { rebuildSessionFactory();//调用rebuildSessionFactory方法创建SessionFactory } //判断SessionFactory对象是否为null,如果不是,则打开Session session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } //创建SessionFactory public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } //关闭Session public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } //SessionFactory对象的getXXX()方法 public static SessionFactory getSessionFactory() { return sessionFactory; } //configFile属性的setXXX()方法 public static void setConfigFile(String configFile) { HibernateSessionFactory.configFile = configFile; sessionFactory = null; } //configFile属性的getXXX()方法 public static Configuration getConfiguration() { return configuration; } }
上述代码,在HibernateSessionFactory 中通过Configuration 接口读取配置文件Hibernate.cfg.xml,生成SessionFactory 工厂,通过工程获取Session,并将Session放到线程中,定义了Session的获取和关闭的方法,getSession() 和closeSession()。当然也不一定非要这样写,这样写也是封装了Session的获取和关闭。
这里的Session和Severlt中的Session是不一样的、
接下来我们编写数据库操作Dao类。
在src目录下新建com.dao包,在里面创建ManageUser类
package com.dao; import java.util.List; import com.common.HibernateSessionFactory; import org.apache.struts2.ServletActionContext; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.entity.*; public class ManageUser { //SessionFactory类 private HibernateSessionFactory sessionFactory; //登录验证 public boolean CheckLogin(String Name,String Pwd){ boolean flag=false; Session session=sessionFactory.getSession(); String hql = "from Users as u where u.Name = '" +Name+ "' and u.Pwd = '"+Pwd+"'"; List<Users> users = session.createQuery(hql).list(); //transaction.commit(); if(users.size()>0){ flag = true; } session.close(); return flag; } }
这里Hibernate 用的查询语句是hql ,hql是Hibernate 整合sql 的自己的数据库操作语句。上面的是查询。
删除语句:
delete from Executives e where e.ExecutiveID='"+ExecutivesID+"'";
增加语句:
直接用session.save(Users);
更改直接用Session.update(Users);
的确很方便。
接下来在action类中
package com.action; import com.opensymphony.xwork2.ActionSupport; import com.common.*; import com.entity.*; import com.dao.*; public class loginAction extends ActionSupport{ private String name; private String pwd; //Dao类 private ManageUser manageUser; private String result; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String execute(){ System.out.println(name+" "+pwd); manageUser=new ManageUser(); if(manageUser.CheckLogin(name, pwd)==true){ result = "{"login":"success"}"; return SUCCESS; } else{ result = "{"login":"fail"}"; return INPUT; } } }
这就将Struts和Hibernate 都搭建好了。
代码可以在这里下载,
也可以在我的GitHub上下载