zoukankan      html  css  js  c++  java
  • Hibernate基础一

    前面已经学习了Struts2的基础知识,可以自己搭建一个简单的Struts2项目!现在开始Hibernate!从基础开始!

    1.web内容回顾

    • JavaEE三层结构(后面要看下,三层架构是怎么区分的???)
    1. web层:struts2框架
    2. service层:spring框架
    3. dao层:hibernate框架,对数据库进行CRUD操作
    • MVC思想

    2.Hibernate概述

        什么是Hibernate框架

        应用在javaee三层结构中的dao层框架,开源轻量级(不依赖其他东西)。
        在dao层里面做数据库的crud操作,底层代码就是jdbc,对jdbc进行了封装。不需要写复杂的jdbc代码和sql语句。   

        什么是orm思想

        object relational mapping,对象关系映射
        实体类和数据表一一对应,实体类属性和数据表字段一一映射
        不需要操作数据库,而操作表对应的实体类对象

    轻量级JavaEE应用的持久层框架,是一个完全的ORM框架。(说完这句话,肯定有很多人懵圈了,下面我来一个个解释)可能只有真正看到好处后才发现。

    持久化:将我们想要保存的数据保存到硬盘上,也就是我们电脑的磁盘上。为什么叫持久化呢?就是数据能够保存的很久,所以叫持久化。现在对持久化的实现过程大多通过各种关系型数据库完成。所以我们常说的,将数据保存到数据库中,其实是数据库帮我们把数据保存到硬盘中了。

    持久层:既然知道了什么是持久化,那么持久化层也就应该有思路了。这里把数据库看成是内存的一部分,我们就当做将数据保存到数据库中,就相当于保存到硬盘中一样。所以在操作数据库的或者跟数据库打交道的那一层就是持久层,比如我们之前知道了三层架构,不就有专门跟数据库打交道的一层叫做持久化层吗?

    ORM:Object Relational Mapping 对象关系映射,这个是一个思想,模型或者说是规范。关系数据库中的记录 映射 成为程序语言中的对象实例,然后通过操作对象,来达到操作数据库的这样一种思想。如果没有ORM思想,我们之前就是直接操作数据库中的记录字段,来达到存储数据的目的。

    持久化类:通过上面解释的,持久化类就是可以将类保存到数据库中,并还可以从数据库中拿到该类,这就叫持久化类。也就是下面说到的POJO类。

    POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

    使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,

    持久化对象:持久化类的实例对象,能保存到数据库中,也能从数据库中取出来。

    JPA的概念:Java Persistence API java持久化API,也就是java持久化的规范,ORM就是这JPA中所定义的,它还规定了其它很多规范,JPA维护一个Persistence Context(持久化上下文),这就是这个持久化上下文来事。那些ORM框架都要依据JPA规范来设计,那么各个ORM框架也就度有这么个持久化上下文。持久化上下文大体内容:1、ORM元数据,JPA支持annotion(注解)或xml两种形式描述对象/关系映射 2、实体操作API,实现对实体对象的CRUD操作    3、查询语言,约定了面向对象的查询语言JPQL(javaPersistence Query Language)

    知道了一些大概的名词解释,现在来看看hibernate在一个工程中到底处于一个什么样的地位

    简要体系架构结构

    简要的hibernate体系架构就如上图所示,就如我们说的那样,hibernate在Application和Database之间,所以我们使用hibernate来实现对Database的操作。

    我们配置xxx.hbm.xml:目的就是为了hibernate与我们的application相关联

    我们配置hibernate.cfg.xml:与数据库相关的服务,例如:用户名和密码等。还有自身hibernate的服务。

    Hibernate全面解决方案体系架构

    二、hibernate有什么作用?

    前面知道了什么事hibernate,其实也就是知道hibernate的一些特性,很虚的东西,但是我们用它到底来做什么呢?

        1、通过hibernate,完成POJO类到数据库表的映射关系

        2、通过hibernate,只需要操作对象,hibernate就帮我们生成数据库语句去操作数据库,我们不必管下面的语句是怎么样的。

        3、大概就是上面说的这两个,就是让用户来对对象的增加、删除、修改操作,来达到对数据库表中数据的这种增删改的操作

     说白了,原来操作数据库我们要使用mysql语句去操作数据库,有了hibernate,我们可以直接操作与数据库映射的对象。直接操作对象就是操作数据库。

    三、使用hibernate需要导的jar包和jar包的意思?

    虽然不知道jar包的里面怎么实现的,但是还是有那个好奇心,必须知道这个jar包是干什么的,不然就像个傻子一样就知道复制黏贴,我相信,学完这个hibernate,我就会知道jar包里面都有什么的。

     通过xxx.hbm.xml配置文件来反应pojo类和数据库表的映射关系。(这个和我本地用的不一样,后面细说)

    四、如何实现POJO类到数据库表的映射关系,xxx.hbm.xml配置文件发威了

     创建对象-关系映射文件该文件应该和实体类在同一目录下。命名规则为 实体类名.hbm.xml。因为有这个配置文件,pojo类具有操作的能力了。

    下面给出我们的例子:

    我们的POJO类User.java

     1 package bean;
     2 
     3 public class User {
     4     private int id;
     5     private String name;
     6     private String password;
     7     /**
     8      * @return the id
     9      */
    10     public int getId() {
    11         return id;
    12     }
    13     /**
    14      * @param id the id to set
    15      */
    16     public void setId(int id) {
    17         this.id = id;
    18     }
    19     /**
    20      * @return the name
    21      */
    22     public String getName() {
    23         return name;
    24     }
    25     /**
    26      * @param name the name to set
    27      */
    28     public void setName(String name) {
    29         this.name = name;
    30     }
    31     /**
    32      * @return the password
    33      */
    34     public String getPassword() {
    35         return password;
    36     }
    37     /**
    38      * @param password the password to set
    39      */
    40     public void setPassword(String password) {
    41         this.password = password;
    42     }    
    43 
    44 }

    我们 新建的数据库是hibernate,数据表是user如下:

    然后看POJO类的映射配置:User.hbm.xml, 和我们的 POJO类在同路径下。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping><!-- //根元素 -->
     6     <!-- 指定实体类和对应的数据表 -->
     7     <class name="bean.User" table = "user">
     8         <!-- <id>元素设定类中的id和表的主键id的映射 -->
     9         <!-- name是POJO类中属性的名字,column是数据表中列的名字 -->
    10         <id name="id" column = "id">
    11             <!-- 下面这行是主键生成策略问题 -->
    12             <generator class="native"></generator>        
    13         </id>
    14         <!-- name是实体类属性的名字,column是数据表中列的名字 -->
    15         <property name="name" column="name"></property>
    16         <!-- 如果不写column,这默认用POJO中的属性名字 -->
    17         <property name="password" ></property>    
    18     </class>
    19 
    20 </hibernate-mapping>

    我们需要配置的是:hibernate-mapping,将POJO类与数据表一一对应。

    主键生产策略:

          1、increment:主键自动增长、由hibernate来管理

                 注意:如果数据库也设置了自动增长,就会发生主键冲突问题

          2、identity:由底层数据库来管理生成,不由hibernate管理

                 也就是说底层数据库怎么设置的主键就怎么来

                 注意:mysql、sql server可以,oracle不可以

          3、sequence:标识符生成器,就是底层数据库来管理生成,利用底层数据库提供的序列来生成标识符,不由hibernate管理

                 注意:mysql不支持序列  oracle支持

          4、native:由底层数据库自己来决定使用什么策略,hibernate不管

                 注意:mysql自动选择identity、oracle自动选择sequence

          5、uuid:随机生成32位不相同的字符串。

          主键分自然主键和代理主键

                1自然主键:也就是在业务中有具体意义的主键,

                2代理主键,就是上面我们说的那5种,没有任何意义,只是标识主键是唯一的。

    五、hibernate的配置,hibernate.cfg.xml

    有了xxx.hbm.xml这个映射文件还不够,因为hibernate需要连接数据库,那么这些操作放哪里呢,就提取出一个公用的配置文件出来,hibernate.cfg.xml就是这种公共的配置文件,加载数据库连接的信息,和将各种映射文件加载进来,其实就是抽取出来的,因为有很多映射文件,每个映射文件都需要连接数据库等操作,那么久将共同的操作提取出来形成了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://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6 
     7     <session-factory>
     8         <!-- 连接数据库信息 -->
     9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    10         <property name="hibernate.connection.username">root</property>
    11         <property name="hibernate.connection.password">root</property>
    12         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    13         
    14         <!-- 为true时,会在控制台输出sql语句,便于跟踪 -->
    15         <property name="show_sql">true</property>
    16         <!-- 会格式化输出sql语句 -->
    17         <property name="format_sql">true</property>
    18         <!-- 自动提交事务 -->
    19         <property name="hibernate.connection.autocommit">true</property>
    20         
    21         <!-- 引入映射文件 -->
    22         <mapping resource="bean/User.hbm.xml"/>
    23     
    24     </session-factory>
    25 
    26 </hibernate-configuration>

    六、有了xxx.hbm.xml和hibernate.cfg.xml后,就能使用hibernate的功能了。

     下面我们 给出test demo.

     1 package test;
     2 
     3 import org.hibernate.Session;
     4 import org.hibernate.SessionFactory;
     5 import org.hibernate.Transaction;
     6 import org.hibernate.cfg.Configuration;
     7 
     8 import bean.User;
     9 
    10 public class Test {
    11     
    12     public static void main(String args[]){
    13         //读取配置文件
    14         Configuration conf=new Configuration().configure();
    15         //根据配置创建factory
    16         SessionFactory sessionFactory = conf.buildSessionFactory();
    17         //获得操作数据库的session对象
    18         Session session = sessionFactory.openSession();
    19         Transaction transaction = session.beginTransaction();
    20         //创建对象
    21         User user = new User();
    22         user.setName("zhangsan");
    23         user.setPassword("12345");
    24         //将对象保存到数据库
    25         session.save(user);
    26         transaction.commit();
    27         //关闭资源
    28         session.close();
    29         sessionFactory.close();
    30         
    31     }
    32 
    33 }

     运行上面结果如下:

    发现在 数据表 中自动添了一行信息:下面是运行了两次

    总结:

    Hibernate是用来帮助我们做啥的?简而言之就是让我们不在操作mysql语句,直接用来操作POJO类。

    那怎么用来操作POJO类呢?通过xxx.hbm.xml这个配置文件。将POJO类与数据表映射。操作数据库字段就是操作POJO类的属性。

    怎么连接数据库呢?通过hibernate.cfg.xml  这个配置文件连接数据库,配置用户名密码等。

    有了上面两个配置文件,我们就可以来使用hibernate了。

    通过上面的小例子,我们大致了解了使用Hibernate的流程,接下来让我们详解Hibernate。

    详解Hibernate配置文件

        Hibernate从其配置文件中读取和数据库连接有关的信息。Hibernate配置文件有两种形式,XML格式或者java属性文件(properties)格式。
        (一)java属性文件的格式创建hibernate的配置文件,默认文件名为hibernate.properties,为键值对的形式,放在src目录下:例如

                    hibernate.dialect=org.hibernate.dialect.MySQLDialect
                    hibernate.connection.driver_class=com.mysql.jdbc.Driver
                    hibernate.connection.url=jdbv:mysql://localhost:3306/hibernate
                    hibernate.connection.username=root
                    hibernate.connection.password=123456
                    hibernate.show_sql=true


                    hibernate.dialect:指定数据库使用的sql方言。可以根据数据库的不同生成不同的方言,底层是通过调用一个一个类实现的。
                    hibernate.connection.driver_class:指定数据库的驱动程序
                    hibernate.connection.url:指定连接数据库的url
                    hibernate.connection.username:指定连接数据库的用户名
                    hibernate.connection.password:指定连接数据库的密码
                    hibernate.show_sql:如果为true,可以在控制台打印sql语句

                    hbm2ddl.auto:生成表结构的策略配置,配置这个可以通过映射文件和实体类自动生成表结构
                    有四个值:
                        update(最常用的取值):如果当前数据库不存在对应的数据表,那么自动创建数据表
                        如果存在对应的数据表,并且表结构和实体类属性一致,那么不做任何修改
                        如果存在对应的数据表,但是表结构和实体类属性不一致,那么会新创建与实体类属性对应的列,其他列不变

                        create(很少使用):无论是否存在对应的数据表,每次启动Hibernate都会重新创建对应的数据表,以前的数据会丢失

                        create-drop(极少使用):无论是否存在对应的数据表,每次启动Hibernate都会重新创建对应的数据表,每次运行结束删除数据表

                        validate(很少使用):只校验表结构是否和我们的实体类属性相同,不同就抛异常


     1 (二)使用xml格式的配置文件,默认文件名为hibernate.cfg.xml 
     2                 <?xml version="1.0" encoding="UTF-8"?>
     3                 <!DOCTYPE hibernate-configuration PUBLIC
     4                     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     5                     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     6 
     7                 <hibernate-configuration>
     8 
     9                     <session-factory>
    10                         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    11                         <property name="hibernate.connection.username">root</property>
    12                         <property name="hibernate.connection.password">root</property>
    13                         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    14 
    15                         <property name="show_sql">true</property>
    16                         <property name="format_sql">true</property>
    17                         <property name="hbm2ddl.auto">update</property>
    18                         <property name="hibernate.connection.autocommit">true</property> 
    19 
    20 <mapping resource="bean/User.hbm.xml"/>
    22 
    23                     </session-factory>
    24                 </hibernate-configuration>

    两种方式的区别

                如果Hibernate的配置文件为java属性文件,那么必须通过代码来声明需要加载的映射文件
                通过Configuration的addClass(实体类名.class)来加载。

                配置文件为xml文件时,可以通过<mapping>元素来指定需要加载的映射文件。

                当通过Configuration的默认构造方法创建实例时,会默认查找hibernate.properties文件,如果找到就将配置信息加载到内存中。
                默认情况下,hibernate不会加载hibernate.cfg.xml文件,必须通过Configuration的configure()方法来显式加载hibernate.cfg.xml文件

    Hibernate中持久化类编写规范

        -必须提供无参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。

        -所有属性必须提供public访问控制符的set get方法

        -属性应尽量使用基本数据类型的包装类型(如Integer)
                基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷。
                例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢?
                这时候如果用包装类型,就可以使用null来表示空值,学生未参加考试等等。

        -不要用final修饰实体(将无法生成代理对象进行优化)

    对象标识符

    在关系数据库中,通过主键来识别记录并保证记录的唯一性。
                主键的要求:不允许为null,不能重复,不能改变

                自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键。比如人的身份证就可以当作主键
                代理主键:增加一个不具备任何意义的字段,通常为ID,来作为主键

    在java中,按照内存地址不同区分不同的对象。

    在Hibernate中通过对象标识符(OID)来维持java对象和数据库表中对应的记录。
    与表的代理主键对应,OID也是整数类型,为了保证OID的唯一性和不可变性,通常由Hibernate或者底层数据库库给OID赋值。

    详解对象-关系映射文件

     1 Hiernate采用XML格式的文件来指定对象和关系数据之间的映射。Hibernate通过这个文件来生成各种sql语句。
     2 命名规则为 实体类名.hbm.xml  应该和实体类放在同一目录下。
     3 
     4 <?xml version="1.0" encoding="UTF-8"?>
     5 <!DOCTYPE hibernate-mapping PUBLIC 
     6     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     7     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     8 
     9  <!--根元素,有一常用属性为package,当指定了package时,后面的类名字就可以简短,例如 package="com.cad.domain",后面class标签的name只用写User即可--> 
    10  <hibernate-mapping>
    11 
    12     <!--class标签指定类和表的对应关系,name为类名,table为表名
    13         class标签的属性 dynamic-insert属性,默认是false,当我们执行插入语句时,会动态生成sql语句,如果我们只为某个字段赋值,其他字段为null,但是生成的sql语句还是包含其他字段,例如user有两个属性,我们只为name赋值,生成的sql语句还是 insert into user(name,password)values (?,?),而当我们将该值设置为true时,生成的sql语句会仅包含不为null的字段,生成的sql语句就是insert into user(name) values (?) 
    14 
    15         class标签的属性 dynamic-update属性,默认是false,当我们执行更新语句时,会动态生成sql语句,如果我们只为某个字段更新,其他字段不变,生成的sql语句还是包含其他字段。而当我们将该值设置为true时,生成的sql语句仅包含需要更新的字段
    16         使用上面的两个属性可以提高运行性能,但是Hibernate动态生成sql语句需要的性能很小,所以可以省略-->
    17     <class name="com.cad.domain.User" table="user"> 
    18 
    19         <!--id标签用来设定持久化类中的OID和表的主键的映射,name为持久化类中的属性,column是数据表中的主键列名
    20             id标签的属性:length 指定列的数据长度
    21             id标签的属性:unsaved-value 指定当主键为某个值时,当做null来处理
    22             id标签的属性:access 也可用在<property>标签上 默认值为property,即通过相应的get set方法来访问持久化类的属性,当值为field时,表明使用反射机制直接访问类的属性,不推荐使用,破坏封装性-->
    23         <id name="id" column="id">
    24             <!--
    25                 generator标签用来设定主键生成策略,hibernate内置的几种主键生成策略
    26                 1.increment 适用于代理主键。由Hibernate自动以递增的方式生成主键,每次增量为1 ,会执行两个sql语句,先从表中查找出最大的id,然后加一,插入当前数据
    27                 2.identity  适用于代理主键。由底层数据库生成主键,依赖数据库的主键自增功能
    28                 3.sequence  适用于代理主键。由底层数据库的序列来生成主键,前提是数据库支持序列。(mysql不支持,oracle支持)
    29                 4.hilo      适用于代理主键。Hibernate根据hilo算法来自己生成主键。
    30                 5.native    适用于代理主键。根据底层数据库对自动生成主键的支持能力选择 identity|sequence|hilo
    31                 6.uuid      适用于代理主键。采用UUID算法生成主键。
    32                 7.assigned  适用于自然主键。由我们自己指定主键值。例如指定身份证号为主键值
    33 
    34             -->
    35             <generator class="native"></generator>
    36         </id>
    37 
    38         <!--
    39             property标签属性 name指定持久化类的属性名称
    40             column 与类属性映射的字段名,如果没有设置,默认用类属性名作为字段名
    41             not-null  指定属性的约束是否为非空,默认false
    42             unique   指定属性的约束是否唯一
    43             type     指定Hibernate映射类型。例如java类型为string,数据库类型为text,那么应该把Hibernate类型设置为Text。有一张对应的表可以查看。如果没有指定映射类型,Hibernate会使用反射机制识别属性的java类型,然后自动使用与之对应的Hibernate映射类型
    44         -->
    45         <property name="name" column="name"></property>
    46         <property name="password" column="password"></property>
    47     </class>
    48  </hibernate-mapping>   

    Hibernate API详解

    Configuration类

    1 Configuration类:用来加载默认文件路径下的配置文件(hibernate.properties)。
    2                  调用configure()方法会加载默认文件路径下的xml格式的配置文件(hibernate.cfg.xml)推荐使用。
    3 
    4                  如果配置文件在不默认文件路径下或者配置文件名不符合默认规则
    5                      可以使用 
    6                      new Configuration().configure(file)  加载指定文件
    7                      new Configuration().configure(path)  加载指定路径下的文件 
    8 
    9                 如果使用properties格式的配置文件,可以使用addClass(实体类名.class)方法可以加载映射文件。           

    SessionFactory对象

    1 SessionFactory对象: 
    2                 SessionFactory代表数据库存储源。根据Hibernate配置文件创建对应的数据库存储源。
    3                 SessionFactory对象创建后,和Configuration对象再无关联。修改Configuration包含的配置文件信息,不会对SessionFactory有任何影响。   
    4 
    5                   获取SessionFactory对象:new Configuration().configure().buildSessionFactory();
    6                 对象的缓存很大,就称为重量级对象。SessionFactory存放了Hibernate配置信息,映射元数据信息等。是重量级对象。 

    Session对象

     1 Session对象:   
     2                 代表程序和数据库的会话。Session提供了操作数据库的各种方法。是轻量级对象。 
     3 
     4                    获取Session对象 
     5                    factory.openSession(): 获取新的Session实例。
     6                    factory.getCurrentSession():采用该方法创建的Session会取出当前线程中的Session,底层使用ThreadLocal进行存取 
     7 
     8                     save()方法:把Java对象保存到数据库中。
     9                                     Transaction ts=session.beginTransaction();
    10                                     User u=new User();
    11                                     u.setName("赵六");
    12                                     u.setPassword("123456");
    13                                     //将对象保存到数据库
    14                                     session.save(u); 
    15                                     ts.commit();
    16 
    17                     update()方法:更新数据库的方法 
    18                                     Transaction ts=session.beginTransaction();
    19                                     //先查出要修改的对象,根据主键值   
    20                                     User user=session.get(User.class, 1);
    21                                     user.setName("jery");
    22                                     //将对象更新到数据库,根据OID
    23                                     session.update(user); 
    24                                     ts.commit();
    25 
    26                     delete()方法:删除方法
    27                                     底层根据OID进行删除。有两种方式
    28                                     (1)
    29                                         Transaction ts=session.beginTransaction();
    30                                         User user=session.get(User.class, 1); 
    31                                         //删除指定对象
    32                                         session.delete(user);   
    33                                         ts.commit();
    34                                     (2)
    35                                         Transaction ts=session.beginTransaction();
    36                                         User user=new User();
    37                                         user.setId(2);
    38                                         session.delete(user);
    39                                         ts.commit();     
    40 
    41                     load()或get()方法:从数据库查找指定对象 
    42 
    43                                   session.get(实体类名.class,OID);或session.load(实体类名.class,OID);
    44 
    45                     load()和get()的区别
    46                                   我们使用get查询时发现控制台会立马打出查询语句。
    47                                   使用load查询时控制台不会打印查询语句。
    48                                   get方法被调用时立刻发送sql语句到数据库进行查询。
    49                                   load方法被调用时并没有查询数据库,当我们需要使用查询的对象时,才去查询,所以当我们打印对象时,才会在控制台打印sql语句。
    50 
    51                       get()的原理 
    52                                 程序调用get方法,Hibernate发送sql语句到数据库
    53                                 数据库返回结果,Hibernate将结果封装成对象,返回对象到程序。
    54 
    55                       load()的原理
    56                                 程序调用load方法,Hibernate使用代理技术,创建一个代理对象,属性只有ID值。
    57                                 然后返回代理对象给程序,我们使用对象时,代理对象调用Hibernate查询数据库,初始化其他属性。 
    58 
    59             load方法,返回一个代理对象,获取其属性时,会查询数据库,每次访问属性都会查询数据库么?
    60             答:不是。代理对象中有一个标识是否被初始化的boolean类型变量,记录是否被初始化。

    查询所有对象的方法

     1             使用HQL语言(后面会详细介绍),HQL语言是面向对象的
     2             Query query=session.createQuery("from User");
     3 
     4 
     5             第二种方式
     6             Criteria c=session.createCriteria(User.class);
     7             List<User> l=c.list();
     8 
     9             第三种方式,使用原生sql语句进行查询
    10             SQLQuery query=session.createSQLQuery("select * from user");
    11             List l=query.list();

    Transaction对象

    1         封装了事务的操作。我们做增删改查等操作时,必须开启事务.
    2             因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。
    3             开启事务: Transaction ts=session.beginTransaction();
    4             提交事务:ts.commit();
    5             回滚事务:ts.rollback();
    6             当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。

    Query对象

    1         封装HQL语句的对象。
    2 
    3         返回一个对象的方法 query.uniqueResult();
    4 
    5         分页相关
    6         query.setFirstResult(index):从第几个取
    7         query.setMaxResults(count):指定取几行记录

     

    主要参考博客:

     https://blog.csdn.net/c99463904/article/details/72794787

     https://www.cnblogs.com/whgk/p/6074930.html

    https://www.cnblogs.com/whgk/category/910622.html-----系列

  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/beilou310/p/10553011.html
Copyright © 2011-2022 走看看