Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
1)<property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素 dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把 dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
当有select-before-update="true"时,在前台界面上不操作修改任何属性而直接点击确定时将在控制台不会输出任何信息.
所以根据以上实际例子得出结论:select-before-update="true|false"属性默认是false,如果为true时,在执行修改操作时,在session清理缓存时它将先执行一条select语句,然后比较所操作的对象的属性值是否与数据库中所对应的值相同,如果不同就会执行已经被修改的属性的Update操作,当然这里它还要执行的操作是到admin.nbm.xml 文件中去检索被修改过的属性所对应的配置的update属性是否等于true,这样遍历完后就到执行update操作.如果没有修改对象的任何一个属性的值,将不会触发update操作或saveorupdate操作;所以select-before-update的好处是提高了应用程序的性能,避免了 session执行不必要的update操作.当然这个属性只运用于对象不是经常被修改的时候,如果经常修改的对象使用此属性讲会带来性能的减弱.
分享到:
相关推荐
在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...
`dynamic-insert="true"`表示在保存对象时,只有非空字段才会被包含在`insert`语句中,而`dynamic-update="true"`则意味着只有字段值发生变化时,才会包含在`update`语句中。它们的默认值都是`false`。 5. `<class>...
1. **动态表名绑定**:允许开发者在Mapper接口方法上通过注解@Select、@Insert、@Update和@Delete来指定动态表名。表名可以通过方法参数、实体类属性或者自定义表达式来动态计算。 2. **自动填充表名**:通过@Table...
<class name="com.bulletin.bean.Bulletin" table="BULLETIN" schema="XJL" dynamic-insert="true" dynamic-update="true"> <!-- 映射类的属性 --> </hibernate-mapping> ``` 这里的`<class>`标签表示映射到...
- `dynamic-insert`: 如果为`true`,则表示动态生成插入语句,只包含非空字段,增强效率。 - `dynamic-update`: 如果为`true`,则表示动态生成更新语句,只包含非空字段,避免不必要的更新操作。 4. **`<class>`*...
### CVS适用及其在MyEclipse中的发布 ...根据描述中的部分代码片段,可以看出这里涉及到的配置主要是指`dynamic-insert`和`dynamic-update`属性,它们用于控制Hibernate是否动态地插入或更新记录。例如: ```xml ...
- **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...
- **`insert-before-update`**:设置为`true`时,在执行更新操作前先执行一次查询操作来判断数据是否真的发生了变化,默认为`false`。 - **`polymorphism`**:多态查询方式,默认为`implicit`。 - **`where`**:指定...
- **Hibernate逆向工程**:解决`ids for this class must be manually assigned`错误,修改了自动生成的ID配置,添加了`dynamic-update`和`dynamic-insert`属性以优化数据库操作。 - **Spring与Hibernate集成**:...
Dynamic-add-date是基于Mybatis插件原理开发的可以动态在Insert和Update Sql语句中添加日期列和对应的值的插件。 可以解决MySQL 5.6.5之前的版本对自动初始化时间戳的限制: DATETIME列不支持DEFAULT CURRENT_...
- **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...
若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...
- **`dynamic-insert`**:布尔值,决定在插入新记录时是否动态生成SQL语句。 - **`dynamic-update`**:布尔值,决定在更新记录时是否动态生成SQL语句。 - **`<property>`** 标签:用于指定实体类属性与数据库表列...
- `dynamic-insert`:如果设为`true`,Hibernate仅在字段不为null时插入。 - `dynamic-update`:如果设为`true`,Hibernate仅在字段不为null时更新。 - `<id>`:定义主键映射。 - `name`:指定主键字段名称。 -...
4. **dynamic-insert**:布尔值,表示插入时是否忽略null值,默认为`false`。 5. **proxy**:设置懒加载时使用的代理类。 6. **discriminator-value**:用于多态继承映射,表示子类的标识值。 7. **where**:可选...
<class name="com.isoftstone.javasource.course" table="courses" dynamic-insert="true" dynamic-update="true"> </hibernate-mapping> ``` 上述示例展示了如何使用XML映射文件定义一个课程实体,指定其...
- **dynamic-update**和**dynamic-insert**: 控制是否动态生成SQL更新和插入语句,基于只有修改过的字段。 - **select-before-update**: 在更新前是否先执行SELECT语句,确保并发安全。 - **polymorphism**: 控制...
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of dict_division -- ---------------------------- INSERT
例子: executeMySQL('INSERT into User (username, password) VALUES (?, ?)', array($username, $password)); if ($this->isInserted()) { return true; } else { 返回假; } } /** * 这只会查看名为 User 的...