Related
- cst.zju Java-OOP course week 2
- connect java code with mysql database
- Design Pattern -- Factory pattern
- Service and Dao
-
the usage of Junit,Maven
Materials
my code on github
Youtube Course on Hibernate
Overview
簡(jiǎn)單地說(shuō),hibernate 完成了一種映射操作尔许,就是將關(guān)系型數(shù)據(jù)庫(kù)中表映射成為了一個(gè)java對(duì)象,這樣就為代碼操作實(shí)際的數(shù)據(jù)庫(kù)提供了很多方便.
hibernate是對(duì)JDBC的進(jìn)一步封裝斗遏,完成從對(duì)象(Object)到關(guān)系(Relation)的映射(Mapping)授药,也就是一個(gè)ORM框架.
這里一個(gè)圖很清楚表達(dá)了hibernate的組件構(gòu)成.在配置文件中寫的xml被Configure實(shí)例對(duì)象讀取之后可以創(chuàng)建sessionFactory對(duì)象盆偿,用這個(gè)工廠對(duì)象可以進(jìn)一步創(chuàng)建Session,創(chuàng)建連接痊远,操作數(shù)據(jù)庫(kù).
配置文件(默認(rèn)為hibernate.cfg.xml)中申明了一些必要的配置信息伸头,如數(shù)據(jù)庫(kù)的地址,端口號(hào)陆盘,數(shù)據(jù)庫(kù)用戶名普筹,密碼,映射類等等信息.
Code
Dao層用來(lái)操作數(shù)據(jù)庫(kù)(增刪改查)的基本操作隘马,這幾乎是web應(yīng)用程序所默認(rèn)的太防,使用課堂上的例子,來(lái)完成一個(gè)對(duì)user(有三個(gè)字段,自增的id,name(char(30)), 和address(char(50))表的操作.
我們建立了一個(gè)User類酸员,這個(gè)User類的字段和user表中的字段一致蜒车,并且有g(shù)etter/setter方法
package cst.zju.edu.alexsun.model;
import javax.persistence.*;
@Entity
@Table(name = "user")
public class User {
@Id
@Column(name="id")
@GeneratedValue
private int id;
@Column(name="name")
private String name;
@Column(name="address")
private String address;
public User(){
this.id = 6666;
this.name = "6666";
this.address = "6666";
}
public User(int id, String name, String address){
this.name = name;
this.id = id;
this.address = address;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Id
@GeneratedValue
public int getId(){
return id;
}
public String getName(){
return this.name;
}
public String getAddress(){
return this.address;
}
@Override
public String toString() {
return "student id: " + id + " name: "+name+" address in " + address;
}
}
用注解的方法標(biāo)注對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段.
用UserDao設(shè)計(jì)增刪改操作
package cst.zju.edu.alexsun.Dao;
import cst.zju.edu.alexsun.model.User;
import cst.zju.edu.alexsun.util.HibernateUtil;
import org.hibernate.Session;
public class UserDao implements IUserDao {
public void addUser(User user) {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
} catch (Exception e) {
// handle the exception
throw new RuntimeException(e);
} finally {
HibernateUtil.close(session);
}
}
public User getUserByName(String userName) {
Session session = null;
User user = null;
try {
session = HibernateUtil.openSession();
user = (User) session.createQuery("from User where name = ?")
.setParameter(0, userName).uniqueResult();
} catch (Exception e) {
// handle the exception
throw new RuntimeException(e);
} finally {
HibernateUtil.close(session);
}
return user;
}
public void delete(User user) {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
session.delete(user);
session.getTransaction().commit();
} catch (Exception e) {
// handle the exception
throw new RuntimeException(e);
} finally {
HibernateUtil.close(session);
}
}
}
用HibernateUtil進(jìn)行連接,設(shè)置配置屬性.
package cst.zju.edu.alexsun.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil {
private final static SessionFactory FACTORY = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
return factory;
}
public static SessionFactory getSessionFactory() {
return FACTORY;
}
public static Session openSession() {
return FACTORY.openSession();
}
public static void close(Session session) {
if (session != null)
session.close();
}
}