Hibernate的基础入门(一)
一Java三层结构
1 web层:struts框架
2 service层:Spring框架
3 dao层 :hibernate框架
相当于MVC的思想
1 M:模型èhibernate框架
2 V:视图èstruts框架
3 C:控制器èSpring框架
1:Hibernate是对JDBC进一步封装
不需要复杂的jdbc代码,不需要写sql语句也能实现
- 没有使用hibernate如下:
Jdbc:
public static final String URL="jdbc:mysql://localhost:3306/数据库";//链接的mysql
public static final String NAME = "root";
public static final String PASSWORD = "root";
public static final String DREIVER = "com.mysql.jdbc.Driver";
//加载驱动
Class.forName(DREIVER);
//创建连接
Connection con=DriverManager.getConnection(URL, NAME, PASSWORD);
//对sql进行编译操作
String sql = "select * from users "; // 查询多条数据
PreparedStatement psmt=con.prepareStatement(sql);
//执行sql
ResultSet rs= psmt. executeQuery();
//遍历结果集
…..
//释放资源
2 使用hibernate:让实体类和表一一对应不需要代码即可实现,使用配置文件完成
hibernate封装的对象session
//创建实体类的对象
User user =new User();
user.setName("明珠");
session.sava(user);
2:Hibernate的核心
A :Configuration接口:负责配置并启动Hibernate
B :SessionFactory接口:负责初始化Hibernate
C :Session接口:负责持久化对象的CRUD操作
D :Transaction接口:负责事务
F :Query接口和Criteria接口:负责执行各种数据库查询
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃
二:Hibernate 准备
- 导入jar包

2.创建实体类(Javabean)
创建一个User的实体类
/**
* 2 创建实体类,然后配置实体类和数据库表一一对应关系(映射关系)
* @author Xiao_Zhu
*
*/
public class User {
// hibernate要求实体类有一个属性唯一的
// private String uuid;
private int id;
private String name;
private String password;
private String address; /*
* public String getUuid() { return uuid; }
*
* public void setUuid(String uuid) { this.uuid = uuid; }
*/ public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }
3 :配置实体类和数据库表一一对应关系(映射关系)
(1):使用配置文件实现映射关系
a. 创建xml格式的配置文件
映射配置文件名称和位置没有固定要
建议:配置文件最好放在实体类相应的包的路径下. 配置文件的名称:实体名称.hbm.xml (这是我的习惯)
创建一个User.hbm.xml的配置文件

<?xml version="1.0"?>
<!-- 只有引入约束,下面才能使用hibernate-mapping的标签 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 1配置类和表对应
class标签
name属性:实体类全路径 ==>如: com.zhu.domain.User
table属性:数据库表名称 -->
<class name="com.zhu.domain.User" table="td_users">
<!-- 2配置实体类ID和表里面的id对应
hibernate:要求实体类有个属性唯一值
hibernate:要求表有字段作为
-->
<!-- id标签
name:实体类里面 id属性名
column:生成的表字段名称
-->
<id name="uuid" column="uuid">
<!-- 3 设置数据库表id增长策略
native: 生成表id值就是主键自动增长
-->
<generator class="uuid"></generator>
</id> <!-- 4:配置其他属性和表字段对应
name属性:实体类属性(变量)名称
column :数据库表字段的名称
-->
<property name="name" column="name"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property> </class>
</hibernate-mapping>
4:创建hibernate的核心配置文件
a:核心配置文件格式xml,而且核心配置文件名称和位置固定的
位置:必须在src下面
名称:必须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>
<!-- 第一部分:配置数据库信息 jdbc:mysql://localhost:3306/-->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/jdbc01
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property> <!-- 第二部分:配置hibernate信息 -->
<!--输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层SQL语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置之后
update:如果已经有表,那么就更新,如果没有,创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
在mysql里面实现分页关键字limit,只能使用mysql里面
在Oracle数据库,实现纷纷也rownum
让hibernate框架识别不同数据库语句 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property> <!-- 把session绑定到hibernate -->
<property name="current_session_context_class">thread</property> <!-- 第三部分:把映射文件放到核心配置文件中 -->
<!-- 因为对应的表hibernatexml.hbm.xml配置文件放在包里,不是src下面的目录下;所以路径要这样写 -->
<!-- 如果User.hbm.xml放在src下的目录下面,那么路径 就可以 直接这样写==>User.hbm.xml -->
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/jdbc01</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<mapping resource="com/zhu/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
5 创建数据的表

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry; public class HibernateUtils {
static Configuration cfg=null;
static SessionFactory sessionFactory=null;
static {
cfg=new Configuration();
cfg.configure(); ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(registry);
}
//提供方法放回本地线程绑定session的方法
public static Session getSessionObejct(){
return sessionFactory.getCurrentSession();
} public static SessionFactory getSessionFactory(){
return sessionFactory;
} public static void main(String[] args) {
//要运行这里程序,运行之后才会在相应的某个数据库中生产一张表
//运行之后去mysql中看一下是否成功生产了td_users表
}
}
三:实现CRUD操作
第一步: 加载hibernate核心配置文件
第二步:创建SessionFactory对象
第三部使用SessionFactory创建session对象
第四部:开启事务
第五步:写具体逻辑crud操作
第六步:提交事务
第七步:关闭资源
(1):瞬时态, 持久态, 托管态
(a):瞬时态:对象里面没有id值,对象与session没有关联
(b):持久态:对象里面有ID值,对应于session关联
(c):托管态:对象有ID值,对象与session没有关联
如:托管态
User user=new User();
user.setId(1);
1 创建一个TestCRUD的类
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction; import com.zhu.domain.User;
import com.zhu.unit.HibernateUtils; public class TestCRUD { public static void main(String[] args) {
// 新增数据
// insertData(); // 查询一条数据 通过ID
// queryDataById(); // 修改一条数据
// updateData(); /// 查询多条数据
QueryListData(); // 删除数据
// deleteData(); } // 查询一条数据 通过ID
public static void queryDataById() {
// 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 2;获取到session
Session session = sessionFactory.openSession();
// 3:开启事务
Transaction tx = session.beginTransaction(); // 4根据ID查询
// 调用session里面的get方法
// 第一个参数:是实体类的class
// 第二参数:是数据库 的id值
//(b):持久态:对象里面有ID值,对应于session关联
User user = (User) session.get(User.class, 1);
System.out.println("地址 ==>" + user.getAddress());
// 5 提交事务
tx.commit(); // 6:关闭资源
session.close();
sessionFactory.close();
} // 修改一条数据
public static void updateData() {
// 1;调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 2;获取到session
Session session = sessionFactory.openSession();
// 3:开启事务
Transaction tx = session.beginTransaction(); // 4根据修改
// 调用session里面的get方法
// 第一个参数:是实体类的class
// 第二参数:是数据库 的id值
User user = (User) session.get(User.class, 1);
user.setAddress("中国");
// 调用session的方法update修改
session.update(user);
// 注意:sava的方法也能进行修改 // 5 提交事务
tx.commit(); // 6:关闭资源
session.close();
sessionFactory.close();
} // 删除数据
public static void deleteData() {
// 1;调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 2;获取到session
Session session = sessionFactory.openSession();
// 3:开启事务
Transaction tx = session.beginTransaction(); // 4 删除
// 第一种删除:根据ID查询对象再删除
User user = (User) session.get(User.class, 1);
session.delete(user); /*
* //第二种删除: User user2=new User(); user.setId(3); session.delete(user2);
*/ // 5 提交事务
tx.commit(); // 6:关闭资源
session.close();
sessionFactory.close();
} // 新增数据
public static void insertData() {
// 1;调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 2;获取到session
Session session = sessionFactory.openSession();
// 3:开启事务
Transaction tx = session.beginTransaction(); // 第五步:写具体逻辑crud操作
// 添加功能
//(a):瞬时态:对象里面没有id值,对象与session没有关联
User user = new User();
user.setPassword("123123");
user.setAddress("美國s");
user.setName("mm");
// 调用session的方法实现添加
session.save(user); // 5 提交事务
tx.commit(); // 6:关闭资源
session.close();
sessionFactory.close();
} // 查询多条数据
public static void QueryListData() {
// 1;调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 2;获取到session
Session session = sessionFactory.openSession();
// 3:开启事务
Transaction tx = session.beginTransaction(); String qhl = "from User";
Query query = session.createQuery(qhl);
// 2 调用query对象里面的方法得到结果
List<User> list = query.list();
for (User user : list) {
System.out.println(user.getAddress());
} // 5 提交事务
tx.commit(); // 6:关闭资源
session.close();
sessionFactory.close();
} }
网盘地址 http://pan.baidu.com/s/1qYHPm8W
Hibernate的基础入门(一)的更多相关文章
- Hibernate基础入门
Hibernate是一个开放源代码的对象关系映射框架,它将POJO与数据库表之间建立映射关系.是全自动的ORM框架,可以自动生成SQL语句并自动执行.它对JDBC进行了非常轻量级的封装,使程序员可以随 ...
- Cloudera Manager、CDH零基础入门、线路指导 http://www.aboutyun.com/thread-9219-1-1.html (出处: about云开发)
Cloudera Manager.CDH零基础入门.线路指导http://www.aboutyun.com/thread-9219-1-1.html(出处: about云开发) 问题导读:1.什么是c ...
- Spring基础入门
一.Spring了解 Spring:程序员们的春天 Spring主要技术是IOC.AOP两个大概念 它是轻量级的,每个jar包就1M ~ 3M 左右,所以速度快 面向接口编程:降低了耦合度 面向切面编 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- 「译」JUnit 5 系列:基础入门
原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...
- .NET正则表达式基础入门
这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...
- 从零3D基础入门XNA 4.0(2)——模型和BasicEffect
[题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
随机推荐
- BZOJ-1012-[JSOI2008]最大数maxnumber(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- uva 10391
这个题,单纯做出来有很多种方法,但是时间限制3000ms,因此被TL了不知道多少次,关键还是找对最优解决方法,代码附上: #include<bits/stdc++.h> using nam ...
- Rundeck部署和基本使用
rundeck 介绍 Rundeck 是一款能在数据中心或云环境中的日常业务中使程序自动化的开源软件.Rundeck 提供了大量功能,可以减轻耗时繁重的体力劳动.团队可以相互协作,分享如何过程自动化, ...
- Linux入门之常用命令(9)进程及端口查看
[Linux下查看进程] 查看程序对应进程号:ps –ef|grep 程序名 查看进程占用端口:ss -pl | grep 进程号 [通过进程查看端口] 查看占用的端口号:netstat –nltp| ...
- 自适应 Tab 宽度可以滑动文字逐渐变色的 TabLayout(仿今日头条顶部导航)
TabLayout相信大家都用过,2015年Google大会上发布了新的Android Support Design库里面包含了很多新的控件,其中就包含TabLayout,它可以配合ViewPager ...
- MongoDB学习教程(3)-常用命令
1.MongoDB 条件操作符 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. 在本章节中,我们将讨论如何在MongoDB中使用条件操作符. MongoDB中条件操作符有: (& ...
- java泛型使用总结
1. 泛型方法: 2. 泛型类: 3. 通配符. 1.泛型方法 泛型方法在调用时可以接收不同类型的参数.根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用. 下面是定义泛型方法的规则: 所有 ...
- java Web Servlet学习笔记-1 HttpServletQequest对象的学习
HttpServletQequest对象的学习 HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求 ...
- django celery的分布式异步之路(二) 高并发
当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...
- Linux内存(手动释放cache)
项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -h total used free shared buffers cached ...
