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>
==============================================================================================