`
KIWIFLY
  • 浏览: 6177 次
文章分类
社区版块
存档分类
最新评论

【hibernate】<第一节>hibernate简单入门

阅读更多

所需工具:

 

ide:eclipse or myeclipse

 

jdk:1.7

 

jar包:hibernate-distribution-3.6.0.Final 和对应mysql的驱动类(对应jar包如图)

 

数据库:mysql 要支持事务的版本,命令行下或用navicat生成如图所示表

 

项目目录结构如下:

其中cn.kiwifly.entity为实体类包,cn.kiwifly.dao为Dao层包,cn.kiwifly.utils为工具包,cn.kiwifly.test为测试包

 

学习目标:完成hibernate的基础入门

 

都准备好了,搞起!

 

第一步:建立hibernate.cfg.xml,这是hibernate的主配置文件,具体配置已在注释上写的很清楚了,

最后一个<mapping />是配置的最后一步,在完成后面两项后再写的!

 

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    	<!-- 配置数据库的别名 -->
    	<!-- 什么是别名?大家都知道hibernate一个重要的优点是可以跨数据库使用,实现这点的原因就在这里,hibernate为每种常见的数据库都
    	实现了特定的sql语句,比如就分页来说,mysql就是limit语句,而oracle就是恶心的多个select嵌套在一起,但是hibernate本身不
    	能识别数据库的类型,在这里我们通过设置别名来告诉hibernate使用什么数据库的语句来实现
    	不同数据库的别名分别是什么?
    	hibernate的包里有一个是常用配置文件,从这里可以查到
    	Hiberante开发包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
    	 -->
    	<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    	<!-- 配置数据库的url地址 -->
    	<property name="hibernate.connection.url">jdbc:mysql:///test</property>
    	<!-- 配置数据库的用户名 -->
    	<property name="hibernate.connection.username">root</property>
    	<!-- 配置数据库的密码 -->
    	<property name="hibernate.connection.password">root</property>
    	
    <!-- 非必须配置 -->
    	<!-- 是否在控制台打印sql语句,建议开发时打开,发布后关闭 -->
    	<property name="show_sql">true</property>
    	<!-- 格式化控制台打印的sql语句 -->
    	<property name="format_sql">true</property>
    	<!-- hibernate有两种开发流程,一个是先在数据库里建好库,建好表,再写对应的实体类,与对应关系。另一种是按需求直接写实体类与对应关系,再通过hibernate自动
    	生成对应的数据库里的表。如果想自动生成表就要配置这个hbm2ddl.auto这个属性了,这个属性有好几个值,一般用update,其余的查文档吧
    	 -->
    	<property name="hbm2ddl.auto">update</property>
    	
    <!-- 添加映射文件 -->
    	<mapping resource="cn/kiwifly/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

 

二步:写与数据库表对应的实体类User.java

 

package cn.kiwifly.entity;

/*
 * 写一个与表对应的实体类,类属性与表一一对应
 * */
public class User {

	/*在数据库中id,我们设置的是int类型,在设置实体类属性时,我们也可以设置成int类型
	 * 但是这里我们要与数据库对应成整型时,最好用Integer类型,因为int是基本
	 * 类型,它只能为0不能为空,但数据库有些字段是可以为空的,为空用null表示最合适,所以
	 * 用包装类对应最好
	 * */
	private Integer id;
	private String name;
	/******参考id类型*****/
	private Integer age;
	private String sex;

	/*******实现getter与setter方法*********/
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	/**********最好也同时实现toString方法,便于测试********/
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
				+ sex + "]";
	}

}

 


第三步:写实体类的映射文件User.hbm.xml(这一步完成就可以在hibernate.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">
<!-- 如果这里不加package,下面如果用类就要写全路径 -->
<hibernate-mapping package="cn.kiwifly.entity">
	<!-- 把实体类与表对应起来,格式
	<class name="实体类" table="对应的表名"> 
		<id name="对应主键的实体类的属性" type="这个属性的类型" column="对应数据库表中的字段">
			<generator class="主键的生成策略" />
		</id>
		<property name="对应普通属性的实体类的属性" type="这个普通属性类型" column="对应数据库表中的字段" />
	</class>
	-->
	<class name="User" table="t_user">
		<!-- 这里配置映射表的主键, -->
		<id name="id" type="java.lang.Integer" column="id">
			<generator class="native" />
		</id>
		<property name="name" type="java.lang.String" column="name" />
		<property name="age" type="java.lang.Integer" column="age" />
		<property name="sex" type="java.lang.String" column="sex" />
	</class>
</hibernate-mapping>

 

 

第四步:写一个封装分页结果的QueryResult类

 

package cn.kiwifly.entity;

import java.util.ArrayList;
import java.util.List;

/*
 * 这个类是用来封装,分页查询数据的类,不 是实体类
 * */
public class QueryResult {

	private List<User> userList = new ArrayList<>();
	private Long total;

	public List<User> getUserList() {
		return userList;
	}

	public void setUserList(List<User> userList) {
		this.userList = userList;
	}

	public Long getTotal() {
		return total;
	}

	public void setTotal(Long total) {
		this.total = total;
	}

	public String toString() {
		return "QueryResult [userList=" + userList + ", total=" + total + "]";
	}

}



第五步:写一个用来获取Session对象的工具类,HibernateUtil.java

 

package cn.kiwifly.utils;

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

/*
 * 一个简单的hibernate工具类,主要作用是,可以返回一个session对象,为什么要用hibernate工具类获取?而不是直接在代码里获取
 * 因为SessionFactory是一个重量级的类,如果不停的获得,释放,会很占资源,一个应用一般一个SessionFactory对象就够了
 * */
public class HibernateUtil {

	private static SessionFactory sessionFactory;

	static {

		sessionFactory = new Configuration()//
				.configure()//
				.buildSessionFactory();
	}
	
	public static Session getSession(){
		
		return sessionFactory.openSession();
	}
}




第六步:写UserDao.java来实现,增删改查分页等方法

 

package cn.kiwifly.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.kiwifly.entity.QueryResult;
import cn.kiwifly.entity.User;
import cn.kiwifly.utils.HibernateUtil;

public class UserDao {

	public void add(User user) {

		// 首先要获取session对象,它是所有操作的根本
		Session session = HibernateUtil.getSession();

		// 开启事务
		Transaction tx = session.beginTransaction();
		try {

			// 调用hibernate封装好save方法把对象存入数据库中,在hibernate中一个类对应数据库库中一张表
			// 一个对象对应数据库中表中的一条记录
			session.save(user);
			// 提交记录
			tx.commit();
		} catch (Exception e) {

			// 如果有任何异常就回滚
			tx.rollback();
			// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
			throw e;
		} finally {

			// 用完session一定要记得释放
			session.close();
		}
	}

	public void delete(Integer id) {

		Session session = HibernateUtil.getSession();

		// 开启事务
		Transaction tx = session.beginTransaction();
		try {

			// 首先要通过id获取数据库里对应的记录的对象
			User user = (User) session.get(User.class, 1);
			// 再通过hibernate封装好的,delete方法,来删除记录
			session.delete(user);
			// 提交记录
			tx.commit();
		} catch (Exception e) {

			// 如果有任何异常就回滚
			tx.rollback();
			// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
			throw e;
		} finally {

			// 用完session一定要记得释放
			session.close();
		}
	}

	public void update(User user) {

		Session session = HibernateUtil.getSession();

		// 开启事务
		Transaction tx = session.beginTransaction();
		try {

			// 首先要通过id获取数据库里对应的记录的对象
			User oldUser = (User) session.get(User.class, user.getId());
			// 再通过对象的setter方法来修改,对象的值
			oldUser.setAge(user.getAge());
			oldUser.setName(user.getName());
			oldUser.setSex(user.getSex());
			// 再通过hibernate封装好的update方法,来修改记录
			session.update(oldUser);
			// 提交记录
			tx.commit();
		} catch (Exception e) {

			// 如果有任何异常就回滚
			tx.rollback();
			// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
			throw e;
		} finally {

			// 用完session一定要记得释放
			session.close();
		}
	}

	public User findById(Integer id) {

		// 直接调用session的get方法就可以了
		return (User) HibernateUtil.getSession().get(User.class, id);
	}

	@SuppressWarnings("unchecked")
	public List<User> findAll() {

		Session session = HibernateUtil.getSession();

		// 如果要获取全部的记录,那么hibernate封装的方法就没有直接可以使用的了,所以我要创建一个查询
		//注意:1、如果前面是SELECT * 可以省略不写2、FROM 后面跟的不是表名,是与表映射的实体类名
		Query query = session.createQuery("FROM User");
		// 它有一个list()方法可以直接把结果转成list类型,这个真爽
		//这里如果用eclipse会警告,不影响使用,我一直没搞清楚这里的警告是为什么?如有大神知道,麻烦告诉一下,谢谢
		List<User> userList = query.list();

		return userList;
	}

	@SuppressWarnings("unchecked")
	public QueryResult findAllByPage(int firstResult, int maxResults) {

		Session session = HibernateUtil.getSession();

		//创建用于封装结果的QueryResult对象
		QueryResult queryResult = new QueryResult();
		
		// 复杂的查询就要用自己写sql
		// hibernate对分页有封装好的方法,setFirstResult是设置起始页,setMaxResults是设置一页显示的数量
		List<User> userList = session.createQuery("FROM User")//
				.setFirstResult(firstResult)//
				.setMaxResults(maxResults)//
				.list();
		// 分页还需要知道总的记录数
		Long total = (Long) session.createQuery("SELECT COUNT(ID) FROM User").uniqueResult();

		//装载数据
		queryResult.setUserList(userList);
		queryResult.setTotal(total);
		
		return queryResult;
	}
}



第七步:测试UserDao

 

package cn.kiwifly.test;

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

import org.junit.Test;

import cn.kiwifly.dao.UserDao;
import cn.kiwifly.entity.QueryResult;
import cn.kiwifly.entity.User;

public class UserDaoTest {

	@Test
	public void testAdd() {
		
		User user = new User();
		user.setName("小明");
		user.setAge(88);
		user.setSex("男");
		
		UserDao userDao = new UserDao();
		userDao.add(user);
	}

	@Test
	public void testDelete() {

		new UserDao().delete(1);
	}

	@Test
	public void testUpdate() {
		
		User user = new User();
		user.setId(1);
		user.setName("小红");
		user.setAge(99);
		user.setSex("女");
		
		new UserDao().update(user);
	}

	@Test
	public void testFindById() {

		User user = new UserDao().findById(1);
		
		System.out.println(user);
	}

	@Test
	public void testFindAll() {
		
		List<User> userList = new UserDao().findAll();
		
		for (Iterator<User> iterator = userList.iterator(); iterator.hasNext();) {
			User user = (User) iterator.next();
			
			System.out.println(user.getName());
		}
	}

	@Test
	public void testFindAllByPage() {
		
		QueryResult queryResult = new UserDao().findAllByPage(10, 10);
		List<User> userList = queryResult.getUserList();
		Long total = queryResult.getTotal();
		
		System.out.println("总共有"+total+"条记录");
		for (User user : userList) {
			
			System.out.println(user.getName());
		}
	}
	
	@Test
	public void testAddUses(){
		
		UserDao userDao = new UserDao();
		
		for(int i = 0; i < 30; i++){
			
			User user = new User();
			user.setName("张"+i);
			
			userDao.add(user);
		}
	}

}



谢谢观看!奋斗

分享到:
评论

相关推荐

    hibernate入门

    Hibernate 提供了两级缓存:第一级缓存是Session级别的,自动管理;第二级缓存可配置为应用程序范围,如EhCache、Infinispan等。 ### 十、实体关系映射 Hibernate 支持多种对象关系映射,如一对一、一对多、多对一...

    hibernate3入门

    - **第一个Hibernate程序**:最简单的示例是将一个Java对象映射到数据库中的一个表。这通常涉及到定义对象与表之间的映射关系。 - **配置Hibernate**:配置是使用Hibernate的关键步骤之一,包括设置数据库连接参数、...

    Hibernate 的第一个例子

    在本文中,我们将深入探讨如何创建Hibernate的第一个例子,帮助初学者快速入门。** **一、Hibernate 简介** Hibernate 提供了丰富的API,简化了Java应用程序与关系数据库之间的交互。它通过XML配置文件或注解来定义...

    开源框架 Spring Gossip

    &lt;br&gt;第一个 Hibernate 程式 &lt;br&gt;SessionFactory 注入 &lt;br&gt;HibernateTemplate &lt;br&gt;Hibernate 编程交易管理 &lt;br&gt;Hibernate 宣告式交易管理 &lt;br&gt;&lt;br&gt;&lt;br&gt;Web 层 &lt;br&gt; Spring 提供了 MVC Web 框架,您可以善用 IoC 容器...

    (2.0版本)自己写的struts2+hibernate+spring实例

    直接配置即可.&lt;br&gt;&lt;br&gt;以下是一些相关说明.&lt;br&gt;&lt;br&gt;&lt;br&gt;数据库脚本&lt;br&gt;create table HUBO_USER&lt;br&gt;(&lt;br&gt; ID VARCHAR2(32) not null,&lt;br&gt; NAME VARCHAR2(100),&lt;br&gt; BIRTHDAY DATE,&lt;br&gt; PASSWORD VARCHAR2(100),&lt;br&gt; ...

    Hibernate入门笔记.pdf

    ### Hibernate入门知识点详解 #### 一、环境搭建与配置 **1. 搭建环境:** - 创建一个新的Java项目,命名为`HibernateDemo`。 - 导入Hibernate相关的jar包,包括`hibernate3.jar`核心jar包和其他必需的依赖库,...

    SpringMVC框架第一天【随堂笔记】1

    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt; &lt;url-pattern&gt;/&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ``` 在这里,`spring-mvc-servlet.xml`是...

    hibernate入门--第一个实例

    【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...

    Hibernate 手册 第一章 Hibernate入门

    《Hibernate 手册 第一章 Hibernate入门》 Hibernate 是一个开放源码的Java持久化框架,它为Java开发者提供了一种对象关系映射工具来管理Java应用中的关系数据。本章将带你逐步走进Hibernate的世界,了解其基本概念...

    Hibernate v3.2中文参考手册

    &lt;br&gt;&lt;br&gt;阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 &lt;br&gt;&lt;br&gt;阅读第 2 章 体系结构(Architecture)来理解...

    hibernate入门示例

    Hibernate 提供了两级缓存:第一级缓存是SessionFactory级别的,每个Session都有自己的缓存;第二级缓存是SessionFactory级别的,可以跨Session共享数据。通过配置文件或编程方式可以启用并配置缓存。 七、总结 这...

    Hibernate3.2官方中文参考手册

    &lt;br&gt;&lt;br&gt;阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 &lt;br&gt;&lt;br&gt;阅读第 2 章 体系结构(Architecture)来理解...

    Hibernate教程.ppt

    首先,让我们从Hibernate入门开始。在创建一个Hibernate项目时,你需要为你的应用配置一个hibernate.cfg.xml文件。例如,以下是一个简单的配置示例: ```xml &lt;hibernate-configuration&gt; &lt;session-factory&gt; ...

    struts2入门,struts2 标签

    - 第一种方式:直接定义列表选项。 ```xml &lt;s:radiolist name="userBean.gender" list="{male:男, female:女}" /&gt; ``` - 第二种方式:从请求或会话作用域获取列表。 ```xml &lt;s:radiolist name="userBean....

    我的第一个hibernate程序

    本教程将引导你了解并实现“我的第一个Hibernate程序”,带你入门这个强大的ORM(对象关系映射)工具。 一、Hibernate简介 Hibernate是Java领域中最流行的ORM框架之一,它允许我们将Java对象与数据库表进行映射,...

    第一个struts2程序

    这个"第一个struts2程序"是初学者入门Struts2框架的一个基础练习,它将帮助你理解如何配置和运行一个基本的Struts2应用。 首先,了解Struts2的核心概念至关重要。Struts2框架通过提供控制器Servlet...

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    Hibernate入门(代码+笔记)

    **第一部分:Hibernate入门** 这部分主要介绍了Hibernate的基本概念和安装配置。Hibernate基于Java Persistence API(JPA),它提供了对象关系映射(ORM)功能,将Java类映射到数据库表。首先,你需要下载Hibernate...

    Hibernate入门代码.rar

    **Hibernate入门代码** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层SQL语句。这个压缩包“Hibernate入门代码.rar”提供了一些基础案例,...

    hibernate5--1.入门及核心API

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;5.x.y&lt;/version&gt; &lt;/dependency&gt; ``` 然后,创建`hibernate.cfg.xml`配置文件,指定数据库连接信息、实体类扫描路径等。 ##...

Global site tag (gtag.js) - Google Analytics