Java:hibernate入門(一)
一Java三層結構
1 web層:struts框架
2 service層:Spring框架
3 dao層 :hibernate框架
相當於MVC的思想
1 M:模型èhibernate框架
2 V:視圖èstruts框架
3 C:控制器èSpring框架
1:Hibernate是對JDBC進一步封裝
不需要復雜的jdbc代碼,不需要寫sql語句也能實現
- 沒有使用hibernate如下:
Jdbc: public static final String URL="jdbc:mysql://localhost:3306/數據庫";//鏈接的mysql public static final String NAME = "root"; public static final String PASSWORD = "root"; public static final String DREIVER = "com.mysql.jdbc.Driver"; //加載驅動 Class.forName(DREIVER); //創建連接 Connection con=DriverManager.getConnection(URL, NAME, PASSWORD); //對sql進行編譯操作 String sql = "select * from users "; //查詢多條數據 PreparedStatement psmt=con.prepareStatement(sql); //執行sql ResultSet rs= psmt. executeQuery(); //遍歷結果集 ….. //釋放資源
2 使用hibernate:讓實體類和表一一對應不需要代碼即可實現,使用配置文件完成
hibernate封裝的對象session
//創建實體類的對象
User user =new User();
user.setName("明珠");
session.sava(user);
2:Hibernate的核心
A :Configuration接口:負責配置並啟動Hibernate
B :SessionFactory接口:負責初始化Hibernate
C :Session接口:負責持久化對象的CRUD操作
D :Transaction接口:負責事務
F :Query接口和Criteria接口:負責執行各種數據庫查詢
註意:Configuration實例是一個啟動期間的對象,一旦SessionFactory創建完成它就被丟棄
二:Hibernate 準備
- 導入jar包
2.創建實體類(Javabean)
創建一個User的實體類
/** * 2 創建實體類,然後配置實體類和數據庫表一一對應關系(映射關系) * @author Xiao_Zhu * */ public class User { // hibernate要求實體類有一個屬性唯一的 // private String uuid; private int id; private String name; private String password; private String address; /* * public String getUuid() { return uuid; } * * public void setUuid(String uuid) { this.uuid = uuid; } */ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3 :配置實體類和數據庫表一一對應關系(映射關系)
(1):使用配置文件實現映射關系
a. 創建xml格式的配置文件
映射配置文件名稱和位置沒有固定要
建議:配置文件最好放在實體類相應的包的路徑下. 配置文件的名稱:實體名稱.hbm.xml (這是我的習慣)
創建一個User.hbm.xml的配置文件
<?xml version="1.0"?> <!-- 只有引入約束,下面才能使用hibernate-mapping的標簽 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 1配置類和表對應 class標簽 name屬性:實體類全路徑 ==>如: com.zhu.domain.User table屬性:數據庫表名稱 --> <class name="com.zhu.domain.User" table="td_users"> <!-- 2配置實體類ID和表裏面的id對應 hibernate:要求實體類有個屬性唯一值 hibernate:要求表有字段作為 --> <!-- id標簽 name:實體類裏面 id屬性名 column:生成的表字段名稱 --> <id name="uuid" column="uuid"> <!-- 3 設置數據庫表id增長策略 native: 生成表id值就是主鍵自動增長 --> <generator class="uuid"></generator> </id> <!-- 4:配置其他屬性和表字段對應 name屬性:實體類屬性(變量)名稱 column :數據庫表字段的名稱 --> <property name="name" column="name"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
4:創建hibernate的核心配置文件
a:核心配置文件格式xml,而且核心配置文件名稱和位置固定的
位置:必須在src下面
名稱:必須hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 第一部分:配置數據庫信息 jdbc:mysql://localhost:3306/--> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/jdbc01 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 第二部分:配置hibernate信息 --> <!--輸出底層sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 輸出底層SQL語句格式 --> <property name="hibernate.format_sql">true</property> <!-- hibernate幫創建表,需要配置之後 update:如果已經有表,那麽就更新,如果沒有,創建 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置數據庫方言 在mysql裏面實現分頁關鍵字limit,只能使用mysql裏面 在Oracle數據庫,實現紛紛也rownum 讓hibernate框架識別不同數據庫語句 --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5Dialect </property> <!-- 把session綁定到hibernate --> <property name="current_session_context_class">thread</property> <!-- 第三部分:把映射文件放到核心配置文件中 --> <!-- 因為對應的表hibernatexml.hbm.xml配置文件放在包裏,不是src下面的目錄下;所以路徑要這樣寫 --> <!-- 如果User.hbm.xml放在src下的目錄下面,那麽路徑 就可以 直接這樣寫==>User.hbm.xml --> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/jdbc01</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <mapping resource="com/zhu/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
5 創建數據的表
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtils { static Configuration cfg=null; static SessionFactory sessionFactory=null; static { cfg=new Configuration(); cfg.configure(); ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); sessionFactory = cfg.buildSessionFactory(registry); } //提供方法放回本地線程綁定session的方法 public static Session getSessionObejct(){ return sessionFactory.getCurrentSession(); } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void main(String[] args) { //要運行這裏程序,運行之後才會在相應的某個數據庫中生產一張表 //運行之後去mysql中看一下是否成功生產了td_users表 } }
三:實現CRUD操作
第一步: 加載hibernate核心配置文件
第二步:創建SessionFactory對象
第三部使用SessionFactory創建session對象
第四部:開啟事務
第五步:寫具體邏輯crud操作
第六步:提交事務
第七步:關閉資源
(1):瞬時態, 持久態, 托管態
(a):瞬時態:對象裏面沒有id值,對象與session沒有關聯
(b):持久態:對象裏面有ID值,對應於session關聯
(c):托管態:對象有ID值,對象與session沒有關聯
如:托管態
User user=new User();
user.setId(1);
1 創建一個TestCRUD的類
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.zhu.domain.User; import com.zhu.unit.HibernateUtils; public class TestCRUD { public static void main(String[] args) { // 新增數據 // insertData(); // 查詢一條數據 通過ID // queryDataById(); // 修改一條數據 // updateData(); /// 查詢多條數據 QueryListData(); // 刪除數據 // deleteData(); } // 查詢一條數據 通過ID public static void queryDataById() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 4根據ID查詢 // 調用session裏面的get方法 // 第一個參數:是實體類的class // 第二參數:是數據庫 的id值
//(b):持久態:對象裏面有ID值,對應於session關聯 User user = (User) session.get(User.class, 1); System.out.println("地址 ==>" + user.getAddress()); // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 修改一條數據 public static void updateData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 4根據修改 // 調用session裏面的get方法 // 第一個參數:是實體類的class // 第二參數:是數據庫 的id值 User user = (User) session.get(User.class, 1); user.setAddress("中國"); // 調用session的方法update修改 session.update(user); // 註意:sava的方法也能進行修改 // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 刪除數據 public static void deleteData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 4 刪除 // 第一種刪除:根據ID查詢對象再刪除 User user = (User) session.get(User.class, 1); session.delete(user); /* * //第二種刪除: User user2=new User(); user.setId(3); session.delete(user2); */ // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 新增數據 public static void insertData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 第五步:寫具體邏輯crud操作 // 添加功能
//(a):瞬時態:對象裏面沒有id值,對象與session沒有關聯
User user = new User(); user.setPassword("123123"); user.setAddress("美國s"); user.setName("mm"); // 調用session的方法實現添加 session.save(user); // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 查詢多條數據 public static void QueryListData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); String qhl = "from User"; Query query = session.createQuery(qhl); // 2 調用query對象裏面的方法得到結果 List<User> list = query.list(); for (User user : list) { System.out.println(user.getAddress()); } // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } }
網盤地址 http://pan.baidu.com/s/1qYHPm8W
Java:hibernate入門(一)