使用参数绑定
  
  使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存。
  
  避免SQL注入。
  
  尽量少使用NOT
  
  如果where子句中包含not关键字,那么执行时该字段的索引失效。
  
  尽量使用where来替换having
  
  having在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录的数目,能减少这方面的开销。
  
  减少对表的查询
  
  在含有子查询的HQL中,尽量减少对表的查询,降低开销。
  
  使用表的别名
  
  当在HQL语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列连接上,这样一来,可以减少解析时间并减少列歧义引起的语法错误。
  
  实体的更新与删除
  
  在Hibernate3以后支持hql的update与delete操作。可参考度娘。
  
  一级缓存优化
  
  一级缓存也叫做session缓存,在一个hibernate session有效,这级缓存的可干预性不强,大多于hibernate自动管理,但它提供清除缓存的方法,这在大批量增加(更新)操作是有效果的,例如,同时增加十万条记录,按常规进行,很可能会出现异常,这时可能需要手动清除一级缓存,session.evict以及session.clear。
  
  检索策略(抓取策略)
  
  延迟加载
  
  延迟加载是Hibernate为提高程序执行的效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。load方法采用的策略是延迟加载;get方法采用的策略是立即加载。
  
  检索策略分为两种:
  
  类级别检索
  
  关联级别检索
  
  类级别检索
  
  类级别检索是通过session直接检索某一类对应的数据,例如:
  
  Customer c = session.load(Customer.class, 1);
  
  1
  
  1
  
  或
  
  session.createQuery("from Order");
  
  1
  
  1
  
  类级别检索策略分为立即检索与延迟检索,默认是延迟检索,类级别的检索策略可以通过<class>元素的lazy属性来设置,默认值是true。所以我们可在hbm映射配置文件中设置如下:
  
  <class name="Customer" table="t_customer" catalog="hibernateTest" lazy="true">
  
  ...
  
  </class>
  
  1
  
  2
  
  3
  
  1
  
  2
  
  3
  
  除此之外,我们也可在PO类中使用@Proxy注解,例如:
  
  @Proxy(lazy = true)
  
  public class Customer {
  
  ...
  
  }
  
  1
  
  2
  
  3
  
  4
  
  1
  
  2
  
  3
  
  4
  
  现在我着重来讲一下在PO类中@Proxy注解的使用。提示,以下所有案例代码的编写都是建立在Hibernate检索方式概述一文案例基础之上的。首先将@Proxy(lazy = true)这样的注解加在PO类——Customer类上,这样Customer类的代码就变成:
  
  // 客户 ---- 一的一方
  
  @Entity
  
  @Table(name="t_customer")
  
  @NamedQuery(name="myHql", query="from Customer")
  
  // @SqlResultSetMapping注解才真正帮我们去规定执行sql语句如何将结果封装到Customer对象
  
  @SqlResultSetMapping(name="customerSetMapping",entities={ @EntityResult(entityClass=Customer.class,fields={
  
  @FieldResult(name="id",column="id"),@FieldResult(name="name",column="name") }) })
  
  // fields指定类里面的每一个属性跟表中的列是如何对应的
  
  @NamedNativeQuery(name="findCustomer",query="select * from t_customer",resultSetMapping="customerSetMapping")
  
  // resultSetMapping需要指定一个名字,它用来指定结果如何封装的操作
  
  @Proxy(lazy = true)
  
  public class Customer {
  
  @Id
  
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  
  private Integer id; // 主键
  
  private String www.xyseo.net name; // 姓名
  
  // 描述客户可以有多个订单
  
  /*
  
  * targetEntity="...":相当于<one-to-many class="...">
  
  * mappedBy="...":相当于inverse=true,即放弃关联关系的维护,不然会生成一个中间表
  
  */
  
  @OneToMany(targetEntity=Order.class,mappedBy="c")
  
  private Set<Order> orders = new HashSet<Order>();
  
  public Customer() {
  
  }
  
  public Customer(Integer id, String name) {
  
  super();
  
  this.id = id;
  
  this.name = name;
  
  }
  
  public Set<Order> getOrders() {
  
  return orders;
  
  }
  
  public void setOrders(Set<Order> orders) {
  
  this.orders = orders;
  
  }
  
  public Integer getId() {
  
  return id;
  
  }
  
  public void setId(Integer id) {
  
  this.id = id;
  
  }
  
  public String getName() {
  
  return name;
  
  }
  
  public void setName(String name) {
  
  this.name = name;
  
  }
  
  @Override
  
  public String toString(www.baqist.cn) {
  
  return "Customer [)
  
  public class Order {

相关文章:

  • 2022-12-23
  • 2021-07-06
  • 2022-02-14
  • 2021-11-19
  • 2021-08-17
猜你喜欢
  • 2022-12-23
  • 2021-12-24
  • 2022-03-03
  • 2021-12-24
  • 2022-12-23
  • 2022-01-23
相关资源
相似解决方案