所需工具: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 + "]"; } }
<?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(); } }
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); } } }
謝謝觀看!