Hibernate学习总结

首先声明这是个坑爹的框架

属于ssh经典框架中的持久层框架,说白了就是管理数据库的。

下载地址:http://hibernate.org/orm/

这里写了版本5.2,下载下来的基本不怎么会用,因为文件结构变化太大,也可能没什么人用了。所以我下了3点多版的。

想方便使用Hibernate框架,还要下个Hibernate Tools,不下也行就是写配置文件方便点而已。

下载地址:http://hibernate.org/tools/

配置Tools只要把features,plugins两个文件夹copy到eclipse中就行,eclipse本身就有这两个文件夹,点合并。

想要在项目中用Hibernate,肯定要导jar包吧,教程坑爹的只告诉你导入hibernate3.jar这个包。

是的,导入之后运行就会告诉你还要导别的包。现在一次说总结清楚。

首先导入hibernate3.jar

然后导入required包,运行发现还要个jpa,就把jpa包导入,才能运行成功,它们都在lib下的。

写成一个Hibernate的Demo真的麻烦,有人教你在配置后用mapping这玩意么

运行需要几个东西:hibernate.cfg.xml,类名.cfg.xml,类

有了Tools这个东西,就不用担心了。

首先hibernate.cfg.xml放在src包下,类名.cfg.xml放在与类同包下。

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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">账号</property>
        <property name="connection.password">密码</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/数据库名?useSSL=true</property>
        <property name="connection.characterEncoding">utf-8</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <mapping resource="package2/persion.hbm.xml" />
    </session-factory>
</hibernate-configuration>

类名.cfg.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-7-20 15:57:35 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="package2.persion" table="PERSION">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
    </class>
</hibernate-mapping>

persion.java

public class persion {
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

HibernateExecute.java

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateExecute {

    public static void main(String[] args) {
        Configuration cfg=new Configuration().configure();
        SessionFactory ssf=cfg.buildSessionFactory();
        Session session=ssf.openSession();
        session.beginTransaction();
        String hql="FROM persion";
        Query q=session.createQuery(hql);
        List list=q.list();
        Iterator<persion> it=list.iterator();
        while(it.hasNext()){
            persion p=it.next();
            System.out.println(p.getId()+" "+p.getName());
        }

        if(session.isOpen())
            session.close();
    }

}

persion是这样一个简单的表

运行后无疑是正常的

写单机程序是非常无趣的,只不过它给定了一个范式。

struts2+hibernate3合体是这样写的

DAO层该干嘛干嘛,Action负责调用DAO层处理数据然后传输到页面。就这么简单。

按照惯例先定义一个接口:

import java.util.List;

public interface DataOperation {
    public boolean InsertIntoUser(user user);
    public boolean DeleteUser(user user);
    public List QueryAllUser();
    public void updateUser(user user);
    public List<user> SelectUser(user user);
}

然后接口实现类:

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.envers.RevisionTimestamp;

public class OperationImpl implements DataOperation{

    @Override
    public boolean InsertIntoUser(user user) {
        // TODO Auto-generated method stub
        boolean success=false;
        SessionInstance getsession=new SessionInstance();
        Session session=getsession.SessionInstance();
        session.beginTransaction();
        String hql="from user as user where user.username=:name";
        Query q=session.createQuery(hql);
        q.setString("name", user.getUsername());
        List<user> list=q.list();
        if(list.isEmpty())
        {
            session.save(user);
            session.getTransaction().commit();

            success=true;
        }
        session.close();
        return success;
    }

    @Override
    public boolean DeleteUser(user user) {
        System.out.println("删除执行");
        // TODO Auto-generated method stub
        boolean isDelete=false;
        SessionInstance getsession=new SessionInstance();
        Session session=getsession.SessionInstance();
        session.beginTransaction();
        String hql="from user as user where user.username=:name";
        Query q=session.createQuery(hql);
        q.setString("name", user.getUsername());
        List<user> l=q.list();

        if(!l.isEmpty())
        {
            String del="delete user where username=:name";
            Query delete=session.createQuery(del);
            delete.setParameter("name", user.getUsername());
            delete.executeUpdate();
            session.getTransaction().commit();
            isDelete=true;
            System.out.println("删除成功:"+user.getUsername());
        }
        session.close();
        return isDelete;
    }

    @Override
    public List<user> QueryAllUser() {
        SessionInstance getsession=new SessionInstance();
        Session session=getsession.SessionInstance();
        Query q=session.createQuery("from user");
        List<user> list=q.list();
        session.close();
        return list;
    }

    @Override
    public void updateUser(user user) {
        // TODO Auto-generated method stub

    }

    @Override
    public List<user> SelectUser(user user) {
        SessionInstance getsession=new SessionInstance();
        Session session=getsession.SessionInstance();
        session.beginTransaction();
        String hql="from user as user where user.username=:name and user.tel=:tel";
        Query q=session.createQuery(hql);
        q.setString("name", user.getUsername());
        q.setString("tel", user.getTel());
        List<user> l=q.list();
        System.out.println("空:"+l.isEmpty());
        session.close();
        return l;
    }

}

然后类似一个工具类

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class  SessionInstance {
    public Session SessionInstance(){
        Configuration cfg=new Configuration().configure();
        SessionFactory sessionFactory=cfg.buildSessionFactory();
        Session session=sessionFactory.openSession();
        return session;

    }
}

注意Session,Configuration这些都是hibernate包下的。

然后就是写几个页面了,配action啊之类的。

QueryAll和Update没写,一个模式就不写了。还没搞懂怎么从POJO的List传到前端,所以QueryAll直接写成JSP了。

<%@page import="org.hibernate.SessionFactory"%>
<%@page import="DAOLayer.user"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.hibernate.Query"%>
<%@page import="org.hibernate.Session"%>
<%@page import="org.hibernate.cfg.Configuration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>遍历数据表</title>
</head>
<body>
    <%
        Configuration cfg=new Configuration().configure();
        SessionFactory sf=cfg.buildSessionFactory();
        Session ses=sf.openSession();
        ses.beginTransaction();
        String hql="FROM user";
        Query q=ses.createQuery(hql);
        List list=q.list();
        Iterator<user> it=list.iterator();
        while(it.hasNext()){
            user u=it.next();
            out.write("用户名:"+u.getUsername()+" 密码:"+u.getPassword()+" 电话号码:"+u.getTel());
            out.print("<br/>");
        }

        if(ses.isOpen())
            ses.close();

    %>
</body>
</html>

持久层对象user.java

public class user {
    private String username;
    private String password;
    private String tel;
    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 getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }

}

数据表也是个简单表。

值得注意的是,这个主键id根本不需要管它,自增的话不需要写进持久层对象,会有什么问题我就不懂了,至今还正常。

再贴几个Action

InsertActon.java

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import DAOLayer.OperationImpl;
import DAOLayer.user;

public class InsertAction extends ActionSupport implements ModelDriven<user>{
    private user user =new user();
    public user getUser() {
        return user;
    }

    public void setUser(user user) {
        this.user = user;
    }

    public String execute(){
        System.out.println(user.getUsername() + " " + user.getPassword() + " " + user.getTel());

        OperationImpl insert = new OperationImpl();
        boolean IsSuccess = insert.InsertIntoUser(user);
        if (IsSuccess) {
            ActionContext context = ActionContext.getContext();
            context.getSession().put("username", user.getUsername());
            context.getSession().put("telephone", user.getTel());
            return SUCCESS;
        }
        return "faliure";

    }

    @Override
    public user getModel() {

        return this.user;
    }

}

DeleteAction.java

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import DAOLayer.OperationImpl;
import DAOLayer.user;

public class DeleteAction extends ActionSupport implements ModelDriven<user>{

    private user user=new user();
    @Override
    public user getModel() {
        // TODO Auto-generated method stub
        return user;
    }

    public String execute(){
        OperationImpl delete=new OperationImpl();
        boolean b=delete.DeleteUser(user);
        if(b)
            return SUCCESS;
        return "faliure";
    } 

}

SelectAction.java

import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import DAOLayer.OperationImpl;
import DAOLayer.user;

public class SelectAction extends ActionSupport implements ModelDriven<user>{
    private user user=new user();

    public String execute(){
        OperationImpl select=new OperationImpl();
        List<user> list=select.SelectUser(user);
        if (!list.isEmpty()) {
            for (user u : list)
                System.out.println(u.getUsername() + " " + u.getPassword() + " " + u.getTel());
            ActionContext context = ActionContext.getContext();
            context.getSession().put("username_result", list.get(0).getUsername());
            context.getSession().put("password_result", list.get(0).getPassword());
            context.getSession().put("tel_result", list.get(0).getTel());
        }
        return SUCCESS;
    }

    @Override
    public user getModel() {
        // TODO Auto-generated method stub
        return user;
    }
}

最后贴个搜索结果处理,感觉这些api还不够方便,而且Action传值只能使用s标签库,每个jsp都会被服务器解析,会影响服务器效率。今后尝试使用AJAX技术吧,还没学会。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询结果</title>
</head>
<body>
    <%
        String username="";
        if(!(session.getAttribute("username_result")==null))
            username=session.getAttribute("username_result").toString();
        String passwd="";
        if(!(session.getAttribute("password_result")==null))
             passwd=session.getAttribute("password_result").toString();
        String tel="";
        if(!(session.getAttribute("tel_result")==null))
            tel=session.getAttribute("tel_result").toString();
        System.out.println("用户名:"+username);
        if(username.equals(""))
        {
            out.print("没有此用户");
            out.print("<br/>");
        }
        else
        {
            out.print("用户名:"+username);
            out.print("<br/>");
            out.print("密码:"+passwd);
            out.print("<br/>");
            out.print("电话:"+tel);
            out.print("<br/>");
        }

    %>
</body>
</html>

运行还算顺利。

时间: 2024-08-05 11:16:24

Hibernate学习总结的相关文章

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Hibernate学习——一般配置

mysql建表语句: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Employee.java package com.study; public class Employee { private

【Hibernate学习】 ——ORM(三)

前面几种关系我们以前就经常用,对于继承我们也并不陌生,经常接触的类与类之间的继承用extends关键字,那么在表与表的关系中如何表示呢?下面我们来讲继承映射. 继承有三种实现的策略,单表继承,具体表继承,类表继承.下面来分析一下这三种方式 继承关联类关系  单表继承 每棵类继承树使用一个表,可知,这三个类在一张表中.如下表: 这张表包括了父类,子类的所有属性,通过Type来区分是哪个子类. 对象模型映射到关系模型: <classname="com.bjpowernode.hibernat.

hibernate 学习知识总结

1.最近用hibernate 学会很多知识,总结如下: (1)数据库表格已经设置默认值,在进行数据插入的时候,bean里面不赋值的话,插入之后该字段依旧是null 是因为hibernate默认插入和更新所有字段,如果某些字段不需要操作,需要配置下 (i)xml文件配置方式: <property name="account" type="java.lang.String" insert="false"> <column name=

【Hibernate学习】 ——ORM(一)

Hibernate是一种能实现ORM的框架.ORM即Object Relational Mapping,对象关系映射.也就是将关系数据库中表的数据映射成为对象,也就是说将表与表之间的操作映射成对象与对象之间的操作,通过实体类来达到操作表的目的.总之就是把对数据库的操作转化为对对象的操作,从而更体现了面向对象的思想. 一对一关联映射策略包括主键关联和唯一外键关联. 单向一对一 主键关联 让两个对象有相同的主键值,表名它们之间的一对一关系,数据库没有额外的字段来维护它们之间的关系,仅仅通过表的主键来

【Hibernate学习】 ——ORM(二)

上篇博客主要介绍了一对一的关系,主要理解单向与双向的区别,主键关联与唯一外键关联的区别.下面继续介绍一对多与多对多关联. 一对多关联映射 一个班级对应多个学生 单向一对多关系 关系表: classes代码 <classname="com.bjpowernode.hibernat.Classes"table="t_classes"> <idname="id"> <generatorclass="native&

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个

hibernate学习随记

hibernate学习随记: 一:hibernate的核心类和接口 ①  Configuration 类 它的用处是: 读取hibernate.cfg.xml 管理对象关系映射文件 <mapping resource=””> 加载hibernate 的驱动,url ,用户.. 管理hibernate配置信息 ②  hibernate.cfg.xml ③  对象关系映射文件 ④  SessionFactory (会话工厂) 可以缓存sql语句和数据(称为session级缓存)!! 是一个重量级的

Hibernate学习笔记:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建 前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了.本篇博文将记录下第一个Hibernate程序的搭建过程.其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我