1. 程式人生 > >Hibernate入門教程

Hibernate入門教程

wid gre pre 入門 arr 無需 框架 lib 連接池

技術分享圖片

Hibernate

隨心所欲的使用面向對象思想操縱數據庫.


Table of contents

  • 介紹
  • 搭建開發環境
  • 半sql半面向對象寫法
  • 完全的sql寫法
  • 完全的面向對象寫法

Hibernate

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫,從而無需顧及數據庫的實現究竟是SQLServer還是Mysql還是Oracle

搭建環境

搭建在一般工程中

  1. jar下載
  2. 配置文件

jar下載

官網Hibernate進入後看到hibenate ORM,點擊more,左側邊欄選擇releases中的一個版本,頁面最下方,選擇download下載即可
官方jar包:lib文件:requeired文件裏的所有jar拷貝到自己的新建工程中去,然後在加上連接數據庫相關的包,mysql-connector

配置文件

Hibernate.cfg.xml放置在src下,需要修改url,username和password

    <?xmlversion='1.0'encoding='utf-8'?>
    <!DOCTYPEhibernate-configurationPUBLIC
    "-//Hibernate/HibernateConfigurationDTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    <session-factory>
    <propertyname="connection.url">jdbc:mysql://localhost:3306/mycms</property>
    <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
    <propertyname="connection.username">root</property>
    <propertyname="connection.password">123456</property>
    
    <mappingresource="com/selton/Node.hbm.xml"></mapping>
    </session-factory>
    </hibernate-configuration>

<mappingresource="com/selton/Node.hbm.xml"></mapping>

Node.hbm.xml 映射到具體的pojo,一個pojo配置一個映射的xml
名字和數據庫的名字即使一樣,也需要寫上property的映射

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.selton">
    <class name="com.selton.Node" table="tree">
        <id name="id" column="id">
            <generator class="native"></generator>
            <!--可以實現自動增長,也就是將實體類存儲到數據庫的時候,少set一個主鍵
               比較疑惑,反正有沒有這句話,數據庫那兒都需要自動增長-->
        </id>
    
        <property name="nodeId" column="nodeId"></property>
        <property name="pid" column="pid"></property>
        <property name="type" column="type"></property>
        <property name="url" column="url"></property>
        <property name="icon" column="icon"></property>
        <property name="description" column="description"></property>
        <property name="level" column="level"></property>
        <property name="name" column="name"></property>
    </class>
    
    </hibernate-mapping>

pojo的主鍵屬性名稱對應到數據庫實體的主鍵名稱寫在id中
,其他的寫在property中

半sql半面向對象寫法

  • 單個數據(對象)存儲到數據庫
  • 查詢單個對象
  • 更新單個對象
  • 刪除對象
  • 查詢整個表
  • 查詢某個對象的某個屬性
  • 查詢指定行數據
  • 查詢指定數據傳回一個實體
  • 分組聚合
  • 排序
  • limit
  • 使用參數
  • in
  • 寫在配置文件裏

在一個入口方法或者測試類方法中,加入

//構建上下文換肩加配置連接池,開啟事務
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//這裏填寫測試代碼
//提交事務並關閉各種流
transaction.commit();
session.close();
sessionFactory.close();

以下的測試代碼,分別放在上面代碼的`這裏填寫測試代碼

單個數據存儲到數據庫

    Node node = new Node();;
    node.setNodeId("testNodeId1");
    node.setPid("testPid1");
    node.setType((byte)1);
    node.setLevel((short)1);
    node.setName("testName1");
    session.save(node);  

查詢單個對象

Node node=(Node)session.get(Node.class,1);
System.out.println(node);
//Node.class後面的1是數據庫中的主鍵值  

更新單個對象

Node node=(Node)session.get(Node.class,10);
node.setName("updateName");
session.update(node);  

刪除對象

Node node = (Node) session.get(Node.class, 10);
session.delete(node);  

查詢整個表

這裏需要註意,如果你的pojo叫 myuser,而數據庫中對應的表叫user,所有使用createQuery的地方,涉及到了表,就該填myuser

Query query = session.createQuery("FROM Node");
List list = query.list();
System.out.println("list = " + list);  

查詢某個對象的某個屬性

Query query = session.createQuery("SELECT nodeId FROM Node");
List list = query.list();
System.out.println("list = " + list);  

查詢指定行數據

Query query = session.createQuery("FROM Node WHERE type=?");
query.setParameter(0,10);
List list = query.list();
System.out.println("list = " + list);  

查詢指定數據傳回一個實體

//需要pojo有相應的構造器
Query query = session.createQuery("SELECT new Node(id,name,nodeId) FROM Node");
List<Node> list = query.list();
System.out.println("list = " + list);  

分組聚合

Query query = session.createQuery("SELECT type,SUM(id) FROM Node GROUP BY type");
List list = query.list();
for (Object o : list) {
    Object[] result = (Object[]) o;
    System.out.println(Arrays.toString(result));
}  

排序

Query query = session.createQuery("FROM Node ORDER BY id DESC");
List list = query.list();
System.out.println("list = " + list);  

limit

Query query = session.createQuery("FROM Node ORDER BY id DESC");
query.setFirstResult(2);
query.setMaxResults(3);
List list = query.list();
System.out.println("list = " + list);  

使用參數

String colName = "id";
String sql = "FROM Node WHERE " + colName + "=?";
Query query = session.createQuery(sql);
query.setParameter(0,6);

Node node = (Node) query.uniqueResult();
System.out.println("node = " + node);  

或者這種

Query query = session.createQuery("FROM Node WHERE id:id");
query.setParameter("id",7);
List list = query.list();
System.out.println("list = " + list);  

in

Query query = session.createQuery("FROM Node WHERE id IN(:ids)");
query.setParameterList("ids",new Object[]{4,6,7});
List list = query.list();
System.out.println("list = " + list);
//In 的效率很低

寫在配置文件裏

User.hbm.xml

<hibernate-mapping>
... 
<query name="getUserByAge">
    FROM Node WHERE id between ? AND ?
</query>
...
</hibernate-mapping>  

代碼部分

Query query = session.getNamedQuery("getUserByAge");
query.setParameter(0,6);
query.setParameter(1,8);
List list = query.list();
System.out.println("list = " + list);  

完全的sql寫法

仿照第一種半sql寫法,格式變化就可以

1.原生sql寫法

SQLQuery query = session.createSQLQuery("SELECT * FROM tree");
query.addEntity(Node.class);
List list = query.list();
System.out.println("list = " + list);  

完全的面向對象寫法

仿照第一種半sql寫法,格式變化就可以

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.eq("id",6));
List list = criteria.list();
System.out.println("list = " + list);  

相當於查出來了所有的放在criteria裏面

  • 不等於
  • 排序
  • 添加分頁
  • 分組聚合

不等於

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
List list = criteria.list();
System.out.println("list = " + list);  

排序

Criteria criteria = session.createCriteria(Node.class);
criteria.addOrder(Order.desc("id"));
List list = criteria.list();
System.out.println("list = " + list);  

添加分頁

Criteria criteria = session.createCriteria(Node.class);
criteria.add(Restrictions.ne("id",1));
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List list = criteria.list();
System.out.println("list = " + list);  

分組聚合

Criteria criteria = session.createCriteria(Node.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("id"));
projectionList.add(Projections.groupProperty("type"));
criteria.setProjection(projectionList);
List list = criteria.list();
for (Object o : list) {
    Object[] result = (Object[]) o;
System.out.println(Arrays.toString(result));
}

Hibernate入門教程