甜咖啡

          我的IT空間

          HIbernate對(duì)數(shù)據(jù)庫的操作

          以前聽起hibernate總感覺是一個(gè)很奇怪的東西,不知道是用做什么,只知道是一個(gè)框架,今天對(duì)hibernate的學(xué)習(xí),使我受益匪淺,知道了hibernate的作用。
          以前在寫程序的時(shí)候看,特別是在編寫連接數(shù)據(jù)庫程序的時(shí)候,總要用到j(luò)dbc,提前都感覺到j(luò)dbc是一個(gè)很好的手工方式,并沒有想到更好的實(shí)現(xiàn)方法,也不知道jdbc的缺點(diǎn)是什么,因?yàn)樵谧龃笮晚?xiàng)目的時(shí)候,必定會(huì)要寫很多的程序,當(dāng)然操作數(shù)據(jù)庫的更不可缺,所以每次的有很多都是重復(fù)的,而且在對(duì)象模型和關(guān)系模型之間總會(huì)遇到很多的問題,也往往會(huì)轉(zhuǎn)來轉(zhuǎn)去的,當(dāng)用了hibernate后,可以很方便的操作數(shù)據(jù),不用寫那么麻煩的代碼,節(jié)省了很多的操作和代碼的編寫,這樣大大提高了代碼編寫的效率,提高了開發(fā)的速度!現(xiàn)在將走向hibernate的世界:
          一:首先要使用hibernate框架,必定要引入hibernate2.jar包,當(dāng)然還要引入很多的包,然后寫一個(gè)與數(shù)據(jù)表對(duì)應(yīng)的JavaBean類,與數(shù)據(jù)庫的字段對(duì)應(yīng),比如一個(gè)簡單的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;
          }


          }
          然后編寫一個(gè)映射的文件,
          <?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>

          在寫一個(gè)加載數(shù)據(jù)庫和連接數(shù)據(jù)庫的的配置文件:
          <!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>

          在此,一切的準(zhǔn)備都已經(jīng)完成,接下來執(zhí)行寫一些service的java類對(duì)數(shù)據(jù)庫進(jìn)行操作,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操做了
          寫一個(gè)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{

          //配置的一個(gè)實(shí)例說明屬性允許應(yīng)用程序在測繪文件被用來當(dāng)創(chuàng)造一個(gè)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();
              }
          }

          然后寫對(duì)數(shù)據(jù)庫的各種操作:
          1.寫一個(gè)接口:
          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.實(shí)現(xiàn)接口:
          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{
             
          /**
          * 根據(jù)id獲取查詢數(shù)據(jù)庫的內(nèi)容
          */
          @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();
          }

          }
          }
             /**
              * 根據(jù)用戶名,查詢用戶的信息
              */
          @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();
          }

          }
          }
              /**
               * 移除數(shù)據(jù)庫一條記錄
               * @see tmc.hibernat.domian.UserDao#remove(tmc.hibernat.domian.User)
               */
          @Override
          public void remove(User user) {
          Session s = null;
          //創(chuàng)建一個(gè)事務(wù)
          Transaction tx = null;
          try{
          s = HibernateUitl.getSession();
          tx = s.beginTransaction();
          s.delete(user);
          tx.commit();
          }finally{
          if(s!=null){
          s.close();
          }

          }

          }
              /**
               * 向數(shù)據(jù)庫添加數(shù)據(jù)
               */
          @Override
          public void saveUser(User user) {
          Session s = null;
          //創(chuàng)建一個(gè)事務(wù)
          Transaction tx = null;
          try{
          s = HibernateUitl.getSession();
          tx = s.beginTransaction();
          s.save(user);
          tx.commit();
          }finally{
          if(s!=null){
          s.close();
          }

          }
          }
            /**
             * 修改數(shù)據(jù)庫數(shù)據(jù)
             */
          @Override
          public void updateUser(User user) {
          Session s = null;
          //創(chuàng)建一個(gè)事務(wù)
          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");
          }
          }

          這樣的話,就可以完成了對(duì)數(shù)據(jù)庫的各種操作,這樣寫真的很方便,很靈活,減少了很多的重復(fù)代碼,但就是配置文件的時(shí)候很麻煩,呵呵,反正很多都這樣的,沒有十全十美的東西,但只要好用,就足夠了!

          posted on 2011-01-23 16:12 甜咖啡 閱讀(5217) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          我參與的團(tuán)隊(duì)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 虞城县| 宜阳县| 凤冈县| 神农架林区| 新龙县| 东宁县| 马边| 梁山县| 原平市| 昆山市| 慈溪市| 光山县| 海阳市| 平阴县| 乌兰察布市| 唐河县| 诸城市| 北票市| 平陆县| 民勤县| 榆中县| 泰宁县| 镇平县| 旬阳县| 许昌县| 兰坪| 通江县| 右玉县| 河北区| 天长市| 米泉市| 涞水县| 桂平市| 延长县| 嘉兴市| 亳州市| 阳西县| 姚安县| 金昌市| 贵南县| 平谷区|