在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的SQL语句,提高SQL执行效率,最终可以提高系统性能。
如,有一个User类。
-
-
public class User {
-
-
-
public User() {
- }
-
private long id;
-
private int age;
-
-
private String firstname;
-
private String lastname;
-
private Set emailAddresses;
-
//省略getter 和setter方法
- }
Hibernate映射文件(User.hbm.xml,省略了文件头声明)定义为:
- <hibernate-mapping>
-
<class name="model.User" table="Users" >
-
<id name="id" column="ID">
-
<generator class="native"/>
-
</id>
-
<property name="age"/>
-
<property name="firstname"/>
-
<property name="lastname"/>
-
-
<set name="emailAddresses" table="PERSON_EMAIL_ADDR">
-
<key column="PERSON_ID"/>
-
<element type="string" column="EMAIL_ADDR"/>
-
</set>
-
</class>
-
</hibernate-mapping>
我们写一个测试类进行测试UserTest。
- public class UserTest extends TestCase {
-
-
public UserTest(String testName) {
-
super(testName);
- }
-
-
private Session session;
-
private SessionFactory sessionFactory;
-
-
protected void setUp() throws Exception {
- sessionFactory=HibernateUtil.getSessionFactory();
- session=sessionFactory.openSession();
- session.getTransaction().begin();
- }
-
-
protected void tearDown() throws Exception {
- session.getTransaction().commit();
- session.close();
-
- }
-
-
-
public void testSaveUser() {
-
System.out.println("================testSaveUser=================");
-
-
User user = new User();
-
user.setAge(29);
- session.save(user);
-
assertNotNull("id is assigned !",user.getId());
- }
-
public void testUpdateUser() {
-
System.out.println("================testUpdateUser=================");
-
-
User user = new User();
-
user.setAge(29);
- session.save(user);
-
assertNotNull("id is assigned !",user.getId());
-
-
User _user=(User) session.get(User.class, user.getId());
-
_user.setFirstname("Array");
- session.update(_user);
-
- }
-
-
- }
运行测试后,此时会生成完整的SQL语句(注意将hibernate属性show_sql设置成true)。
- ================testSaveUser=================
- Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
- ================testUpdateUser=================
- Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
- Hibernate: update Users set age=?, firstname=?, lastname=? where ID=?
如果我们在<class ...>中加上 dynamic-insert="true" dynamic-update="true",变成如下。
- <class name="model.User" table="Users" dynamic-insert="true" dynamic-update="true">
再次运行测试类,就会发现生成的SQL中涉及的字段只包含User类中修改的属性所对应的表字段。
- ================testSaveUser=================
- Hibernate: insert into Users (age) values (?)
- ================testUpdateUser=================
- Hibernate: insert into Users (age) values (?)
- Hibernate: update Users set firstname=? where ID=?
如果一个表的结构很复杂,字段很多的情况下,使用dynamic-insert,dynamic-update能够性能上的少许提
Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
分享到:
相关推荐
【标题】"完整单元测测Jutil数据包"所指的是一个包含了Junit多个版本的集合,主要用于进行单元测试。Junit是Java编程语言中最广泛使用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的功能...
根据压缩包子文件的文件名称列表:`django-jutil-3.7.13`,我们可以推测这包含了这个库的源代码、文档、测试等相关文件。通常,解压这个文件后,我们会找到一个`setup.py`文件,它是Python项目用来安装和配置的入口...
从命令行对JSON API进行了大量测试吗? 对结构化数据不加思索地侮辱了? 手指因打字而疼痛| python -mjson.tool | python -mjson.tool吗? 希望C 0 L O,[R S' 好吧, jutil (可能)适合您! 它运行在,您可以...
参考网上的文档,编写了使用 python API 接口实现的接口库:neo4jUtil.py。另外还写一个查询脚本:querySQL.py。 使用方法: 需要安装 neo4j for python 的库: pip install neo4j 修改配置文件:neo4jCfg.py ...
最近研究图形数据库 Neo4j。需要使用 java API 编写查询接口,参考网上的示例自己写了一个接口类: Neo4jUtil.java。目前只完成了查询方法...测试环境信息: Neo4j Version: 3.5.13 jdk-1.8.0 eclipse jee oxygen 1a
- **Dom4jTest.java**: 测试类,使用JUnit编写,用于验证DOM4JUtil的功能是否正常工作。 - **说明.txt**: 提供了关于如何使用这些文件的简短说明。 在实践中,`Dom4jUtil.java`会包含如`createXMLDocument()`, `...
在`Dom4jUtil.java`中可能定义了一些通用的静态方法,用于创建、读取和修改XML文档;而在`Dom4jTest.java`中,可能会有测试用例来调用这些方法并验证其功能。 6. **Junit-4.4.jar**: - 这是JUnit 4.4版本的库,一...
通过modbus协议读取和写入寄存器数据java详细demo,如果是modbus TCP只需要看com.rib.cdm.utils.ModbusTcpUtils这个类就行了,这个类是详细的读取以及写入demo。如果需要modbus RTU,那么只需要看...
在实际应用中,可以根据需求替换测试字符串,实现对不同汉字或字符串的拼音转换。 #### 总结 通过以上分析,我们不仅了解了`Pinyin4j`库的基本使用方法,还掌握了一个实用的汉字转拼音的代码实现。这为处理中文...
public class Pinyin4jUtil { /** * getFirstSpellPinYin: 获取第一个拼音(多音字时获取第一个)。 * @param src 传入的拼音字符串,以逗号隔开 * @param isFullSpell 是否全拼,true:全拼,false:第一个汉字...
String str = "测试"; String pinyin = Pinyin4jUtil.converterToSpell(str); System.out.println(str + " pin yin :" + pinyin); pinyin = Pinyin4jUtil.converterToFirstSpell(str); System.out.println(str...