【框架】[Hibernate]构架知识点常见操作

转载请注明出处:http://blog.csdn.net/qq_26525215

本文源自大学之旅_谙忆的博客

配置文件、JavaBean、HibernateSessionFactory等代码,请看上一篇:

【框架】[Hibernate]构架知识点详解入门与测试实例

Hibernate常见操作

如果利用Hibernate修改数据库时,需要使用事务处理,一个事务提交时才真正将修改过的记录更新到数据库中。

1、增加记录

@Test
    public void addStudent(){
        Session session = HibernateSessionFactory.getSession();
        /*需要增加的记录的对象*/
        Student student = new Student();
        student.setsId("S100");
        student.setsName("王五");
        student.setsAge(26);
        /*定义事务开始*/
        Transaction tran = session.beginTransaction();
        session.save(student);
        /*提交事务,真正保存到数据库中*/
        tran.commit();
    }

根据映射文件,Hibernate会把我们的增加对象的语句转换为对应的SQL语句。

Hibernate: insert into hib.students (sName, sAge, sId) values (?, ?, ?)

2、 删除记录

@Test
    public void delStudent(){
        Session session = HibernateSessionFactory.getSession();
        /*首先查找待删除的记录--这里通过ID*/
        Student student = new Student();
        student.setsId("S100");

        /*定义事务开始*/
        Transaction tran = session.beginTransaction();
        session.delete(student);
        /*提交事务,真正保存到数据库中*/
        tran.commit();
    }

根据映射文件,Hibernate会把我们的删除对象的语句转换为对应的SQL语句。

delete from hib.students where sId=?

3、修改/增加记录

只修改还可以用:Update

@Test
    public void addOrUpdata(){
        Session session = HibernateSessionFactory.getSession();
        /*首先查找待修改的记录--通过ID*/
        //Student s = session.get(Student.class, "S100");//用这种查找出来的只能修改
        Student s = new Student();
        s.setsId("S101");
        s.setsName("Babo");
        s.setsAge(15);
        /*定义事务开始*/
        Transaction tran = session.beginTransaction();
        session.saveOrUpdate(s);
        /*提交事务,真正保存到数据库中*/
        tran.commit();
    }

hibernate提供了saveOrUpdate的方法来进行数据库的操作。

hibernate会根据对象的状态决定是insert还是update,

其根本是通过xml文件中unsaved-value来确定的。

如果设置null,系统会根据传入的对象的id的值判断,

如果是null,则表示对象不存在,那么insert;

如果不是null,则表示已经存在,那么update.

Hibernate主键ID生成方式

数据库中表有主键、主键的唯一性决定了数据库表中记录唯一。缓存在Session中的数据即实例都有一个唯一的ID,ID映射了数据库中主键。

1、assigned:

主键由外部程序负责生成,无需Hibernate参与。即当增加一个实体时,由程序设定它的ID值(手工分配值)

<hibernate-mapping package="cn.hncu.domain">
    <class name="Student" table="students" catalog="hib">
        <id name="sId" type="java.lang.String">
            <column name="sId" length="8"></column>
            <generator class="assigned"></generator>
        </id>
        ...
    </class>
</hibernate-mapping>

2、identity:

在DB2、SQL Server、MySQL等数据库产品中表中主键列可以设定是自动增长列,则增加一条记录时主键的值可以不赋值。用数据库提供的主键生成机制。

(1) 表结构:

create table students(sId int not null  primary key auto_increment,name char(40));

(2) 映射文件

<hibernate-mapping package="cn.hncu.domain">
    <class name="Student" table="students" catalog="hib">
        <id name="sId" type="java.lang.String">
            <column name="sId" length="8"></column>
            <generator class="identity"></generator>
        </id>
        ...
    </class>
</hibernate-mapping>

3、increment:

主键按数值顺序递增。

此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。

这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。

因此,如果同一数据库有多个实例访问,此方式必须避免使用。

<hibernate-mapping package="cn.hncu.domain">
    <class name="Student" table="students" catalog="hib">
        <id name="sId" type="java.lang.String">
            <column name="sId" length="8"></column>
            <generator class="increment"></generator>
        </id>
        ...
    </class>
</hibernate-mapping>

4、sequence:

采用数据库提供的sequence 机制生成主键。

如Oralce 中的Sequence,在Oracle中创建序列:

create sequence hibernate_sequence;

当需要保存实例时,Hibernate自动查询Oracle中序列”hibernate_sequence”的下一个值;该值作为主键值。可以改变默认的序列名称。

<id name="sId" type="java.lang.String">
    <column name="sId" length="8"></column>
    <generator class="sequence"></generator>
</id>

5、native:

由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

<id name="sId" type="java.lang.String">
    <column name="sId" length="8"></column>
    <generator class="native"></generator>
</id>

6、uuid.hex:

由Hibernate为ID列赋值,依据当前客户端机器的IP、JVM启动时间、当前时间、一个计数器生成串,以该串为ID值。

<id name="sId" type="java.lang.String">
    <column name="sId" length="8"></column>
    <generator class="uuid.hex"></generator>
</id>

Hibernate 查询方式

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构上的相似所迷惑,HQL(Hibernate query lauguage) 被设计为完全面向对象的查询。

 HQL对关键字的大写小并不区分,但是对查询的对象就要区分大小写,因为它是面向对象的查询,所以查询的是一个对象,而不是数据库的表,在sql中如果要加条件的话就是列,而在HQL里面条件就是对象的属性,而且还要给对象起别名。

1、Hibernate查询 HQL语句

限制查询结果记录数与起始记录

@Test
    public void query1(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("from Student");
        query.setFirstResult(10); //设置查询记录开始位置,索引从0开始。
        query.setMaxResults(10);//设置查询返回的最大记录个数。
        List<Student> lists = query.list();
        for(Student s:lists){
            System.out.println(s);
        }
    }

条件查询

查询名字中带有’1’的所有Student

@Test
    public void query2(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("from Student s where s.sName like ‘%1%‘");
        List<Student> lists = query.list();
        for(Student s:lists){
            System.out.println(s);
        }
    }

2、取表中部分列时

(1) 单一属性查询。

还是返回一个集合,只不过集合中存储的不是表的实例而是对象。

@Test
    public void query3(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("select sName from Student s");
        List<String> lists = query.list();
        for(String s:lists){
            System.out.println(s);
        }
    }

(2) 多个属性的查询,使用对象数组。

查询多个属性,其集合元素是对象数组

数组元素的类型,跟实体类的属性的类型相关

@Test
    public void query4(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("select sName,sAge from Student s");
        List<Object[]> lists = query.list();
        for(Object[] s:lists){
            System.out.println(s[0]+","+s[1]);
        }
    }

(3) 多个属性的查询,使用List集合装部分列

@Test
    public void query5(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("select new list(s.sId,s.sName,s.sAge) from Student s");
        List<List> lists = query.list();
        for(List s:lists){
            System.out.println(s.get(0)+" "+s.get(1)+" "+s.get(2));//0,1,2是索引

        }
    }

(4) 使用Map集合装部分列

@Test
    public void query6(){
        Session session = HibernateSessionFactory.getSession();
        Query query = session.createQuery("select new Map(s.sId,s.sName,s.sAge) from Student s");
        List<Map> lists = query.list();
        for(Map s:lists){
            System.out.println(s.get("0")+" "+s.get("1")+" "+s.get("2"));//"0","1","2"是key

        }
    }

3、内连接


Query query=session.createQuery("select c.name, s.name from Student s join s.classes c ").list();
for (Iterator iter = students.iterator();iter.hasNext();) {
    Object[] obj = (Object[])iter.next();
    System.out.println(obj[0] + ", " + obj[1]);
}

4、外连接

select c.name, s.name from Classes c left join c.students s
select c.name, s.name from Classes c right join c.students s 

5、带参数的查询

(1) ?作为参数

如” from Customer cus where cus.name=?”;

   Session session = HibernateSessionFactory.getSession();
    Query query = session.createQuery("from Customer cus where cus.name=?");
     query.setParameter(0, "zhou");
     List list = query.list();

(2) 参数名称 :name

如” from Customer cus where cus.name=:name”;

Session session = HibernateSessionFactory.getSession();
       Query query = session.createQuery("from Customer cus where cus.name=:name ");
       query.setParameter("name", "zhou");
       List list = query.list();

(3) 条件查询,使用 ?的方式传递参数

 Query query = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE ?");

Query query = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE :myname");

query.setParameter("myname", "张三");//传递参数因为setParameter方法返回Query接口,所以可用省略方式来查询

List students = session.createQuery("SELECT s.id, s.name FROM Student s WHERE s.name LIKE :myname and s.id = :myid").
setParameter("myname", "%周%").setParameter("myid", 15).list();

6、嵌入原生sql测试


 SQLQuery sqlQuery = session.createSQLQuery("select * from t_student");
    List students = sqlQuery.list();
    for (Iterator iter = students.iterator();iter.hasNext();) {
        Object[] obj = (Object[])iter.next();
        System.out.println(obj[0] + ", " + obj[1]);
    }

转载请注明出处:http://blog.csdn.net/qq_26525215

本文源自大学之旅_谙忆的博客

时间: 2024-10-14 10:48:24

【框架】[Hibernate]构架知识点常见操作的相关文章

【框架】[Hibernate]构架知识点详解入门与测试实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] Hibernate介绍: Hibernate是一个开放源码的.非常优秀.成熟的O/R Mapping框架.它提供了强大.高性能的Java对象和关系数据的持久化和查询功能. O/R Mapping 对象关系映射(Object Relational Mapping,简称ORM)技术,是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中. 对象和关系

图像处理程序框架—MFC相关知识点

CDC:Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 . MFC基础类库定义了设备环境对象类----CDC类.CDC与CGdiObject的关系 说道CDC类就不能不提一下GdiObject---图形对象类. 在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作.就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔.用画笔在画布上绘画,不同的画笔将画出不同的画来.选择合适的图形对象和绘图对象,才能按照要求完成

Hibernate复习(七)常见的映射类型B

1.继承关联映射 1.1继承关系映射到多张表 配置: <class name="Product"....> .... <joined-subclass name="" table=""> <key column="t_product_id"/> <property ... /> </joined-subclass> </class> 基本操作:  保存:

Hibernate(八)__级联操作、struts+hibernate+接口编程架构

级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个department ,那么就自动删除该部门的所有学生. 再比如: bbs项目主帖<---->回帖 , 把主帖删除,那我们就希望把该主帖的回帖自动删除,这样我们可以使用级联(cascade)操作. 案例:如何配置级联操作,当删除某个部门的时候,我们自动删除其学生. 首先我们在配置文件中修改: <

MFC各种控件的常见操作(逐步添加中......)

由于经常切换系统或界面框架进行编程,难免有时会忘记之前的编程函数等等.所有在此自己做一个备份,以防止重新充电带来的痛苦! 1.CButton 1.1 在VC中编程实现按钮的启用(enable)和禁用(disable) 1.1.1 方式1:在对控件添加变量以后 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQuit.EnableWindow(TRUE); //启用按钮 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQu

转:jQuery 常见操作实现方式

http://www.cnblogs.com/guomingfeng/articles/2038707.html 一个优秀的 JavaScript 框架,一篇 jQuery 常用方法及函数的文章留存备忘. jQuery 常见操作实现方式 $("标签名") //取html元素 document.getElementsByTagName("") $("#ID") //取单个控件document.getElementById("")

java 三大框架 hibernate部分知识

1.三层架构    表现层 web层(MVC是一个表现层的设计模型)    业务层 service层    持久层 dao层2.三大框架和三层架构的关系(建议学习三大框架的顺序:先学习hibernate在学习struts2框架,最后学习spring 框架)    hibernate框架:它是一个持久层框架    struts2框架:它是一个表现层框架    spring框架:它是一个综合类框架   hibernate只能操作数据库(跟数据库打交道) 3.现阶段已经掌握的持久层技术    JDBC

JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

壹 ? 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但我觉得大家至少应该掌握一种,这样在面试能解决大部分数组问题.在了解实现思路后,日常开发中结合实际场景优化实现,提升性能也是后期该考虑的. 本文主要围绕数组去重.数组排序.数组降维.数组合并.数组过滤.数组求差集,并集,交集,数组是否包含某项等知识点展开,附带部分知识拓展,在看实现代码前也建议大家先自

Hibernate对象的CRUD操作

1.  Hibernate对象的CRUD操作 1.1.  对象的三种状态 瞬时(Transient) - 由new操作符创建,且尚未与HibernateSession 关联的对象被认定为瞬时(Transient)的.瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier).如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁.使用Hibernate Session可以将其变为持久(Persis