【hibernate】<第一節>hibernate簡單入門

所需工具:html


ide:eclipse or myeclipsejava


jdk:1.7mysql


jar包:hibernate-distribution-3.6.0.Final 和對應mysql的驅動類(對應jar包如圖)sql


數據庫:mysql 要支持事務的版本,命令行下或用navicat生成如圖所示表數據庫


項目目錄結構以下:session

其中cn.kiwifly.entity爲實體類包,cn.kiwifly.dao爲Dao層包,cn.kiwifly.utils爲工具包,cn.kiwifly.test爲測試包oracle


學習目標:完成hibernate的基礎入門app


都準備好了,搞起!eclipse


第一步:創建hibernate.cfg.xml,這是hibernate的主配置文件,具體配置已在註釋上寫的很清楚了,ide

最後一個<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, 1);
	}

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

		Session session = HibernateUtil.getSession();

		// 若是要獲取所有的記錄,那麼hibernate封裝的方法就沒有直接可使用的了,因此我要建立一個查詢
		//注意:一、若是前面是SELECT * 能夠省略不寫二、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);
		}
	}

}


謝謝觀看!奮鬥

相關文章
相關標籤/搜索