甜咖啡

我的IT空间

HIbernate对数据库的操作

以前听起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");
}
}

这样的话,就可以完成了对数据库的各种操作,这样写真的很方便,很灵活,减少了很多的重复代码,但就是配置文件的时候很麻烦,呵呵,反正很多都这样的,没有十全十美的东西,但只要好用,就足够了!

posted on 2011-01-23 16:12 甜咖啡 阅读(5211) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(1)

我参与的团队

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜