Hibernate配制项之hibernate.show_sql, hibernate.show_sql和hibernate.use_sql_comments
前言
在本地开发时,我们经常有查看执行的SQL语句的需求。
本次介绍输出和统计SQL语句相关的三个配制项。
本文测试使用的实体如下:
@Entity
public class Event {
@Id
@GeneratedValue
@Column(name = "EVENT_ID")
private Long id;
private String title;
@Column(name = "EVENT_DATE")
private Date date;
private int version;
}
show_sql(输出sql)
在hiberante.cfg.xml中把show_sql
配制为true
如下
<hibernate-configuration>
<session-factory>
<!--省略了其它配制项 -->
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
在保存Event
时,
Session session = sessionFactory.openSession();
session.getTransaction().begin();
Event event = new Event();
event.setDate(new Date());
event.setTitle("event title");
session.save(event);
session.getTransaction().commit();
在控制台会输出如下sql
Hibernate: insert into Event (EVENT_DATE, title, version, EVENT_ID) values (?, ?, ?, ?)
format_sql(将输出的sql格式化)
将show_sql
配制为true
,输出的sql无论多长都只会在一行显示。我们可以将format_sql
配制为true
,这样Hibernate会先将sql格式化,然后再输出,方便了我们调试。
hiberante.cfg.xml配制如下
<hibernate-configuration>
<session-factory>
<!--省略了其它配制项 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
</session-factory>
</hibernate-configuration>
在保存Event
时,
Session session = sessionFactory.openSession();
session.getTransaction().begin();
Event event = new Event();
event.setDate(new Date());
event.setTitle("event title");
session.save(event);
session.getTransaction().commit();
在控制台会输出如下sql
Hibernate:
insert
into
Event
(EVENT_DATE, title, version, EVENT_ID)
values
(?, ?, ?, ?)
use_sql_comments(生成SQL注释)
将use_sql_comments
配制为true
,Hibernate会为我们生成SQL的注释,更加的方便了我们调试
hiberante.cfg.xml配制如下
<hibernate-configuration>
<session-factory>
<!--省略了其它配制项 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
</session-factory>
</hibernate-configuration>
情景一
在保存Event
时,
Session session = sessionFactory.openSession();
session.getTransaction().begin();
Event event = new Event();
event.setDate(new Date());
event.setTitle("event title");
session.save(event);
session.getTransaction().commit();
在控制台会输出如下sql
Hibernate:
/* insert com.jianglei.entity.Event
*/ insert
into
Event
(EVENT_DATE, title, version, EVENT_ID)
values
(?, ?, ?, ?)
情景二
在执行查询时
Session session = sessionFactory.openSession();
List<Event> events = session.createQuery("select e from Event e", Event.class)
.getResultList();
在控制台会输出如下sql
Hibernate:
/* select
e
from
Event e */ select
event0_.EVENT_ID as EVENT_ID1_0_,
event0_.EVENT_DATE as EVENT_DA2_0_,
event0_.title as title3_0_,
event0_.version as version4_0_
from
Event event0_
总结
在本地开发时,我一般把这三个选项都设置为true
,方便开发和调试
<hibernate-configuration>
<session-factory>
<!--省略了其它配制项 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
</session-factory>
</hibernate-configuration>
而在线上,一般将这三个选项设置为false(默认),减少不必要的输出和资源消耗