天天看點

[Java web]-- hibernate3(1)

0.  M  V  C
 M model JDBC/hibernate/mybatis
 V view  JSP
 C contorller  struts2


 java                          DataBase
 User{id,name,age}         t_user(id,name,age)
 User user         -->            1   c35  18
 User user2        <--            2   c36  19
 Connection conn
 String sql="insert into t_user values(?,?,?)"
 PreparedStatement psta
 psta.setXXX(1,user.getId());
 psta.setXXX(1,user.getName());
 psta.setXXX(1,user.getAge());
 psta.executeUpdate();


 Connection conn
 String sql="select * from t_user where id=?";
 PreparedStatement psta
 psta.setInt(1,2);
 ResultSet res=psta.executeQuery();
 User user2=new User();
 user2.setId(res.getInt("id"));
 ..
 ..
 user2
 =============================================================================================
 1.hibernate  持久層架構  開源
   *是一個底層封裝了jdbc的orm架構
   *orm:Object(java對象)  r(關系型資料庫)   m(mapping映射)  搭建java和資料庫間的通信橋梁
     1.将java對象和資料庫表映射在一起
 2.對象中的屬性和庫表中列映射在一起
 3.在java對象和資料庫之間,直接通信。
   User user=new User(1,"c35",18);
   insert(user);
   User user2=getUser(2);
 =============================================================================================
 2.hibernate 開發流程
   2.1 導入依賴:
        核心jar:hibernate.jar
   第三方依賴jar
   2.2 建立hibernate配置檔案:
       名稱:hibernate.cfg.xml
  位置:src下
 <hibernate-configuration>
 <session-factory>
 <!-- 資料庫連接配接參數 -->
 <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
 <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
 <property name="hibernate.connection.username">hr</property>
 <property name="hibernate.connection.password">hr</property>
 <!-- hibernate自身屬性 -->
 <property name="hibernate.show_sql">true</property>
 <property name="hibernate.format_sql">true</property>
 <!-- 方言:指定連接配接的資料種類 -->
 <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
 <!-- 
 防止j2ee6沖突配置
 <property name="javax.persistence.validation.mode">none</property> 
 -->
 <!-- 注冊映射 -->
 <mapping resource="com/c35/entity/user.hbm.xml"/>
 </session-factory>
 </hibernate-configuration>
    2.3 在映射檔案中搭建orm 映射
        名稱:任意   xxx.hbm.xml
   位置:任意
 <hibernate-mapping>
 <!-- 映射java類和庫表 -->
 <class name="com.c35.entity" table="t_user35">
 <!--映射類的屬性和庫表的列  -->
 <!-- 映射表中的ID列 -->
 <id name="id" column="id" type="java.lang.Integer">
 <!-- id生成器(生成政策),保證在插入資料時id唯一 
 increment:遞增政策
 -->
 <generator class="increment"></generator>
 </id>
 <property name="name" column="name" type="java.lang.String"></property>
 <property name="age" column="age" type="java.lang.Integer"></property>
 </class>
 </hibernate-mapping>
    2.4 在配置檔案中注冊映射
 <!-- 注冊映射 -->
 <mapping resource="com/c35/entity/user.hbm.xml"/>
    2.5 測試  api
         *Configuration  -->加載配置資訊
 Configuration cfg=new Configuration().configure();//加載src下hibernate.cfg.xml檔案
    *SessionFactory -->session工廠,使用者生成session
          SessionFactory sf=cfg.buildSessionFactory();
 *Session -->用以執行curd操作(内置了Connection)
 *注意:其中Configuration和SessionFactory全局唯一,Session獨享。
         *Session api: (在做增删改操作時,需要控制事務。)
  *查詢:session.get(Class,ID);//查詢某張表中的id為xx的資料
         User user=(User)session.get(User.class, 1);//查詢id為1的使用者
  *增加:
 //建立User
 User user=new User(null,"c36",19);
 //在做增删改操作時,需要控制事務。
 Transaction tx=session.beginTransaction();
 //插入User
 session.save(user);
 System.out.println(user.getId());
 tx.commit();
 //tx.rollback();
  *更新:
 //在做增删改操作時,需要控制事務。
 Transaction tx=session.beginTransaction();
 //查詢出要更新的資料
 User user=(User)session.get(User.class,4);
 user.setAge(21);
 user.setName("c37");
 session.update(user);//更新使用者
 tx.commit();
 //tx.rollback();
  *删除:
 //在做增删改操作時,需要控制事務。
 Transaction tx=session.beginTransaction();
 //選擇要删除的資料
 User user=(User)session.get(User.class,4);
 session.delete(user);//删除資料
 tx.commit();
 //tx.rollback();
  *關閉資源:
        session.close();
 ==============================================================================================
 2.Session建立方式:
     SessionFactory sf=xxx;
 *sf.openSession();//建立一個嶄新的Session對象
 *sf.getCurrentSession();//初次被調用,建立一個Session對象session1,之後的在同一個線程内的調用
                       //就不再建立新的Session對象了,而是依然使用session1
 *注意:當使用getCurrentSession擷取session時,需要添加一行配置:
   //開啟currentSession方法,使得getCurrentSession可用來獲得線程唯一的Session
       <property name="current_session_context_class">thread</property>
 *getCurrentSession獲得的Session對象的特點:
    1.curd都需要控制事務
 2.在事務送出後,會自動close.
 ==============================================================================================
 3.技巧:
 <!-- 
 package="com.c35.entity" 指定java實體的包路徑【技巧1】
  -->
 <hibernate-mapping package="com.c35.entity">
 <!-- 映射java類和庫表 
 在影射屬性和列時,如果屬性和列同名,則column可省略【技巧2】
 -->
 <class name="User" table="t_user35">
 <!--映射類的屬性和庫表的列  -->
 <!-- 映射表中的ID列 -->
 <id name="id"  type="java.lang.Integer">
 <!-- id生成器(生成政策),保證在插入資料時id唯一 
     increment:遞增政策
 -->
 <generator class="increment"></generator>
 </id>
 <property name="name" type="java.lang.String"></property>
 <property name="age"  type="java.lang.Integer"></property>
 </class>
 </hibernate-mapping>
 ==============================================================================================