以前聽起hibernate總感覺是一個很奇怪的東西,不知道是用做什么,只知道是一個框架,今天對hibernate的學習,使我受益匪淺,知道了hibernate的作用。
以前在寫程序的時候看,特別是在編寫連接數據庫程序的時候,總要用到jdbc,提前都感覺到jdbc是一個很好的手工方式,并沒有想到更好的實現方法,也不知道jdbc的缺點是什么,因為在做大型項目的時候,必定會要寫很多的程序,當然操作數據庫的更不可缺,所以每次的有很多都是重復的,而且在對象模型和關系模型之間總會遇到很多的問題,也往往會轉來轉去的,當用了hibernate后,可以很方便的操作數據,不用寫那么麻煩的代碼,節省了很多的操作和代碼的編寫,這樣大大提高了代碼編寫的效率,提高了開發的速度!現在將走向hibernate的世界:
一:首先要使用hibernate框架,必定要引入hibernate2.jar包,當然還要引入很多的包,然后寫一個與數據表對應的JavaBean類,與數據庫的字段對應,比如一個簡單的java類如下:
package tmc.hibernat.domian;
import java.util.Date;
public class User {
private int id;
private String name;
private Date date;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
然后編寫一個映射的文件,
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="tmc.hibernat.domian">
<class name="User">
<id name="id">
<generator class="native" />
</id>
<property name="name" unique="true" />
<property name="date" />
</class>
</hibernate-mapping>
在寫一個加載數據庫和連接數據庫的的配置文件:
<!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:///test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<mapping resource="tmc/hibernat/domian/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在此,一切的準備都已經完成,接下來執行寫一些service的java類對數據庫進行操作,就可以實現對數據庫的操做了
寫一個service的java類:
package tmc.hibernate.service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public final class HibernateUitl {
private static SessionFactory sessionFactory;
private HibernateUitl(){
}
/**
* 初始化代碼
*/
static{
//配置的一個實例說明屬性允許應用程序在測繪文件被用來當創造一個SessionFactory
Configuration cfg = new Configuration();
cfg.configure();//讀取配置文件
sessionFactory = cfg.buildSessionFactory();//找出配置文件的所有信息
}
/**
* 獲取SessionFactory的方法
* @return
*/
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
/**
* 獲取session的方法
* @return
*/
public static Session getSession(){
return sessionFactory.openSession();
}
}
然后寫對數據庫的各種操作:
1.寫一個接口:
package tmc.hibernat.domian;
public interface UserDao {
public void saveUser(User user);
public User findUserById(int id);
public User findUserByName(String name);
public void updateUser(User user);
public void remove(User user);
}
2.實現接口:
package tmc.hibernate.service;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import tmc.hibernat.domian.User;
import tmc.hibernat.domian.UserDao;
public class UserHibernateImp implements UserDao{
/**
* 根據id獲取查詢數據庫的內容
*/
@Override
public User findUserById(int id) {
Session s = null;
try{
s = HibernateUitl.getSession();
//Criteria c = s.createCriteria(User.class);
//c.add(Restrictions.eq("name",name));
User user =(User)s.get(User.class,id);//User.class方便找到映射文件
return user;
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 根據用戶名,查詢用戶的信息
*/
@Override
public User findUserByName(String name) {
Session s = null;
try{
s = HibernateUitl.getSession();
Criteria c = s.createCriteria(User.class);
c.add(Restrictions.eq("name",name));
User user =(User)c.uniqueResult();//映射是唯一的
return user;
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 和上面的使用是一樣的,只是用不同的查詢方式而已
* @param name
* @return
*/
public User findUserByName1(String name) {
Session s = null;
try{
s = HibernateUitl.getSession();
//Criteria c = s.createCriteria(User.class);
//c.add(Restrictions.eq("name",name));
String hql = "from User as user where user.name=:n";
Query q = s.createQuery(hql);
q.setString("n",name);
User user =(User)q.uniqueResult();//映射是唯一的
return user;
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 移除數據庫一條記錄
* @see tmc.hibernat.domian.UserDao#remove(tmc.hibernat.domian.User)
*/
@Override
public void remove(User user) {
Session s = null;
//創建一個事務
Transaction tx = null;
try{
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.delete(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 向數據庫添加數據
*/
@Override
public void saveUser(User user) {
Session s = null;
//創建一個事務
Transaction tx = null;
try{
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.save(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 修改數據庫數據
*/
@Override
public void updateUser(User user) {
Session s = null;
//創建一個事務
Transaction tx = null;
try{
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.update(user);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
}
3.測試上面的類:
package tmc.hibernate.service;
import java.util.Date;
import tmc.hibernat.domian.User;
import tmc.hibernat.domian.UserDao;
public class TestDao {
public static void main(String[] args){
UserDao dao = new UserHibernateImp();
User user = new User();
user.setName("name");
user.setDate(new Date());
System.out.println("1111");
dao.saveUser(user);
user.setName("new name");
System.out.println("222");
dao.updateUser(user);
User u = dao.findUserByName(user.getName());
System.out.println("3333");
}
}
這樣的話,就可以完成了對數據庫的各種操作,這樣寫真的很方便,很靈活,減少了很多的重復代碼,但就是配置文件的時候很麻煩,呵呵,反正很多都這樣的,沒有十全十美的東西,但只要好用,就足夠了!