Hibernate的基础入门--笔记(一)

1、三层架构是什么?
  web层 表现层
  MVC是表现层的一个设计模型。
  service层 业务层
  dao层 持久层
  明确:
    Hibernate它是一个持久层(DAO层)框架

2、操作数据库的方式

  JDBC:痛苦

 1 //保存一个学生
 2     Student s = new Student();
 3     String sql = "insert into student(name,gender)values(?,?)";
 4     Connection conn = getConnection();
 5     PreparedStatement pstm = conn.prepareStatement(sql);
 6     pstm.setString(1,s.getName());
 7     pstm.setString(2,s.getGender());
 8     pstm.executeUpdate();
 9 //查询学生信息
10     String sql = "select * from student";
11     Connection conn = getConnection();
12     PreparedStatement pstm = conn.prepareStatement(sql);
13     ResultSet rs = pstm.executeQuery();
14     List<Student> students = new ArrayList<Student>();
15     while(rs.next()){
16         Student s = new Student();
17         int id = rs.getInt("id");
18         s.setId(id);
19         s.setName(rs.getString("name"));
20         s.setGender(rs.getString("gender"));
21         students.add(s);
22     }

DBUtils:麻烦

 1 //保存一个学生
 2     Student s = new Student();
 3     QueryRunner qr = new QueryRunner(dataSource);
 4     String sql = "insert into student(name,gender)values(?,?)";
 5     qr.update(sql,s.getName(),s.getGender());
 6 //查询学生
 7     QueryRunner qr = new QueryRunner(dataSource);
 8     String sql = "select * from student";
 9     List list = qr.query(sql,new BeanListHandler<Student>(Student.class));
10 
11 table:
12   create table student(
13     s_id int primary key auto_increment,
14     s_name varchar(200),
15     s_gender varchar(10)
16   );
17 Class
18    public class Student implements Serializable{
19     private int id;
20     private String name;
21     private String gender;
22 
23     //getter and setter
24    }

3、你想怎么操作数据库?
  想:
    session.save(s);==========>存到数据库表里 解析XML文件,生成SQL语句,发送到数据库。数据库只认识SQL。
    session.get(id);==========>从数据库表中查询
    query.list();
4、建立表和实体类之间的对应关系
  如何建立?
    通过配置文件
  你会的配置文件
    xml
    properties
  选择XML
    因为它可以描述层级关系
  配置文件的内容:
    实体类和表的对应关系
    实体类中属性和表中字段的对应关系
5、ORM
  Object Relational Mapping
  对象   关系     映射
  它就是通过配置文件建立起来实体和表之间的对应关系,从而可以操作实体就直接操作了数据库表
6、Hibernate
  它是一个开源的,轻量级企业级ORM框架。
  解决的是持久层的完整操作。

7、搭建hibernate的开发环境
  使用的示例:
    CRM:客户关系管理系统
  Hibernate的开发包:
    documentation
    jar包
    project
  步骤:
    a、导入必备的13个jar包
    required:9个
    log4j相关:3个
    数据库驱动:1个
  b、创建映射配置文件
    在实体类所在的包下创建一个xml文件
    命名规则:实体类名称.hbm.xml

    示例:

/**
 * 客户的实体类
 *
 */
public class Customer implements Serializable {

    private Long custId;
    private String custName;
    private String custSource;
    private String custIndustry;
    private String custLevel;
    private String custAddress;
    private String custPhone;
    
    
    public Long getCustId() {
        return custId;
    }
    public void setCustId(Long custId) {
        this.custId = custId;
    }
    public String getCustName() {
        return custName;
    }
    public void setCustName(String custName) {
        this.custName = custName;
    }
    public String getCustSource() {
        return custSource;
    }
    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }
    public String getCustIndustry() {
        return custIndustry;
    }
    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }
    public String getCustLevel() {
        return custLevel;
    }
    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }
    public String getCustAddress() {
        return custAddress;
    }
    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }
    public String getCustPhone() {
        return custPhone;
    }
    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }
    @Override
    public String toString() {
        return "Customer [custId=" + custId + ", custName=" + custName + ", custSource=" + custSource
                + ", custIndustry=" + custIndustry + ", custLevel=" + custLevel + ", custAddress=" + custAddress
                + ", custPhone=" + custPhone + "]";
    }

}
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- 导入约束(dtd约束) 
 3 在hibernate的核心jar包中:hibernate-mapping-3.0.dtd中
 4 明确:
 5     此配置文件中只包含:实体类和表的对应关系,已经实体类中属性和表中字段的对应关系
 6 -->
 7 <!DOCTYPE hibernate-mapping PUBLIC 
 8     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 9     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
10 <hibernate-mapping package="com.XXX.domain"><!-- hibernate-mapping中的package属性:用于导入包。之后再出现类是此包中的都可以省略 -->
11     <!-- class标签:
12             作用:用于建立实体类和表的对应关系
13             属性:
14               name:实体类的名称。如果在根标签上没有导包,此处需要写全限定类名
15               table:指定数据库表的名称
16     -->
17     <class name="Customer" table="cst_customer">
18         <!-- id标签:
19                 作用:用于映射主键字段
20                 属性:
21                   name:指定的是实体类中属性的名称。找的是get/set方法后面的部分,首字母转小写。
22                   column:指定的是数据库表的列名
23         -->
24         <id name="custId" column="cust_id">
25             <!-- genrator标签:
26                     作用:配置主键生成策略。
27                     属性:
28                       class:指定策略的取值
29                       取值之一:
30                           native:使用本地数据库自动增长的能力
31             -->
32             <generator class="native"></generator>
33         </id>
34         <!-- property标签:
35                 作用:映射其他字段
36                 属性:
37                   name:用于指定实体类中属性的名称.找的也是get/set方法后面的部分,首字母转小写。
38                   column:用于指定表中列的名称
39         -->
40         <property name="custName" column="cust_name"></property>
41         <property name="custIndustry" column="cust_industry"></property>
42         <property name="custSource" column="cust_source"></property>
43         <property name="custLevel" column="cust_level"></property>
44         <property name="custAddress" column="cust_address"></property>
45         <property name="custPhone" column="cust_phone"></property>
46     </class>
47 </hibernate-mapping>

  c、编写主配置文件
    在类的根路径下创建一个xml文件
    命名规则:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入dtd约束:
约束位置:hibernate-configuration-3.0.dtd中
-->
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!-- 配置session工厂 
            SessionFactory:生产Session
            Session是干嘛的:
                它就是hibernate中操作数据库的核心对象了。
        创建Session工厂必备的3组信息
            1、连接数据库的信息
            2、hibernate相关的配置
            3、指定映射文件所在位置
    -->
    <session-factory>
        <!-- 1、连接数据库的信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <!-- 2、hibernate的基本配置 -->
        <!-- 数据库的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 是否显示sql语句在控制台 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 是否格式化sql语句 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 生成DDL语句的策略 
            SQL结构化查询语言:一共有6个部分
            DDL:数据定义语言 Date Definition Language
            DML:数据操作语言 Data Manipulation Language
            DQL:数据查询语言 Data Query Language
            DCL:数据控制语言  Data Control Language 
            CCL:指针控制语言  Cursor Control Language
            TPL:事务处理语言  Transaction Processing Language
            
            
            取值update的含义:
                检查表结构和映射配置文件的变化,如果不一致,更新表结构
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 3、映射文件的位置 -->    
        <mapping resource="com/XXX/domain/Customer.hbm.xml"/>    
    </session-factory>
</hibernate-configuration>

8、入门案例
  需求:保存一个客户到数据库中

 1 /**
 2  * 入门案例:
 3  *     保存客户
 4  * @author zhy
 5  *
 6  */
 7 public class HibernateDemo1 {
 8     
 9     /**
10      * 步骤分析:
11      *  1、加载主配置文件
12      *  2、根据主配置文件构建SessionFactory
13      *  3、使用工厂生产一个新的Session对象
14      *  4、开启事务
15      *  5、执行保存操作
16      *  6、提交事务
17      *  7、释放资源
18      */
19     @Test
20     public void testAdd(){
21         Customer c = new Customer();
22         c.setCustName("中关村");
23         c.setCustIndustry("xxx");
24         c.setCustSource("网络");
25         c.setCustLevel("VIP客户");
26         c.setCustAddress("北京");
27         c.setCustPhone("010-98234832");
28         
29         //1.加载主配置文件
30         Configuration cfg = new Configuration();
31         cfg.configure();
32         //2.根据主配置文件构建SessionFactory
33         SessionFactory factory = cfg.buildSessionFactory();
34         //3.使用工厂生产一个新的Session
35         Session session = factory.openSession();//注意:openSession()永远都是一个新的
36         //4.使用session获取事务对象,开启事务
37         Transaction tx = session.beginTransaction();
38         //5.执行保存操作
39         session.save(c);//=========>解析xml,生产sql语句,发送给数据库,执行保存。
40         //6.提交事务
41         tx.commit();
42         //7.释放资源
43         session.close();
44         factory.close();
45     }
46 }

9、常用对象详解

 1     /**
 2      * Configuration:                                  **使用
 3      *         作用:就是用于加载主配置文件的。
 4      *         常用方法:
 5      *             默认构造函数:它只能加载类的根路径下,名称为hibernate.properties的配置文件。不能加载xml
 6      *             configure():它用于加载类的根路径下,名称为hibernate.cfg.xml的配置文件。
 7      *             buildSessionFactory():根据配置文件,构建SessionFactory
 8      *             addResource(String url);指定映射文件的位置
 9      *             addClass(Class clazz);指定实体类的字节码
10      * 
11      * SessionFactory                                   ****重要
12      *         作用:就是用于创建Session的
13      *         常用方法:
14      *             openSession():每次都是生成一个新的Session
15      *         细节:
16      *             它维护了很多信息:
17      *                 连接数据库的信息
18      *                 hibernate的基本配置
19      *                 映射文件的位置,以及映射文件中的配置
20      *                 一些预定义的SQL语句(这些语句都是通用的) 比如:全字段保存,根据id的全字段更新,根据id的全字段查询,根据id的删除等等。
21      *                 hibernate的二级缓存(了解)
22      *            特性:
23      *                它是一个线程安全的对象,所有由该工厂生产的Session都共享工厂中维护的数据。
24      *        SessionFactory的使用原则:
25      *            由于它维护了很多信息,所以创建和销毁会消耗很多资源,所以不应该反复的创建和销毁。
26      *            原则就是:一个应用应该只有一个SessionFactory。在应用加载时创建,应用卸载时销毁。
27      *    
28      * Session                                    非常重要
29      *         作用:就是用于跟数据库交互。包含了增删改查以及获取事务对象。
30      *         常用方法:
31      *             save(Object entity);  :保存一个实体到数据库
32      *             update(Object entity);:更新一个实体
33      *             delete(Object entity);:删除一个实体
34      *             get(Class clazz,Serializable id);:根据id查询一个实体。参数的含义:Class表示要查询的实体类字节码。Serializable就是查询的条件。
35      *             beginTransaction();:开启事务,并返回事务对象
36      *             createQuery(String hql);:获取一个查询对象,用于查询所有。
37      *                     HQL:hibernate  query language
38      *                     含义:hibernate的查询语句。和SQL的区别:把数据表名称用实体类名称替换,把数据库表中的列用实体类中的属性替换,所写的SQL语句就是HQL。
39      *         细节:
40      *             由于SessionFactory已经维护了很多数据,所以Session就维护较少的内容。
41      *             它是一个轻量级对象。并且:它不是线程安全的!!!!!!!
42      *             它维护了hibernate的一级缓存(关于一级缓存的问题都是明天的内容)。
43      *             它的反复创建销毁不会消耗太多资源。
44      *         使用原则:
45      *             每个线程都只有一个Session对象。
46      * 
47      * Transaction                        了解
48      *         作用:就是用于控制事务的
49      *         常用方法:
50      *             commit():提交事务
51      *             rollback():回滚事务
52      */

10、抽取Hibernate工具类
  HibernateUtil.java
  明确:
    hibernate把所有可以预见的异常都转成了运行时异常

 1 /**
 2  * hibernate的工具类
 3  *
 4  */
 5 public class HibernateUtil {
 6     
 7     private static SessionFactory factory;    
 8     //使用静态代码块
 9     //hibernate把所有可以预见的异常都转成了运行时异常
10     static{
11         try {
12             //读取配置文件
13             Configuration cfg = new Configuration();
14             cfg.configure();
15             factory = cfg.buildSessionFactory();
16         } catch (Exception e) {
17             throw new ExceptionInInitializerError("初始化Session工厂失败!");
18         }
19     }
20     
21     /**
22      * 获取一个新的Session
23      * @return
24      */
25     public static Session openSession(){
26         return factory.openSession();
27     }
28     
29 }

  编码模板

 1 /**
 2  * 测试工具类
 3  * @author zhy
 4  *
 5  */
 6 public class HibernateDemo3 {
 7     
 8     /**
 9      * 使用hibernate工具类
10      */
11     @Test
12     public void testAdd(){
13         Customer c = new Customer();
14         c.setCustName("TBD");
15         c.setCustIndustry("办公");
16         c.setCustSource("网络");
17         c.setCustLevel("VIP客户");
18         c.setCustAddress("昌平区");
19         c.setCustPhone("010-98234832");
20         
21 
22         //1.使用工具类获取一个Session
23         Session session = HibernateUtil.openSession();
24         //2.使用session获取事务对象,开启事务
25         Transaction tx = session.beginTransaction();
26         //3.执行保存操作
27         session.save(c);
28         //4.提交事务
29         tx.commit();
30         //5.释放资源
31         session.close();
32     }
33     
34     
35     /**
36      * hibernate的编码模板
37      */
38     @Test
39     public void testAdd2(){
40         Customer c = new Customer();
41         c.setCustName("TBD");
42         c.setCustIndustry("办公");
43         c.setCustSource("网络");
44         c.setCustLevel("VIP客户");
45         c.setCustAddress("昌平区");
46         c.setCustPhone("010-98234832");
47         
48         Session session = null;
49         Transaction tx = null;
50         try{
51             //1.使用工具类获取一个Session
52             session = HibernateUtil.openSession();
53             //2.使用session获取事务对象,开启事务
54             tx = session.beginTransaction();
55             //3.执行保存操作
56             session.save(c);
57             //4.提交事务
58             tx.commit();
59         }catch(Exception e){
60             //5.回滚事务
61             tx.rollback();
62             e.printStackTrace();
63         }finally{
64             //6.释放资源
65             session.close();
66         }
67     }
68     
69     
70 }

11、hibernate的CRUD操作
  HibernateDemo4.java

  1 /**
  2  * Hibernate的CRUD操作
  3  *
  4  */
  5 public class HibernateDemo4 {
  6     
  7     /**
  8      * 保存
  9      */
 10     @Test
 11     public void testAdd(){
 12         Customer c = new Customer();
 13         c.setCustName("天安门");
 14         c.setCustIndustry("景点");
 15         c.setCustSource("网络");
 16         c.setCustLevel("VIP客户");
 17         c.setCustAddress("长安街");
 18         c.setCustPhone("010-98234832");
 19         
 20 
 21         //1.使用工具类获取一个Session
 22         Session session = HibernateUtil.openSession();
 23         //2.使用session获取事务对象,开启事务
 24         Transaction tx = session.beginTransaction();
 25         //3.执行保存操作
 26         session.save(c);
 27         //4.提交事务
 28         tx.commit();
 29         //5.释放资源
 30         session.close();
 31     }
 32 
 33     /**
 34      * 根据id查询一个实体
 35      */
 36     @Test
 37     public void testFindById(){
 38         //1.使用工具类获取一个Session
 39         Session session = HibernateUtil.openSession();
 40         //2.使用session获取事务对象,开启事务
 41         Transaction tx = session.beginTransaction();
 42         //3.执行根据id查询
 43         Customer c = session.get(Customer.class, 1L);
 44         System.out.println(c);
 45         //4.提交事务
 46         tx.commit();
 47         //5.释放资源
 48         session.close();
 49     }
 50     
 51     /**
 52      * 更新
 53      */
 54     @Test
 55     public void testUpdate(){
 56         //1.使用工具类获取一个Session
 57         Session session = HibernateUtil.openSession();
 58         //2.使用session获取事务对象,开启事务
 59         Transaction tx = session.beginTransaction();
 60         //3.执行根据id查询
 61         Customer c = session.get(Customer.class, 1L);
 62         c.setCustName("Java");
 63         session.update(c);
 64         //4.提交事务
 65         tx.commit();
 66         //5.释放资源
 67         session.close();
 68     }
 69     
 70     /**
 71      * 删除
 72      */
 73     @Test
 74     public void testDelete(){
 75         //1.使用工具类获取一个Session
 76         Session session = HibernateUtil.openSession();
 77         //2.使用session获取事务对象,开启事务
 78         Transaction tx = session.beginTransaction();
 79         //3.执行根据id查询
 80         Customer c = session.get(Customer.class, 1L);
 81         
 82         session.delete(c);
 83         //4.提交事务
 84         tx.commit();
 85         //5.释放资源
 86         session.close();
 87     }
 88 
 89     /**
 90      * 查询所有
 91      */
 92     @Test
 93     public void testFindAll(){
 94         //1.使用工具类获取一个Session
 95         Session session = HibernateUtil.openSession();
 96         //2.使用session获取事务对象,开启事务
 97         Transaction tx = session.beginTransaction();
 98         //3.获取Query对象
 99         Query query = session.createQuery("from Customer");//参数是一个HQL语句。hibernate query language
100         List list = query.list();
101         for(Object o : list){
102             System.out.println(o);
103         }
104         //4.提交事务
105         tx.commit();
106         //5.释放资源
107         session.close();
108     }
109 }

 

持久层总图:

 

导入DTD:

 

posted @ 2017-05-31 14:47  细节造就完美  阅读(53)  评论(0)    收藏  举报