hibernate5

版权声明:随意 https://blog.csdn.net/caokangnsd/article/details/81842848

1,下载hibernate相关jar包

更改为hibernate5.2.17

2,配置文件

 hibernate.cfg.xml文件,位置:(未配置路径)内容:

类映射文件,举例:Employee.hbm.xml,位置:内容:

blob.png

Oracle方言:

  • org.hibernate.dialect.Oracle10gDialect(Dùngcho 10g&11g)

  • org.hibernate.dialect.Oracle12cDialect

SQL Server方言:

  • org.hibernate.dialect.SQLServerDialect并

  • org.hibernate.dialect.SQLServer2012Dialect

  • org.hibernate.dialect.SQLServer2008Dialect

MySQL方言

  • org.hibernate.dialect.MySQLDialect

  • org.hibernate.dialect.MySQL5Dialect

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect
   </property>
   <property name="hibernate.connection.driver_class">
      com.mysql.jdbc.Driver
   </property>

   <!-- Assume test is the database name -->
   <property name="hibernate.connection.url">
      jdbc:mysql://localhost:3306/test
   </property>
   <property name="hibernate.connection.username">
      root
   </property>
   <property name="hibernate.connection.password">
      11111
   </property>
	<property name="show_sql">true</property>
   <!-- List of XML mapping files -->
   <mapping resource="Employee.hbm.xml"/>
   <mapping resource="Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Employee.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name="hibernate.Employee" table="EMPLOYEE">
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="native"/><!-- 生成策略 -->
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
</hibernate-mapping>

注释形式:@Entity @Table @Id @Column

@Entity
@Table(name = "tb_employee")
public class Employee {
    @Id
    private int id;
    private String firstName, lastName;
        @Column(name = "DEPT_ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

注释对应映射文件配置:

<mapping class="com.yiibai.Employee"/>

操作类:

    private static SessionFactory factory;
	
	public static void main(String[] args) {
		Transaction tx = null;
		Session session = null;
		try {
			Configuration configuration=new Configuration().configure();
			factory=configuration.buildSessionFactory();
			System.out.println(factory);
			session=factory.openSession();
			tx=session.beginTransaction();
			//保存
			Employee employee=new Employee("A","B",100);
			session.save(employee);
			//查询
			//1
			/*String wherestr = " FROM EMPLOYEE ";
			List list = session.createQuery(wherestr).list();
			Iterator it=list.iterator();
			while(it.hasNext()) {
				Employee e1 = (Employee) it.next();
				System.out.println(e1.getId());
			}
			//2
			Employee e2 = (Employee)session.get(Employee.class, 1);
			//更新
			e2.setSalary(10000);
			session.update(e2);
			//删除
			session.delete(e2);*/
			tx.commit();
		}catch (Exception e) {
			// TODO: handle exception
			tx.rollback();
		}finally {
			session.close();
		}
	}

生成器:

  1. assigned

  2. increment

  3. sequence

  4. hilo

  5. native    默认

  6. identity

  7. seqhilo

  8. uuid

  9. guid    mysql,sqlserver

  10. select

  11. foreign

  12. sequence-identity

在表配置文件中ID的生成策略可以通过配置实现不同要求

举例:guid

    <id name="id" column="id">
     <generator class="guid">
     </generator>
  </id>

blob.png

首先id应为字符串类型

二级缓存:

1,hibernate.cfg.xml文件配置

添加

        <!--  -->
	<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
	<property name="hibernate.cache.use_second_level_cache">true</property>

2,Employee.hbm.xml文件配置

添加

<cache usage="read-only" />
在class内

3,添加ehcache.xml文件

路径与hibernate.cfg.xml相同

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">

    <diskStore path="java.io.tmpdir/ehcache" />

    <defaultCache maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30"
        maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU" statistics="true">
        <persistence strategy="localTempSwap" />
    </defaultCache>

    <cache name="org.hibernate.cache.internal.StandardQueryCache"
        maxEntriesLocalHeap="5" eternal="false" timeToLiveSeconds="120">
        <persistence strategy="localTempSwap" />
    </cache>

    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
        maxEntriesLocalHeap="5000" eternal="true">
        <persistence strategy="localTempSwap" />
    </cache>
    <cache name="hibernate.Employee" maxElementsInMemory="100"
        eternal="false" timeToIdleSeconds="5" timeToLiveSeconds="200" />
</ehcache>

代码:

                        String wherestr = " FROM Employee ";
			List list = session.createQuery(wherestr).list();
			Iterator it=list.iterator();
			while(it.hasNext()) {
				Employee e1 = (Employee) it.next();
				System.out.println(e1.getId());
			}
			session2 = factory.openSession();
			List list2 = session2.createQuery(wherestr).list();
			Iterator it2=list.iterator();
			while(it2.hasNext()) {
				Employee e1 = (Employee) it2.next();
				System.out.println(e1.getId());
			}
			Session session3=factory.openSession();
			Employee e3 = (Employee)session3.load(Employee.class, "2383a369-a398-11e8-a100-00ff7734b451");
			System.out.println(e3.getId());
			session3.close();

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yiibai</groupId>
    <artifactId>HibernateQuickStart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>HibernateQuickStart</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Hibernate Core -->
        <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.2.Final</version>
        </dependency>


        <!-- MySQL JDBC driver -->
        <!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>

        <!-- SQLServer JDBC driver (JTDS) -->
        <!-- http://mvnrepository.com/artifact/net.sourceforge.jtds/jtds -->
        <dependency>
            <groupId>net.sourceforge.jtds</groupId>
            <artifactId>jtds</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies></project>

blob.png

继承映射:

package com.yiibai;public class Employee {
    private int id;
    private String name;

    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;
    }
}
package com.yiibai;public class Regular_Employee extends Employee {
    private float salary;
    private int bonus;

    public float getSalary() {
        return salary;
    }

    public void setSalary(float salary) {
        this.salary = salary;
    }

    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }}
package com.yiibai;public class Contract_Employee extends Employee {
    private float pay_per_hour;
    private String contract_duration;

    public float getPay_per_hour() {
        return pay_per_hour;
    }

    public void setPay_per_hour(float payPerHour) {
        pay_per_hour = payPerHour;
    }

    public String getContract_duration() {
        return contract_duration;
    }

    public void setContract_duration(String contractDuration) {
        contract_duration = contractDuration;
    }}

继承类的表的区别

1,

blob.png

<?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>
    <class name="com.yiibai.Employee" table="emp121"
        discriminator-value="emp">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <discriminator column="type" type="string"></discriminator>
        <property name="name"></property>

        <subclass name="com.yiibai.Regular_Employee"
            discriminator-value="reg_emp">
            <property name="salary"></property>
            <property name="bonus"></property>
        </subclass>

        <subclass name="com.yiibai.Contract_Employee"
            discriminator-value="con_emp">
            <property name="pay_per_hour"></property>
            <property name="contract_duration"></property>
        </subclass>
    </class></hibernate-mapping>
public class StoreData {
    public static void main(String[] args) {
        // Session session = new
        // AnnotationConfiguration().configure().buildSessionFactory().openSession();
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml").build();
        // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
        SessionFactory sessionFactory = new MetadataSources(registry)
                .buildMetadata().buildSessionFactory();

        /**** 上面是配置准备,下面开始我们的数据库操作 ******/
        Session session = sessionFactory.openSession();// 从会话工厂获取一个session
        Transaction t = session.beginTransaction();

        Employee e1 = new Employee();
        e1.setName("Yiibai");

        Regular_Employee e2 = new Regular_Employee();
        e2.setName("Max su");
        e2.setSalary(50000);
        e2.setBonus(5);

        Contract_Employee e3 = new Contract_Employee();
        e3.setName("Hippo su");
        e3.setPay_per_hour(1000);
        e3.setContract_duration("15 hours");

        session.persist(e1);
        session.persist(e2);
        session.persist(e3);

        t.commit();
        session.close();
        System.out.println("success");
    }}

2,分表

Employee类的表结构 -
CREATE TABLE `emp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;SQL

Regular_Employee类的表结构 -
CREATE TABLE `regemp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  `bonus` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;SQL

Contract_Employee类的表结构 -
CREATE TABLE `contemp122` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `pay_per_hour` float DEFAULT NULL,
  `contract_duration` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<?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>
    <class name="com.yiibai.Employee" table="emp122">
        <id name="id">
            <generator class="increment"></generator>
        </id>

        <property name="name"></property>

        <union-subclass name="com.yiibai.Regular_Employee"
            table="regemp122">
            <property name="salary"></property>
            <property name="bonus"></property>
        </union-subclass>

        <union-subclass name="com.yiibai.Contract_Employee"
            table="contemp122">
            <property name="pay_per_hour"></property>
            <property name="contract_duration"></property>
        </union-subclass>

    </class></hibernate-mapping>
        Employee e1 = new Employee();
        e1.setName("Yiibai");

        Regular_Employee e2 = new Regular_Employee();
        e2.setName("Max su");
        e2.setSalary(50000);
        e2.setBonus(5);

        Contract_Employee e3 = new Contract_Employee();
        e3.setName("Hippo su");
        e3.setPay_per_hour(1000);
        e3.setContract_duration("15 hours");

        session.persist(e1);
        session.persist(e2);
        session.persist(e3);

3,注释......

集合映射:

一对多,多对多

例如:list

package com.yiibai;  

import java.util.List;  

public class Question {  
    private int id;  
    private String qname;  
    private List<Answer> answers;  
    //getters and setters  

}
package com.yiibai;  public class Answer {  
    private int id;  
    private String answername;  
    private String postedBy;  
    //getters and setters  

    }  
}
    <class name="com.yiibai.Question" table="q501">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="qname"></property>

        <list name="answers" cascade="all">
            <key column="qid"></key>
            <index column="type"></index>
            <one-to-many class="com.yiibai.Answer" />
        </list>

    </class>

    <class name="com.yiibai.Answer" table="ans501">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="answername"></property>
        <property name="postedBy"></property>
    </class>

String

<class name="com.yiibai.Question" table="q100">  
       ...        
          <list name="answers" table="ans100">  
          <key column="qid"></key>  
          <index column="type"></index>  
          <element column="answer" type="string"></element>  
          </list>  
       ...  
</class>

插入

        Answer ans1 = new Answer();
        ans1.setAnswername("java is a programming language");
        ans1.setPostedBy("Ravi Su");

        Answer ans2 = new Answer();
        ans2.setAnswername("java is a platform");
        ans2.setPostedBy("Sudhir Wong");

        Answer ans3 = new Answer();
        ans3.setAnswername("Servlet is an Interface");
        ans3.setPostedBy("Jai Li");

        Answer ans4 = new Answer();
        ans4.setAnswername("Servlet is an API");
        ans4.setPostedBy("Arun");

        ArrayList<Answer> list1 = new ArrayList<Answer>();
        list1.add(ans1);
        list1.add(ans2);

        ArrayList<Answer> list2 = new ArrayList<Answer>();
        list2.add(ans3);
        list2.add(ans4);

        Question question1 = new Question();
        question1.setQname("What is Java?");
        question1.setAnswers(list1);

        Question question2 = new Question();
        question2.setQname("What is Servlet?");
        question2.setAnswers(list2);

        session.persist(question1);
        session.persist(question2);

查询

    Query query=session.createQuery("from Question");  
    List<Question> list=query.list();  

    Iterator<Question> itr=list.iterator();  
    while(itr.hasNext()){  
        Question q=itr.next();  
        System.out.println("Question Name: "+q.getQname());  

        //printing answers  
        List<Answer> list2=q.getAnswers();  
        Iterator<Answer> itr2=list2.iterator();  
        while(itr2.hasNext()){  
            System.out.println(itr2.next());  
        }  

    }

例如:bag包内

        <bag name="answers" cascade="all">
            <key column="type"></key>
            <one-to-many class="com.yiibai.Answer" />
        </bag>

例如:set

        <set name="answers" table="ans102">
            <key column="qid"></key>
            <element column="answer" type="string"></element>
        </set>
        <set name="answers" table="a1002"
            inverse="true" lazy="true" fetch="select">
        <key>
            <column name="qid" not-null="true" />
        </key>
            <one-to-many class="com.yiibai.Answer" />
        </set>

反其道而行

<?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>
    <class name="com.yiibai.Answer" table="a1002">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="answername"></property>
        <property name="postedBy"></property>
        <many-to-one name="question" class="com.yiibai.Question" fetch="select">
            <column name="qid" not-null="true" />
        </many-to-one>
    </class></hibernate-mapping>

例如:map

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

    <class name="com.yiibai.Question" table="question_736">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>
        <property name="username"></property>

        <map name="answers" table="answer736" cascade="all">
            <key column="questionid"></key>
            <index column="answer" type="string"></index>
            <element column="username" type="string"></element>
        </map>
    </class></hibernate-mapping>

多对多  

<hibernate-mapping>
    <class name="com.yiibai.Question" table="question_m2m">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>

        <map name="answers" table="answer_m2m" cascade="all">
            <key column="questionid"></key>
            <index column="answer" type="string"></index>
            <many-to-many class="com.yiibai.User" column="userid"></many-to-many>
        </map>
    </class></hibernate-mapping>

例如:表结构

blob.png

高级部分:

组件映射:

例如:

public class Employee {
    private int id;
    private String name;
    private Address address;
<hibernate-mapping>

    <class name="com.yiibai.Employee" table="emp_cpmap">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="name"></property>

        <component name="address" class="com.yiibai.Address">
            <property name="city"></property>
            <property name="country"></property>
            <property name="pincode"></property>
        </component>

    </class></hibernate-mapping>

多对一

例如:

public class Employee {
    private int employeeId;
    private String name, email;

    private Address address;
public class Address {
    private int addressId;
    private String addressLine1, city, state, country;
    private int pincode;
    private Employee employee;
<hibernate-mapping>
    <class name="com.yiibai.Employee" table="emp_2110">
        <id name="employeeId">
            <generator class="increment"></generator>
        </id>
        <property name="name"></property>
        <property name="email"></property>

        <many-to-one name="address" unique="true" cascade="all"></many-to-one>
    </class>

</hibernate-mapping>

一对一

例如:

public class Employee {
    private int employeeId;
    private String name, email;
    private Address address;
public class Address {
    private int addressId;
    private String addressLine1, city, state, country;
    private int pincode;
    private Employee employee;
<hibernate-mapping>
    <class name="com.yiibai.Employee" table="emp_2120">
        <id name="employeeId">
            <generator class="increment"></generator>
        </id>
        <property name="name"></property>
        <property name="email"></property>

        <one-to-one name="address" cascade="all"></one-to-one>
    </class></hibernate-mapping>

事务管理

例如:

Transaction接口的方法如下:

  1. void begin() 开始一个新的事务。

  2. void commit() 结束工作单位,在FlushMode.NEVER中除外。

  3. void rollback() 强制此事务回滚。

  4. void setTimeout(int seconds) 它为由此实例开始的后续调用启动的任何事务设置事务超时。

  5. boolean isAlive() 检查交易是否仍然存在。

  6. void registerSynchronization(Synchronization s) 为此事务注册用户同步回调。

  7. boolean wasCommited() 检查事务是否成功提交。

  8. boolean wasRolledBack() 检查事务是否成功回滚。

查询

例如:

HQL获取所有记录的示例

Query query=session.createQuery("from Emp");
//here persistent class name is Emp  
List list=query.list();Java

HQL获取分页记录的示例

Query query=session.createQuery("from Emp");  
query.setFirstResult(5);  
query.setMaxResult(10);  
List list=query.list();
//will return the records from 5 to 10th numberJava

HQL更新查询示例

Transaction tx=session.beginTransaction();  
Query q=session.createQuery("update User set name=:n where id=:i");  
q.setParameter("n","Udit Kumar");  
q.setParameter("i",111);  
int status=q.executeUpdate();  
System.out.println(status);  
tx.commit();

HQL删除查询示例

Query query=session.createQuery("delete from Emp where id=100");  
//specifying class name (Emp) not tablename  
query.executeUpdate();

HQL与聚合函数

可以通过HQL调用avg()min()max()等聚合函数。 我们来看一些常见的例子:

获得所有员工总薪酬的例子

Query q=session.createQuery("select sum(salary) from Emp");  
List<Integer> list=q.list();  
System.out.println(list.get(0));Java

获得员工最高工资的例子

Query q=session.createQuery("select max(salary) from Emp");

获得员工最低工资的例子

Query q=session.createQuery("select min(salary) from Emp");

计算雇员ID总数的示例

Query q=session.createQuery("select count(id) from Emp");

获得员工的平均工资的例子

Query q=session.createQuery("select avg(salary) from Emp");

猜你喜欢

转载自blog.csdn.net/caokangnsd/article/details/81842848