首页 Java java教程 java--实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

java--实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

Jun 26, 2017 am 09:16 AM
javaee 学习 实体 规则

一、hibernate中的实体规则

实体类创建的注意事项

 1.持久化类提供无参数构造

 2.成员变量私有,提供共有get/set方法访问.需提供属性

 3.持久化类中的属性,应尽量使用包装类型

 4.持久化类需要提供oid.与数据库中的主键列对应

 5.不要用final修饰class

主键类型

自然主键(少见)

  表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用.

代理主键(常见)

  表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键

主键生成策略

代理主键:

    identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
    sequence: Oracle中的主键生成策略.
    increment(了解): 主键自增.由hibernate来维护.每次插入前会先查询表中id最大值.+1作为新主键值.(如果10个人同时并发,查询就会出现问题)            
    hilo(了解): 高低位算法.主键自增.由hibernate来维护.开发时不使用.
    native:hilo+sequence+identity 自动三选一策略.
    uuid: 产生随机字符串作为主键. 主键类型必须为string 类型.

自然主键:

    assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.

二、hibernate中的对象状态

对象分为三种状态

//测试对象的三种状态public class Demo {

    @Test//查看三种状态public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态        
        c.setCust_name("联想"); // 瞬时状态        
        session.save(c); // 持久化状态, 有id,有关联        //4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//三种状态特点//save方法: 其实不能理解成保存.理解成将瞬时状态转换成持久状态的方法//主键自增 : 执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.//increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句.public void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态        
        c.setCust_name("联想"); // 瞬时状态        
        session.save(c); // 持久化状态, 有id,有关联        //4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//三种状态特点// 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作        
        Customer c = session.get(Customer.class, 1l);//持久化状态对象        
        c.setCust_name("微软公司");        //4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
}
登录后复制

三种状态的转换图

 

三、hibernate进阶-一级缓存

缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.

 提高效率手段1:提高查询效率

提高效率手段2:减少不必要的修改语句发送

 

四、hibernate中的事务

 

 知识点:如何在hibernate中指定数据库的隔离级别

         <!-- 指定hibernate操作数据库时的隔离级别 
            #hibernate.connection.isolation 1|2|4|8        
            0001    1    读未提交
            0010    2    读已提交
            0100    4    可重复读
            1000    8    串行化         --> <property name="hibernate.connection.isolation">4</property>
登录后复制

知识点2:在项目中如何管理事务

  业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.

  在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象

  在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象

  注意1: 调用getCurrentSession方法必须配合主配置中的一段配置

         <!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property>
登录后复制

  注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.

crm项目中:

  Service层

    public void save(Customer c) {
        Session session =  HibernateUtils.getCurrentSession();//打开事务Transaction tx = session.beginTransaction();//调用Dao保存客户try {
            customerDao .save(c);
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }//关闭事务        tx.commit();
    }
登录后复制

  Dao层

    public void save(Customer c) {//1 获得sessionSession session = HibernateUtils.getCurrentSession();//3 执行保存        session.save(c);
    }
登录后复制

 

 

五、hibernate中的批量查询(概述)

HQL查询-hibernate Query Language(多表查询,但不复杂时使用)

Hibernate独家查询语言,属于面向对象的查询语言

//测试HQL语句public class Demo {

    @Test//基本查询public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句//        String hql = " from cn.itheima.domain.Customer ";String hql = " from Customer "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//3> 根据查询对象获得查询结果List<Customer> list = query.list();    // 返回list结果//query.uniqueResult();//接收唯一的查询结果        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//条件查询//HQL语句中,不可能出现任何数据库相关的信息的public void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = 1 "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//条件查询//问号占位符public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = ? "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置参数//query.setLong(0, 1l);query.setParameter(0, 1l);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//条件查询//命名占位符public void fun4(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer where cust_id = :cust_id "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置参数query.setParameter("cust_id", 1l);//3> 根据查询对象获得查询结果Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//分页查询public void fun5(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1> 书写HQL语句String hql = " from Customer  "; // 查询所有Customer对象//2> 根据HQL语句创建查询对象Query query = session.createQuery(hql);//设置分页信息 limit ?,?query.setFirstResult(1);
        query.setMaxResults(1);//3> 根据查询对象获得查询结果List<Customer> list =  query.list();
        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联    }
}
登录后复制

 

Criteria查询(单表条件查询)

Hibernate自创的无语句面向对象查询

//测试Criteria查询public class Demo {

    @Test//基本查询public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------        //查询所有的Customer对象Criteria criteria = session.createCriteria(Customer.class);
        
        List<Customer> list = criteria.list();
        
        System.out.println(list);        
//        Customer c = (Customer) criteria.uniqueResult();        //-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//条件查询//HQL语句中,不可能出现任何数据库相关的信息的// >                 gt// >=                ge// <                lt// <=                le// ==                eq// !=                ne// in                in// between and        between// like             like// is not null         isNotNull// is null            isNull// or                or// and                andpublic void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//添加查询参数 => 查询cust_id为1的Customer对象criteria.add(Restrictions.eq("cust_id", 1l));//执行查询获得结果Customer c = (Customer) criteria.uniqueResult();
        System.out.println(c);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    
    
    @Test//分页查询public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//设置分页信息 limit ?,?criteria.setFirstResult(1);
        criteria.setMaxResults(2);//执行查询List<Customer> list = criteria.list();
        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//查询总记录数public void fun4(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//创建criteria查询对象Criteria criteria = session.createCriteria(Customer.class);//设置查询的聚合函数 => 总行数        criteria.setProjection(Projections.rowCount());//执行查询Long count = (Long) criteria.uniqueResult();
        
        System.out.println(count);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
}
登录后复制

 

原生SQL查询(复杂的业务查询)

//测试原生SQL查询public class Demo {

    @Test//基本查询public void fun1(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1 书写sql语句String sql = "select * from cst_customer";        //2 创建sql查询对象SQLQuery query = session.createSQLQuery(sql);        //3 调用方法查询结果List<Object[]> list = query.list();//query.uniqueResult();for(Object[] objs : list){
            System.out.println(Arrays.toString(objs));
        }        //-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//基本查询public void fun2(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1 书写sql语句String sql = "select * from cst_customer";        //2 创建sql查询对象SQLQuery query = session.createSQLQuery(sql);//指定将结果集封装到哪个对象中query.addEntity(Customer.class);        //3 调用方法查询结果List<Customer> list = query.list();
        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//条件查询public void fun3(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1 书写sql语句String sql = "select * from cst_customer where cust_id = ? ";        //2 创建sql查询对象SQLQuery query = session.createSQLQuery(sql);
        
        query.setParameter(0, 1l);//指定将结果集封装到哪个对象中query.addEntity(Customer.class);        //3 调用方法查询结果List<Customer> list = query.list();
        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
    
    @Test//分页查询public void fun4(){//1 获得sessionSession session = HibernateUtils.openSession();//2 控制事务Transaction tx = session.beginTransaction();//3执行操作//-------------------------------------------//1 书写sql语句String sql = "select * from cst_customer  limit ?,? ";        //2 创建sql查询对象SQLQuery query = session.createSQLQuery(sql);
        
        query.setParameter(0, 0);
        query.setParameter(1, 1);//指定将结果集封装到哪个对象中query.addEntity(Customer.class);        //3 调用方法查询结果List<Customer> list = query.list();
        
        System.out.println(list);//-------------------------------------------//4提交事务.关闭资源        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联        
        
    }
}
登录后复制

 

五、练习:客户列表

案例比较简单,可以按照上面笔记的知识点完成

servlet:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 调用Service查询所有客户List<Customer> list = cs.getAll();//2 将客户列表放入request域request.setAttribute("list", list);//3 转发到list.jsp显示request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response);
    
    }
登录后复制

service:

    public List<Customer> getAll() {
        Session session =  HibernateUtils.getCurrentSession();//打开事务Transaction tx = session.beginTransaction();
        
        List<Customer> list = customerDao.getAll();        
        //关闭事务                tx.commit();return list;
    }
登录后复制

dao:

    public List<Customer> getAll() {//1 获得sessionSession session = HibernateUtils.getCurrentSession();//2 创建Criteria对象Criteria c = session.createCriteria(Customer.class);return c.list();
    }
登录后复制

 

以上是java--实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

学会彻底卸载pip,使用Python更加高效 学会彻底卸载pip,使用Python更加高效 Jan 16, 2024 am 09:01 AM

不再需要pip?快来学习如何有效卸载pip!引言:pip是Python的包管理工具之一,它可以方便地安装、升级和卸载Python包。然而,有时候我们可能需要卸载pip,可能是因为我们希望使用其他的包管理工具,或者因为我们需要完全清除Python环境。本文将介绍如何有效地卸载pip,并提供具体的代码示例。一、卸载pip的方法下面将介绍两种常见的卸载pip的方法

深入研究matplotlib的色彩映射表 深入研究matplotlib的色彩映射表 Jan 09, 2024 pm 03:51 PM

深入学习matplotlib颜色表,需要具体代码示例一、引言matplotlib是一个功能强大的Python绘图库,它提供了丰富的绘图函数和工具,可以用于创建各种类型的图表。而颜色表(colormap)是matplotlib中一个重要的概念,它决定了图表的配色方案。深入学习matplotlib颜色表,将帮助我们更好地掌握matplotlib的绘图功能,使绘

揭秘C语言的吸引力: 发掘程序员的潜质 揭秘C语言的吸引力: 发掘程序员的潜质 Feb 24, 2024 pm 11:21 PM

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

Pygame入门指南:全面安装和配置教程 Pygame入门指南:全面安装和配置教程 Feb 19, 2024 pm 10:10 PM

从零开始学习Pygame:完整的安装和配置教程,需要具体代码示例引言:Pygame是一个使用Python编程语言开发的开源游戏开发库,它提供了丰富的功能和工具,使得开发者可以轻松创建各种类型的游戏。本文将带您从零开始学习Pygame,并提供完整的安装和配置教程,以及具体的代码示例,让您快速入门。第一部分:安装Python和Pygame首先,确保您的计算机上已

一起学习word根号输入办法 一起学习word根号输入办法 Mar 19, 2024 pm 08:52 PM

在word中编辑文字内容时,有时会需要输入公式符号。有的小伙们不知道在word根号输入的方法,小面就让小编跟小伙伴们一起分享下word根号输入的方法教程。希望对小伙伴们有所帮助。首先,打开电脑上的Word软件,然后打开要编辑的文件,并将光标移动到需要插入根号的位置,参考下方的图片示例。2.选择【插入】,再选择符号里的【公式】。如下方的图片红色圈中部分内容所示:3.接着选择下方的【插入新公式】。如下方的图片红色圈中部分内容所示:4.选择【根式】,再选择合适的根号。如下方的图片红色圈中部分内容所示:

指针比较的规则和例外? 指针比较的规则和例外? Jun 04, 2024 pm 06:01 PM

在C/C++中,指针比较规则如下:指向同一对象的指针相等。指向不同对象的指针不相等。例外:指向空地址的指针相等。

从零开始学习Go语言中的main函数 从零开始学习Go语言中的main函数 Mar 27, 2024 pm 05:03 PM

标题:从零开始学习Go语言中的main函数Go语言作为一种简洁、高效的编程语言,备受开发者青睐。在Go语言中,main函数是一个入口函数,每个Go程序都必须包含main函数作为程序的入口点。本文将从零开始介绍如何学习Go语言中的main函数,并提供具体的代码示例。一、首先,我们需要安装Go语言的开发环境。可以前往官方网站(https://golang.org

Java JPA 面试题精选:检验你的持久化框架掌握程度 Java JPA 面试题精选:检验你的持久化框架掌握程度 Feb 19, 2024 pm 09:12 PM

什么是JPA?它与JDBC有什么区别?JPA(JavaPersistenceapi)是一个用于对象关系映射(ORM)的标准接口,它允许Java开发者使用熟悉的Java对象来操作数据库,而无需编写直接针对数据库的sql查询。而JDBC(JavaDatabaseConnectivity)是Java用于连接数据库的标准API,它需要开发者使用SQL语句来操作数据库。JPA将JDBC封装起来,为对象-关系映射提供了更方便、更高级别的API,简化了数据访问操作。在JPA中,什么是实体(Entity)?实体

See all articles