Hibernate之新增数据

本文介绍了一个使用Hibernate框架实现数据新增的具体实例。通过定义实体类、配置核心文件及映射文件,实现了用户信息到数据库的保存操作。文章展示了完整的Java代码和配置细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录Hibernate新增数据的练习部分

实体类

package com.maty.entity;

/**
 * @author maty e-mail:512181558@qq.com
 * @version 创建时间:2018年5月26日 下午1:40:30 类说明 本类为ORM的实体类
 */
public class User
{
	private int id;
	private String username;
	private String password;

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public String getUsername()
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public String getPassword()
	{
		return password;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	@Override
	public String toString()
	{
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}

}

Hibernate的映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入映射的约束条件,位于hibernate-core包中的org.hibernate.hibernate-configuration-3.0.dtd中 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 设定实体类与表的对应关系 -->
	<class name="com.maty.entity.User" table="t_user">
		<!-- 设定实体类id与表的id -->
		<id name="id" column="id">
			<!-- 设定表中id的增长策略,使用native则表明根据数据库类型来决定主键生成策略 -->
			<generator class="native"></generator>
		</id>
		<!-- 设置其他属性的对应关系 -->
		<property name="username" column="username"></property>
		<property name="password" column="password"></property>
	</class>
</hibernate-mapping>

Hibernate的核心配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入Hibernate的核心配置文件的约束,该约束位于hibernate-core包中的org.hibernate.hibernate-configuration-3.0.dtd -->
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 第一步:配置数据库信息 -->
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		<!-- 配置数据库的驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 配置数据库的url -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost/tx</property>
		<!-- 配置数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 配置数据库的密码 -->
		<property name="hibernate.connection.password">wangxiaowei</property>

		<!-- 第二步:配置Hibernate本身的设置 -->
		<!-- 是否在console显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 是否对sql语句进行格式化 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 是否自动建表 -->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- 第三步:加载hibernate mapping文件 -->
		<mapping resource="com/maty/entity/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>

测试类

package com.maty.dao;

import java.io.Serializable;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.maty.entity.User;

/** 
* @author maty  e-mail:512181558@qq.com
* @version 创建时间:2018年5月26日 下午3:21:23 
* 类说明 该类用来演示hibernate的添加数据
*/
public class UserDao
{
	@Test
	public void add()
	{
		//1.加载hibernate的核心配置文件
		Configuration cfg = new Configuration().configure();
		//2.创建SessionFactory对象
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		//3.创建session对象
		Session session = sessionFactory.openSession();
		//4.操作实体类
		User user = new User();
		user.setUsername("tom");
		user.setPassword("512181");
		//5.开启事务
		Transaction transaction = session.beginTransaction();
		session.save(user);
		//6.提交操作
		transaction.commit();
		//7.关闭资源
		session.close();
		sessionFactory.close();
		System.out.println("新增数据成功");
	}
}
 
### 使用 Hibernate 的 `saveOrUpdate` 方法实现新增和更新功能 在 Hibernate 中,`saveOrUpdate` 是一种灵活的方法,用于根据传入对象的状态自动决定是执行插入还是更新操作。以下是关于此方法的具体说明以及其实现方式: #### 自动判断逻辑 当调用 `saveOrUpdate` 方法时,Hibernate 会依据以下条件来决定执行的操作: - **未设置 ID 或者 ID 值为默认值(通常是 NULL 或 0)**:此时 Hibernate 认为此对象是一个新实体,因此会触发插入操作[^3]。 - **设置了有效的 ID 并且该 ID 对应的数据存在于数据库中**:此时 Hibernate 将认为这是一个已有的记录并尝试对其进行更新[^4]。 #### 示例代码展示 下面提供了一个具体的 Java 示例代码片段,演示如何利用 `saveOrUpdate` 来完成新增或更新的功能: ```java import org.hibernate.Session; import org.hibernate.Transaction; public class EmployeeManager { public static void saveOrUpdateEmployee(Session session, Employee employee) { Transaction tx = null; try { tx = session.beginTransaction(); // 利用 saveOrUpdate 方法进行保存或者更新 session.saveOrUpdate(employee); tx.commit(); // 提交事务 } catch (RuntimeException ex) { if (tx != null && tx.isActive()) { tx.rollback(); // 出错回滚 } throw ex; // 抛出异常供外部处理 } } public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); // 创建一个新的员工实例 Employee newEmployee = new Employee(); newEmployee.setEmpName("John Doe"); // 更新现有员工的信息 Employee existingEmployee = session.get(Employee.class, 21L); // 获取已有员工 if (existingEmployee != null) { existingEmployee.setEmpName("Jane Smith"); } // 调用统一的 saveOrUpdate 方法 saveOrUpdateEmployee(session, newEmployee); if (existingEmployee != null) { saveOrUpdateEmployee(session, existingEmployee); } session.close(); } } ``` #### 性能优化建议 对于大规模数据处理场景下,可以考虑采用批量更新的方式以提高效率。例如通过 HQL 查询语句来进行 bulk update 操作,这种方式能够显著减少与数据库之间的交互次数从而提升整体性能[^2]。 #### 注意事项 需要注意的是,在多线程环境下使用 `saveOrUpdate` 可能会引起并发问题。为了避免此类情况发生,可以通过加锁机制或者其他同步手段确保同一时间只有一个线程对相同资源进行写入操作[^5]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值