在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的SQL语句,提高SQL执行效率,最终可以提高系统性能。
如,有一个User类。
public class User {
/** Creates a new instance of 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();
}
/**
* Test of getAge method, of class model.User.
*/
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能够性能上的少许提升。
分享到:
相关推荐
18.4 高级查询技巧 18.4.1 动态查询 18.4.2 集合过滤 18.4.3 子查询 18.4.4 本地SQL查询 18.4.5 查询结果转换器 18.5 查询性能优化 18.5.1 iterate()方法 18.5.2 查询缓存 18.6 小结 18.7 ...
18.4 高级查询技巧 18.4.1 动态查询 18.4.2 集合过滤 18.4.3 子查询 18.4.4 本地SQL查询 18.4.5 查询结果转换器 18.5 查询性能优化 18.5.1 iterate()方法 18.5.2 查询缓存 18.6 小结 18.7 ...
18.4 高级查询技巧 18.4.1 动态查询 18.4.2 集合过滤 18.4.3 子查询 18.4.4 本地SQL查询 18.4.5 查询结果转换器 18.5 查询性能优化 18.5.1 iterate()方法 18.5.2 查询缓存 18.6 小结 18.7 ...
18.4 高级查询技巧 18.4.1 动态查询 18.4.2 集合过滤 18.4.3 子查询 18.4.4 本地SQL查询 18.4.5 查询结果转换器 18.5 查询性能优化 18.5.1 iterate()方法 18.5.2 查询缓存 18.6 小结 18.7 ...
Hibernate ORACLE数据字典与视图 struts2原理 几大框架问题 ORACLE数据字典与视图 SQL语句优化
掌握一定的数据库查询技巧及SQL语句优化技巧。 Oracle数据库 Oracle体系结构及系统管理、Oracle数据库高级编程、数据库设计基础。 掌握Oracle体系结构及核心编程技术 XML XML语法、XML解析(SAX、DOM)、Dom4j...
Java面试题74:sql语句优化小技巧 Java面试题75:批量插入几百万条数据 Java面试题76:有没有使用过redis Java面试题77:redis的使用场景 Java面试题78:redis存储对象的方式 Java面试题79:redis数据淘汰机制 Java...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...
在三个月里,所学知识的确有很多,java基础,数据库操作(oracle,mysql),SSH框架(hibernate,struts,spring),网页设计jsp技术等,总之学到了很多曾经陌生的技术。受益匪浅。 实习计划 7月10日:简单地了解...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...
│ Java面试题74:sql语句优化小技巧.mp4 │ Java面试题75:批量插入几百万条数据.mp4 │ Java面试题76:有没有使用过redis.mp4 │ Java面试题77:redis的使用场景.mp4 │ Java面试题78:redis存储对象的方式.mp4 │...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...