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

属于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>

运行还算顺利。

Hibernate学习总结的更多相关文章

  1. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  2. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  3. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  4. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  5. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  6. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  7. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  8. Hibernate学习一:Hibernate注解CascadeType

    http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...

  9. Hibernate学习---缓存机制

    前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...

  10. hibernate学习系列-----(2)hibernate核心接口和工作机制

    在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...

随机推荐

  1. python2.7到python3代码转换脚本2to3的一些介绍

       你的位置: Home ‣ Dive Into Python 3 ‣ 难度等级: ♦♦♦♦♦   使用2to3将代码移植到Python 3 ❝ Life is pleasant. Death is ...

  2. 取消Git代理设置

    昨天由于在用sourceTree上传下拉代码的时候,速度实在太慢,就照着百度上的方法设置了代理,结果导致sourceTree无法访问服务器,经检查排除发现可能是因为公司网络不能使用代理,被防火墙挡住了 ...

  3. Android基础知识总结

    四大组件之一活动 活动状态 运行状态:活动处于栈顶 暂停状态:活动不处于栈顶,但仍然可见 停止状态:完全不可见 销毁状态:离开返回栈 生存期 onCreate() onStart():不可见到可见调用 ...

  4. iOS开发小技巧--修改按钮内部图片和文字之间的间距(xib)

    调整按钮的Edge属性,选择调整图片的Edge还是label的Edge,如图:

  5. 强联通 HDU 2767 3836

    n个点m条边 最少需要几条边变成强连通图 设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案. 注意特殊情况: 当原图已经强连通时, 答案是0而不是1. 加一条边少一个入度 ...

  6. quartz启动时间配置

    这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...

  7. 【USACO 2.1】The Castle

    /* TASK: castle LANG: C++ SOLVE: 深搜,注意每个方向对应值.枚举去掉的墙,然后再dfs,注意墙要复原,并且dfs里要判断是否超出边界. */ #include<c ...

  8. 压力测试 webbench

    Linux下 webbench最多可以模拟3万个并发连接去测试网站的负载能力 webbench -c -t http://127.0.0.1/phpinfo.php 说明: -c 客户端数量(并发数量 ...

  9. bounds的剖析

    bounds的剖析:   UIScrollView的常见属性: contentSize:滚动范围,内容的尺寸(CGSize) contentInset :内边距:内容的上左下右的边距(UIEdgeIn ...

  10. IOS传值的几种方式

    1.代理 一对一 在第二个页面设置代理 1.1在最上方设置 //选择房间的代理 @protocol RoomVCDelegate <NSObject> 1.2设置代理方法 //方法 -(v ...