zoukankan      html  css  js  c++  java
  • 初学hibernate框架

      今天初次学习了hibernate,学习了hibernate的一些原理性知识。hibernate是基于ORM的持久层框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。ORM(Object Relation Map)即对象关系映射,其映射方式有两种:①注解映射,②xml配置文件映射,其中第一种方式比较简单,但是耦合对要高,第二种方式虽然要复杂一点但是耦合度相对低了很多,因为我们开发系统都追求高内聚、低耦合,所以第二种方式较常用。

      使用hibernate要做到“三拷三配、六个准备,七个步骤”,这是口诀。

      三拷三配、六个准备:三拷是指拷JDBC驱动包、hibernate开发包、log4j包,三配是指配置pojo类、配置类与数据库表之间的映射、配置总配置文件(用于数据库连接的)。

      首先讲三拷三配、六个准备,拷JDBC驱动包不用多讲,因为hibernate也是基于JDBC的,只是对其进行了封装,所以JDBC驱动包必不可少。既然是使用hibernate,那hibernate开发包也必不可少,用来提供各种类的。log4j包用来记录日志信息的,这个也是非常有用的,因为以后做的系统都要发布到服务器上面去的,你不可能每时每刻都守在服务器旁边看有没有出问题,有了日志就可以省很多事了。只要定期去查看日志文件就好了,所有问题都会记录在日志文件中。                  三配中配置pojo也不用多讲,跟以前差不多,一个表对应一个pojo类就ok了。因为hibernate是基于对象关系映射的框架,所以pojo类对象与关系表的映射配置必不可少,需要配置三个东西:表和类的映射、属性和字段的映射、表和表的关系(如果两个表有主外键关系的话,这里只有一个表所以不用配置),配置代码如下:

    pojo中Student类

     1 package com.pojo;
     2 
     3 import java.io.Serializable;
     4 import java.util.Date;
     5 
     6 public class Student implements Serializable {
     7     private int sid;
     8     private String sname;
     9     private Date sage;
    10     public int getSid() {
    11         return sid;
    12     }
    13     public void setSid(int sid) {
    14         this.sid = sid;
    15     }
    16     public String getSname() {
    17         return sname;
    18     }
    19     public void setSname(String sname) {
    20         this.sname = sname;
    21     }
    22     public Date getSage() {
    23         return sage;
    24     }
    25     public void setSage(Date sage) {
    26         this.sage = sage;
    27     }
    28     
    29 }

    Student类与student表的映射student.hbm.xml代码:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 
     5 
     6 <hibernate-mapping>
     7     <!-- 表与类的映射 -->
     8     <class name="com.pojo.Student" table="student">
     9         <!-- 字段与属性映射之主键映射 -->
    10         <id name="sid" column="sid">
    11             <generator class="native"></generator>
    12         </id>
    13         <!-- 字段与属性映射 -->
    14         <property name="sname" column="sname"></property>
    15         <property name="sage" column="sage"></property>
    16     </class>
    17 </hibernate-mapping>

    最后是总配置文件hibernate.cfg.xml的配置(有可视化界面操作的),该配置是用于建立数据库连接的,其代码如下:

     1 <?xml version='1.0' encoding='UTF-8'?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     5 
     6 <hibernate-configuration>
     7 <session-factory>
     8     <property name="myeclipse.connection.profile">Mysql</property>
     9     <property name="connection.url">
    10         jdbc:mysql://127.0.0.1:3306/test
    11     </property>
    12     <property name="connection.username">root</property>
    13     <property name="connection.password">admin</property>
    14     <property name="connection.driver_class">
    15         com.mysql.jdbc.Driver
    16     </property>
    17     <property name="dialect">
    18         org.hibernate.dialect.MySQLDialect
    19     </property>
    20     <property name="show_sql">true</property>
    21     <mapping resource="com/pojo/student.hbm.xml" />
    22 </session-factory>
    23 </hibernate-configuration>

    到此为止准备工作已经完成了,接下来就是操纵数据库了。操作数据库有七个步骤:

      ①读取配置文件

      ②创建session工厂

      ③打开session

      ④开始事务:hibernate中增删改一定要用事务,查询可以不用

      ⑤处理事务,对数据表的增(save)、删(delete)、改(update)

      ⑥提交事务或者回滚事务

      ⑦关闭session。

    下面是对表student插入数据的一个例子:

     1 package com.test;
     2 
     3 
     4 
     5 import java.sql.Date;
     6 
     7 import org.hibernate.Session;
     8 import org.hibernate.SessionFactory;
     9 import org.hibernate.Transaction;
    10 import org.hibernate.cfg.Configuration;
    11 
    12 import com.pojo.Student;
    13 
    14 public class 插入数据 {
    15 
    16     /**
    17      * @param args
    18      */
    19     public static void main(String[] args) {
    20         //1.读取配置文件
    21         Configuration cfg = new Configuration().configure();
    22         
    23         //2.创建session工厂
    24         SessionFactory  factory = cfg.buildSessionFactory();
    25         
    26         //3.打开session
    27         Session session = factory.openSession();
    28         
    29         //4.新建事务:hibernate中增删改一定要用事务,查询可以不用
    30         Transaction tr = session.beginTransaction();
    31         
    32         try {
    33             //5.处理事务
    34             Student s = new Student();
    35             s.setSname("xinxin");
    36             s.setSage(Date.valueOf("1992-10-09"));
    37             session.save(s);
    38             //6.提交事务
    39             tr.commit();
    40         } catch (Exception e) {
    41             //6.出现问题,事务回滚
    42             tr.rollback();
    43         }
    44         //7.关闭会话
    45         session.close();
    46     }
    47 
    48 }

    下面是对查询表student的例子:

     1 package com.test;
     2 
     3 import java.util.List;
     4 
     5 import org.hibernate.Query;
     6 import org.hibernate.Session;
     7 import org.hibernate.SessionFactory;
     8 import org.hibernate.cfg.Configuration;
     9 
    10 import com.pojo.Student;
    11 
    12 public class 查询所有 {
    13 
    14     /**
    15      * @param args
    16      */
    17     public static void main(String[] args) {
    18         //读取配置文件
    19         Configuration cfg = new Configuration().configure();
    20         //创建session工厂
    21         SessionFactory factory = cfg.buildSessionFactory();
    22         //打开session
    23         Session session = factory.openSession();
    24         //批量查询用HQL(表名改类名,字段名改属性名)
    25         Query query = session.createQuery("from Student where sid=?");
    26         //这里给问号赋值时是从0开始的
    27         query.setInteger(0, 2);
    28         List<Student> list = query.list();
    29         for (Student student : list) {
    30             System.out.println(student.getSname());
    31         }
    32         session.close();
    33     }
    34 
    35 }

    查询数据如果是根据主键查找一条记录的时候可以用session的get()方法,查询多条记录则必须用HQL(Hibernate Query Language),HQL和SQL语句差不多,只是将表明改为类名、将字段名改为属性名。

      

  • 相关阅读:
    Java线程--LockSupport使用
    Java线程--Callable使用
    Java线程--BlockingQueue使用
    Java线程--CopyOnWrite容器使用
    Java线程--ReentrantLock使用
    Java线程--Atomic原子类使用
    Java线程--ThreadPoolExecutor使用
    Java线程--ForkJoinPool使用
    自己动手搭建SSM
    为什么选择SSM+Redis框架开发模式?
  • 原文地址:https://www.cnblogs.com/liuling/p/dffddsf.html
Copyright © 2011-2022 走看看