Hibernate自學心得
快大四了,根據自學所學的框架(Sping、Mybatis、Struts2),想出去找找實習工作,所以去看看招聘資訊,發現許多的招聘資訊裡邊要求的框架大多都是Hibernate,所以我索性也學學Hibernate這一個框架,以下為個人心得:
查了些資料,發現,Hibernate在資料量上比不上Mybatis好,資料量在很大的情況下,Hibernate可能出現奔潰、不過在許多方面Hibernate還是很好用的,可以減少了寫sql語句的麻煩,複雜的sql語句只需要簡簡單單的幾行程式碼就可以搞定了。當然Hibernate還還是用了Hql語言,也挺好用的:eg:from 實體類名稱 [條件...];
首先,Hibernate大多使用的是ORM模式(Object Relation Mapping || 物件關係對映)。
不多說,開始編寫:
使用Hibernate需要到官網去下載包(當然我的程式碼裡邊也有):http://hibernate.org/orm/
下載好了之後就可以安安心心的編寫了:
第一步:新建Hibernate的配置檔案,有兩種形式
第一種是properties檔案的配置
配置好了就要實現:
/** * 使用了properties配置檔案和對映類 */ @Test public void test(){ //通過物件插值 Student student = new Student(); student.setId(5); student.setName("myks"); student.setAge(23); Configuration cfg = new Configuration(); cfg.addClass(com.myk.hibernate.Student.class); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); Transaction t = session.beginTransaction(); try { //新增 session.save(student); t.commit();//事務提交 } catch (HibernateException e) { t.rollback();//事務回滾 e.printStackTrace(); }finally{ if(session!=null){ session.close(); } } }
這個地方只是簡單的實現,如果還想要配置一些別的功能或者資原始檔,需要使用自動動手使用java去編寫,新增的方法很簡單的,可以自己百度查,不過因為這樣做很麻煩,且不方便,所以一幫使用xml檔案的配置。
第二種是xml檔案的配置
xml檔案配置也有兩種情況:
第一種情況是使用檔名hibernate.cfg.xml
另外一種是使用別的名字
--看配置(只是部分配置):
再看看對映檔案(對映檔案的檔名一般是以*.hbm.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.url">jdbc:mysql://localhost/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">maiyikai</property> <!-- 資料庫方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 是否後臺顯示sql語句 --> <property name="show_sql">true</property> <!-- 匯入對映資原始檔 --> <mapping resource="com/myk/hibernate/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.myk.hibernate">
<!-- class設定關係對映表 name:對映路徑 table="表名" -->
<class name="Student" table="student">
<!-- id定義的是主鍵列 name:表中的欄位 -->
<id name="id" column="id">
<!-- generator設定主鍵模式 class="主鍵的模式" -->
<generator class="assigned"></generator>
</id>
<!-- 定義其他欄位 -->
<property name="name"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
在這裡涉及到了主鍵的一種對映關係(來自: http://lqzit.iteye.com/blog/845163):
1:assigned:表示在新增資料時由應用程式指定主鍵的值。主要針對主鍵是採用自然主鍵的形式。這種方式,適用於主鍵列不是自動增長列。其缺點為在執行新增操作時,需查詢資料庫判斷生成的主鍵是否已經存在。
2:increment:表示新增資料操作時由hibernate自動生成主鍵值。其生成的值為:先查詢該主鍵列的最大值,然後在最大值的基礎上加上1.適用於採用代理主鍵形式的主鍵列。同樣不能用於主鍵列是自動增長的表。但是,該主鍵生成策略也有些缺點。
(1)新增資料前先查詢一遍,影響了效能。
(2)主鍵的型別只能為數值型的int或者long
(3)併發操作時的衝突問題。
3:identity:不如說是為sqlerver資料庫量身定做的。主要適用於sqlserver資料庫的自動增長列的表。
4:native:表示根據不同的資料庫採用不同的主鍵生成策略。比如,當前資料庫為sqlserver,則會採用identity,如為oracle,則採用oracle中的sequence等。區分資料庫的不同是以hibernate主配置檔案中sessionFactory中配置的資料庫方言。
5.uuid: 唯一主鍵生成辦法。從Hibernate中提取出來。
優點:避免了生成ID 時,與資料庫的再次交道,效能上較高。但對於有的開發人員不太習慣這種id生成方式,UUID生成的32為的字串,不同於identity 從1開始的整數。
Xml程式碼
1.<id name="實體類屬性名" type="java.lang.Integer">
2. <column name="對應表中主鍵欄位名" />
3. <generator class="assiged|increment|identity|native|........" />
4.</id>
<id name="實體類屬性名" type="java.lang.Integer">
<column name="對應表中主鍵欄位名" />
<generator class="assiged|increment|identity|native|........" />
</id>
採用hibernate的主鍵生成策略,就可以比較靈活和方便的對錶中的主鍵欄位進行操作了。而且,不同的資料庫,不同的主鍵形式,也只需要修改下對映檔案就可以了
配置檔案和對映檔案都寫好了之後(部分實現程式碼):
/**
* 使用*.cfg.xml配置檔案和對映檔案
*/
@Test
public void delete(){
Configuration configuration = new Configuration().configure();//載入配置檔案
SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
Session session = sessionFactory.openSession();//開啟session
Transaction transaction = session.beginTransaction();//開啟事務管理
Student student = (Student) session.load(Student.class, 3);//載入類,按照id查詢之後載入
try {
session.delete(student);
transaction.commit();//事務提交
} catch (HibernateException e) {
transaction.rollback();//事務回滾
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}
/**
* 分頁查詢
*/
@Test
public void pageSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int pageNo = 2;
int pageNum = 2;
try {
//查詢全部資料
Criteria criteria = session.createCriteria(Student.class);
criteria.setFirstResult((pageNo-1)*pageNum);//設定起始地記錄位置
criteria.setMaxResults(pageNo*pageNum);//設定終止的記錄位置
List<Student> list = criteria.list();
System.out.println(list);
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 刪除
* 使用*.cfg.xml配置檔案和對映檔案
*/
@Test
public void delete(){
Configuration configuration = new Configuration().configure();//載入配置檔案
SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
Session session = sessionFactory.openSession();//開啟session
Transaction transaction = session.beginTransaction();//開啟事務管理
Student student = (Student) session.load(Student.class, 3);//載入類,按照id查詢之後載入
try {
session.delete(student);
transaction.commit();//事務提交
} catch (HibernateException e) {
transaction.rollback();//事務回滾
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}
/**
* 條件查詢
*/
@Test
public void select(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.load(Student.class, 1);
try {
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}
/**
* 查詢
*/
@Test
public void selectAll(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
//查詢全部資料
Criteria criteria = session.createCriteria(Student.class);
criteria.addOrder(Order.asc("age"));//結果集排序
List<Student> list = criteria.list();
System.out.println(list);
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 條件查詢
*/
@Test
public void selectWhere(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
//查詢全部資料
Criteria criteria = session.createCriteria(Student.class);
// criteria.add(Restrictions.eq("age", 22));//條件查詢
// criteria.add(Restrictions.eq("name", "qw"));//條件查詢
//多條件查詢
criteria.add(Restrictions.and(Restrictions.eq("name", "myk"), Restrictions.ge("age", 21)));
List<Student> list = criteria.list();
System.out.println(list);
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 列查詢
*/
@Test
public void selectCol(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
// criteria.setProjection(Projections.property("age"));//設定查詢列
criteria.setProjection(Projections.projectionList().add(Projections.property("id")).add(Projections.property("name")));//設定多個查詢了列
List<Student> list = criteria.list();
Iterator it = list.iterator();//迭代
while(it.hasNext()){
Object[] obj = (Object[]) it.next();
System.out.println("id: "+obj[0]+" name: "+obj[1]);
}
}
@Test
public void colSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
// criteria.setProjection(Projections.sum("age"));//計算總和
// int ages = (int) criteria.uniqueResult();//取值
// System.out.println(ages);
// criteria.setProjection(Projections.distinct(Projections.property("age")));//去重
// Iterator it = criteria.list().iterator();
// while(it.hasNext()){
// System.out.println(it.next());
// }
//分組
// criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("age")).add(Projections.rowCount(),"age"));
// Iterator it = criteria.list().iterator();
// while(it.hasNext()){
// Object[] obj = (Object[]) it.next();
// System.out.println("age: "+obj[0]+" count: "+obj[1]);
// }
}
@Test
public void sessionSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction teTransaction = session.beginTransaction();
String sql = "select * from student";
List<Student> list = new ArrayList<Student>();
try {
Query query = session.createSQLQuery(sql);
Iterator iterator = query.list().iterator();
while(iterator.hasNext()){
Student student = new Student();
Object[] object = (Object[]) iterator.next();
student.setId(Integer.parseInt(object[0].toString()));
student.setName(object[1].toString());
student.setAge(Integer.parseInt(object[2].toString()));
list.add(student);
}
System.out.println(list);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void sessionQuery(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction teTransaction = session.beginTransaction();
String hql = "from Student";
List list = new ArrayList();
Query query = session.createQuery(hql);
list = query.list();
System.out.println(list);
Student s = new Student();
if(session.contains(s)){
System.out.println("s在快取中");
}else{
System.out.println("s不再快取中");
}
}
/**
* 快取機制
*/
@Test
public void sessionContains(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Student s = new Student();//建立持久化物件
s = (Student) session.get("com.myk.hibernate.Student", 1);//條件獲取
System.out.println("快取"+session.contains(s));
session.clear();//清空快取
System.out.println("快取"+session.contains(s));
}
/**
* 刪除
*/
@Test
public void sessiondelete(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//建立一個持久化物件
// Student s = (Student) session.createQuery("from Student where age = '22'").setMaxResults(1).uniqueResult();
// session.delete(s);//單一刪除
// tx.commit();
//批量刪除
List list = session.createQuery("from Student where name = 'myk'").list();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Student s = (Student) iterator.next();
session.delete(s);
}
tx.commit();
}
等等等等都在檔案裡。