`

Hibernate SQL优化技巧

    博客分类:
  • SSH
阅读更多

在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能够性能上的少许提升。

 

 


 

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     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:Java 对象持久化技术详解(第2版).part4

     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:Java 对象持久化技术详解(第2版).part3

     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:Java 对象持久化技术详解(第2版).part1.rar

     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 ...

    一些JAVA教程技巧打包汇总

    Hibernate ORACLE数据字典与视图 struts2原理 几大框架问题 ORACLE数据字典与视图 SQL语句优化

    达内java培训目录

    掌握一定的数据库查询技巧及SQL语句优化技巧。 Oracle数据库 Oracle体系结构及系统管理、Oracle数据库高级编程、数据库设计基础。 掌握Oracle体系结构及核心编程技术 XML XML语法、XML解析(SAX、DOM)、Dom4j...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题74:sql语句优化小技巧 Java面试题75:批量插入几百万条数据 Java面试题76:有没有使用过redis Java面试题77:redis的使用场景 Java面试题78:redis存储对象的方式 Java面试题79:redis数据淘汰机制 Java...

    JSP开发技术大全 源码

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...

    JAVA实习报告及心得(6页).doc

    在三个月里,所学知识的确有很多,java基础,数据库操作(oracle,mysql),SSH框架(hibernate,struts,spring),网页设计jsp技术等,总之学到了很多曾经陌生的技术。受益匪浅。 实习计划 7月10日:简单地了解...

    JSP开发技术大全 JSP

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...

    jsp 开发技术大全

    mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用...Hibernate技术、Struts框架、Spring框架、错误处理与程序调试、Web程序优化与发布等...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ 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源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

Global site tag (gtag.js) - Google Analytics