分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

分享知识-快乐自己:搭建第一个 Hibernate (Demo)

发布时间:2023-09-06 02:15责任编辑:熊小新关键词:Hibernate

使用 Hibernate 完成持久化操作 七大 步骤:

1、读取并解析配置文件及映射文件:

  Configuration configuration=new Configuration().configure();

根据默认位置的 Hibernate 配置文件中的信息,构建 Configuration 对象。 Configuration 负责管理 Hibernate 的配置信息。

2、依据配置文件和映射文件中的信息,创建 SessionFactory 对象;

  SessionFactory sessionFactory=configuration.buildSessionFactory();

Configuration 对象会根据当前的数据库配置信息, 构造 SessionFactory 对象。SessionFactory 对象一旦构造完毕,Configuration 对象的任何变更不会影响已经创建的 SessionFactory 对象。

如果 Hibernate 配置信息有改动,那么需要基于改动后的 Configuration 对象重新构建一个 SessionFactory 对象。

3、打开 Session ;

  Session session=sessionFactory.getCurrentSession(); 或 sessionFactory.openSession();

SessionFactory 负责创建 Session 对象。Session 是持久化操作的基础。Session 作为贯穿 Hibernate 的持久化管理的核心,提拱了众多持久化方法,如 save()、delete()、update()、get()、load()等...

通过这些方法,即可透明地完成对象的 增删改查(CRUD)

4、开始一个事务;

  Tansaction tx = session.beginTansaction();

5、数据库操作;

  session.save();//保存操作

6、结束事务;

  tx.commit();//提交事务 或 回滚事务

7、如果是通过 SessionFactory 的 openSession() 方法获取的 Session 对象,则需要关闭 session。

  session.close();

提示:如果在 Hibernate 配置文件中将参数 current_session_context_class 设置为 thread,并采用 SessionFactory 的 getCurrentSession()方法 获得 Session 对象。

   则不需要执行 session.close() 方法,通过这种方式获得的Session 对象,会在关联的事务结束(提交或回滚)时自动关闭。

更新数据的方法:

1): update() 方法,用于将游离的对象恢复为持久状态,同时进行数据库更新操作。当参数对象的 OID 为 null 时会报错异常

2):saveOrUpdate()方法,同时包含了save()与update()方法的功能,如果入参是瞬时状态的对象,就调用 save()方法;如果入参是游离状态的对象,则调用update()方法。

3):merge()方法,能够把作为参数传入的游离状态对象的属性 复制到一个拥有相同 OID 的持久状态对象中,通过对持久状态的对象的脏检查实现更新操作,并返回该持久状态对象;

   如果无法从Session 缓存或数据库中加载到相应的持久状态对象,即传入的是瞬时对象,则创建其副本执行插入操作,并返回这一新的持久状态对象。无论何种情况,传入的对象状态都不受影响。

案例目录结构:

1):环境搭建前期准备:

目前以及后期需要的 JAR:

 ?<dependencies> ???<dependency> ?????<groupId>junit</groupId> ?????<artifactId>junit</artifactId> ?????<version>4.3</version> ???</dependency> ???<!-- 添加Hibernate依赖 --> ???<dependency> ?????<groupId>org.hibernate</groupId> ?????<artifactId>hibernate-core</artifactId> ?????<version>3.6.10.Final</version> ???</dependency> ???<!-- 添加Log4J依赖 --> ???<dependency> ?????<groupId>log4j</groupId> ?????<artifactId>log4j</artifactId> ?????<version>1.2.16</version> ???</dependency> ???<dependency> ?????<groupId>org.slf4j</groupId> ?????<artifactId>slf4j-nop</artifactId> ?????<version>1.6.4</version> ???</dependency> ???<!-- 添加javassist --> ???<dependency> ?????<groupId>javassist</groupId> ?????<artifactId>javassist</artifactId> ?????<version>3.12.0.GA</version> ???</dependency> ???<dependency> ?????<groupId>org.hibernate.javax.persistence</groupId> ?????<artifactId>hibernate-jpa-2.0-api</artifactId> ?????<version>1.0.1.Final</version> ???</dependency> ???<dependency> ?????<groupId>javax.transaction</groupId> ?????<artifactId>jta</artifactId> ?????<version>1.1</version> ???</dependency> ???<!-- mysql数据库的驱动包 --> ???<dependency> ?????<groupId>mysql</groupId> ?????<artifactId>mysql-connector-java</artifactId> ?????<version>5.1.6</version> ???</dependency> ?</dependencies> ?<build> ???<!-- ?加载我们的各种hbm.xml文件,如果hbm.xml文件在resources文件夹下面就不需要了--> ???<resources> ?????<resource> ???????<directory>src/main/java</directory> ???????<includes> ?????????<include>**/*.xml</include> ???????</includes> ?????</resource> ???</resources> ?</build>

配置核心配置文件:hibernate.cfg.xml (必须以 .cfg.xml 为后缀)

<?xml version="1.0" encoding="UTF-8"?><!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.connection.driver_class">com.mysql.jdbc.Driver</property> ???????<property name="hibernate.connection.url">jdbc:mysql://39.105.105.186:3306/MyBatisCode?useUnicode=true&amp;characterEncoding=UTF-8</property> ???????<property name="hibernate.connection.username">root</property> ???????<property name="hibernate.connection.password">root</property> ???????<!--是否显示底层生成的sql语句--> ???????<property name="hibernate.show_sql">true</property> ???????<!--是否格式化sql语句--> ???????<property name="hibernate.format_sql">true</property> ???????<!--方言设置--> ???????<!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar--> ???????<property name="dialect">org.hibernate.dialect.MySQLDialect</property> ???????<!--当前会话上下文--> ???????<property name="current_session_context_class">thread</property> ???????<!--hbm2ddl ??就是把xx.hbm.xml文件中的配置生成数据库中DDL(数据定义语言) ???????create: ?每次运行都会删除 上次生成的表,还会创建新的! ???????update: 没有表会自动创建,有表就增加数据! ???????validate: 如果hbm文件和数据库中的字段对应 就会新增, ?????????????????否则抛出异常! ??????create-drop: ?每次运行都会删除 上次生成的表,前提是sessionFactory关闭 ???????--> ???????<property name="hbm2ddl.auto">update</property> ???????<!--加载需要的hbm.xml映射文件--> ???????<mapping resource="mapping/user.hbm.xml"/> ???</session-factory></hibernate-configuration>

编写映射文件 user.hbm.xml (必须以 .hbm.xml 为后缀)

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC ???????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ???????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!--package: 需要映射的实体类所在包class节点:name:对应的是实体类的类名,如果没有书写package,则必须是完整限定类名table:数据库中的表名,如果表名和实体类名一致,可以省略id节点:表中的主键generator:主键生成策略 ,主键由谁去创建?程序猿?Hibernate?数据库name: ?必须和实体类中的属性名一致column : 必须和数据库中的列名一致,如果列名和属性名一致,可以省略--><!--dynamic-update="false":默认非动态更新--><hibernate-mapping package="com.mlq.bena"> ???<class name="com.mlq.bena.User" table="`user`" dynamic-update="true"> ???????<id name="uId" column="uId"> ???????????<!--<generator />&lt;!&ndash;主键生成策略&ndash;&gt;--> ???????????<generator ></generator> ???????</id> ???????<property name="userName" column="userName"/> ???????<property name="userPwd" column="userPwd"/> ???????<property name="realName" column="realName"/> ???</class></hibernate-mapping><!--Oracle序列增长--><!--<generator >--><!--<param name="squence">SEQ_DEPTNO</param>--><!--</generator>--><!--数据库中查询最大值+1--><!--<generator ></generator>--><!--没有制定使用那种方式:需要结合数据库方言自增--><!--<generator ></generator>--><!--uuid:生成32位字符串--><!--<generator ></generator>-->

User 实体类:

package com.mlq.bena;import java.io.Serializable;public class User implements Serializable { ???private Integer uId; ???private String userName; ???private String userPwd; ???private String realName; ???@Override ???public String toString() { ???????return "User{" + ???????????????"u, userName=‘" + userName + ‘\‘‘ + ???????????????", userPwd=‘" + userPwd + ‘\‘‘ + ???????????????", realName=‘" + realName + ‘\‘‘ + ???????????????‘}‘; ???} ???public Integer getuId() { ???????return uId; ???} ???public void setuId(Integer uId) { ???????this.uId = uId; ???} ???public String getUserName() { ???????return userName; ???} ???public void setUserName(String userName) { ???????this.userName = userName; ???} ???public String getUserPwd() { ???????return userPwd; ???} ???public void setUserPwd(String userPwd) { ???????this.userPwd = userPwd; ???} ???public String getRealName() { ???????return realName; ???} ???public void setRealName(String realName) { ???????this.realName = realName; ???}}

BaseDao 层:

package com.mlq.bena;import com.mlq.uitl.SessionTool;import org.hibernate.Session;/** * 获取连接的提升封装 * @author asus */public class BaseDao { ???public Session getSession() ???{ ???????return SessionTool.getSession(); ???}}

mapper 层:

package com.mlq.mapper;import com.mlq.bena.User;import javax.jws.soap.SOAPBinding;import java.io.Serializable;/** * @author asus */public interface UserMapper { ???/** ????* 添加方法 ????* @param user ????*/ ???public void addUser(User user); ???/** ????* 根据Id查询 ????* @param id ????* @return ????*/ ???public User getUser(Serializable id); ???/** ????* 根据Id查询 ????* @param id ????* @return ????*/ ???public User loadUser(Serializable id); ???/** ????* 修改用户信息:非动态更新 ????* 指的是在 映射文件中修改:dynamic-update="false":默认非动态更新 ????* @param user ????*/ ???public void updateUser(User user); ???/** ????* 修改用户信息:动态更新 ????* 指的是在 映射文件中修改:dynamic-update="false":默认非动态更新 ????* @param user ????*/ ???public void mergeUser(User user); ???/** ????* 删除用户信息:需要首先调用查询方法 ????* @param id ????*/ ???public void delUser(Serializable id); ???/** ????* 删除用户信息:根据自己定义的对象信息删除 ????* @param user ????*/ ???public void delUser1(User user); ???/** ????* 当传递的 user 主键不生效的时便执行save方法 ????* @param user ????*/ ???public void saveUpdate(User user); ???/** ????* 可以实现更新 也可以实现 save保存 同样根据主键是否有效 ????* 当主键不生效的时候变执行的是 save保存 ????* @param user ????* @return ????*/ ???public User testMerge(User user);}

mapperImpl:

package com.mlq.mapper;import com.mlq.bena.BaseDao;import com.mlq.bena.User;import com.mlq.uitl.SessionTool;import org.hibernate.Session;import java.io.Serializable;/** * @author asus */public class UserMapperImpl extends BaseDao implements UserMapper { ???private Session session=null; ???@Override ???public void addUser(User user) { ???????session= super.getSession(); ???????session.save(user); ???} ???@Override ???public User getUser(Serializable id) { ???????session= super.getSession(); ???????return (User) session.get(User.class,id); ???} ???@Override ???public User loadUser(Serializable id) { ???????session= super.getSession(); ???????return (User) session.load(User.class,id); ???} ???@Override ???public void updateUser(User user) { ???????session= super.getSession(); ???????session.update(user); ???} ???@Override ???public void mergeUser(User user) { ???????session= super.getSession(); ???????session.merge(user); ???} ???@Override ???public void delUser(Serializable id) { ???????session= super.getSession(); ???????session.delete(this.loadUser(id)); ???} ???@Override ???public void delUser1(User user) { ???????session= super.getSession(); ???????session.delete(user); ???} ???@Override ???public void saveUpdate(User user) { ???????session= super.getSession(); ???????session.saveOrUpdate(user); ???} ???@Override ???public User testMerge(User user) { ???????session= super.getSession(); ???????User merge = (User)session.merge(user); ???????return merge; ???}}

service 层:

package com.mlq.seivice;import com.mlq.bena.User;import java.io.Serializable;/** * @author asus */public interface UserService { ???/** ????* 添加方法 ????* @param user ????*/ ???public void addUser(User user); ???/** ????* 根据Id查询 ????* @param id ????* @return ????*/ ???public User getUser(Serializable id); ???/** ????* 根据Id查询 ????* @param id ????* @return ????*/ ???public User loadUser(Serializable id); ???/** ????* 数据更新 ????* @param user ????*/ ???public void updUser(User user); ???/** ????* 非动态更新数据,会给所有字段赋值 ????* 指的是在 映射文件中修改:dynamic-update="false":默认非动态更新 ????* @param user ????*/ ???public void updateUser(User user); ???/** ????* 修改用户信息:动态更新 ????* 指的是在 映射文件中修改:dynamic-update="false":默认非动态更新 ????* @param user ????*/ ???public void mergeUser(User user); ???/** ????* 删除用户信息:需要首先调用查询方法 ????* @param id ????*/ ???public int delUser(Serializable id); ???/** ????* 删除用户信息:根据自己定义的对象信息删除 ????* @param user ????*/ ???public int delUser1(User user); ???/** ????* 当传递的 user 主键不生效的时便执行save方法 ????* @param user ????*/ ???public void saveUpdate(User user); ???/** ????* 可以实现实现 更新 也可以实现 save保存 同样根据主键是否有效 ????* @param user ????* @return ????*/ ???public User testMerge(User user);}

service impl:

package com.mlq.seivice.impl;import com.mlq.bena.User;import com.mlq.mapper.UserMapper;import com.mlq.mapper.UserMapperImpl;import com.mlq.seivice.UserService;import com.mlq.uitl.SessionTool;import com.sun.xml.internal.ws.handler.HandlerException;import org.hibernate.Transaction;import java.io.Serializable;/** * 实现数据查询 * @author asus */public class UserServiceImpl implements UserService { ???Transaction transaction=null; ???private UserMapperImpl userMapper=null; ???@Override ???public void addUser(User user) { ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.addUser(user); ???????????transaction.commit(); ???????}catch (HandlerException e) ???????{ ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???} ???@Override ???public User getUser(Serializable id) { ???????User user=null; ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????user = userMapper.getUser(id); ???????????transaction.commit(); ???????}catch (HandlerException e) ???????{ ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???????return user; ???} ???@Override ???public User loadUser(Serializable id) { ???????User user=null; ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????user = userMapper.loadUser(id); ???????????System.out.println(user+"-----------"); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???????return user; ???} ???@Override ???public void updUser(User user) { ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????User info = userMapper.loadUser(user.getuId()); ???????????info.setUserName(user.getUserName()); ???????????info.setUserPwd(user.getUserPwd()); ???????????info.setRealName(user.getRealName()); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???} ???@Override ???public void updateUser(User user) { ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.updateUser(user); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???} ???@Override ???public void mergeUser(User user) { ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.mergeUser(user); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???} ???@Override ???public int delUser(Serializable id) { ???????int count=0; ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.delUser(id); ???????????transaction.commit(); ???????????count= 1; ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????count=0; ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???????return count; ???} ???@Override ???public int delUser1(User user) { ???????int count=0; ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.delUser1(user); ???????????transaction.commit(); ???????????count= 1; ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????count=0; ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???????return count; ???} ???@Override ???public void saveUpdate(User user) { ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????userMapper.saveUpdate(user); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???} ???@Override ???public User testMerge(User user) { ???????User user1=null; ???????try{ ???????????userMapper=new UserMapperImpl(); ???????????transaction=userMapper.getSession().beginTransaction(); ???????????user1 = userMapper.testMerge(user); ???????????transaction.commit(); ???????}catch (Exception e) ???????{ ???????????System.out.println("相爱相杀一场!!!"); ???????????e.printStackTrace(); ???????????transaction.rollback(); ???????} ???????return user1; ???}}

uitl 获取连接工具类:

package com.mlq.uitl;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/** * 读取配置信息 */public class SessionTool { ???private static SessionFactory sessionFactory=null; ???private static Configuration configuration=null; ???static ???{ ???????System.out.println("静态代码块------"); ???????configuration=new Configuration().configure(); ???????sessionFactory=configuration.buildSessionFactory(); ???} ???public static Session getSession() ???{ ???????return sessionFactory.getCurrentSession(); ???}}

测试类:

package com.mlq;import com.mlq.bena.User;import com.mlq.seivice.impl.UserServiceImpl;import org.junit.Test;/** * 提取工具类的测试 */public class HibernateDemo { ???/** ????* get()查询 ????*/ ???@Test ???public void getUser() { ???????User user = new UserServiceImpl().getUser(42183); ???????System.out.println(user); ???} ???/** ????* load()查询 ????*/ ???@Test ???public void loadUser() { ??????new UserServiceImpl().loadUser(42); ???} ???/** ????* 更新操作 ????*/ ???@Test ???public void updUser() ???{ ???????User user=new User(); ???????user.setuId(42183); ???????user.setUserName("aaa"); ???????user.setUserPwd("bbb"); ???????user.setRealName("vvv"); ???????new UserServiceImpl().updUser(user); ???} ???//------------------动态与非动态注意查看 控制台打印的 SQL-------------------------------// ???/** ????* 更新操作:非动态更新 ????*/ ???@Test ???public void updatedUser() ???{ ???????User user=new User(); ???????user.setuId(42183); ???????user.setUserName("aaa"); ???????user.setUserPwd("bcb"); ???????user.setRealName("vbv"); ???????new UserServiceImpl().updateUser(user); ???} ???/** ????* 更新操作2:动态更新 ????*/ ???@Test ???public void mergeUser() ???{ ???????User user=new User(); ???????user.setuId(42184); ???????user.setUserName("aaa"); ???????user.setUserPwd("bcb"); ???????user.setRealName("vbbbv"); ???????new UserServiceImpl().mergeUser(user); ???} ???/** ????* 删除用户信息:需要根据查询来获取用户对象 然后删除 ????*/ ???@Test ???public void deleteUser() ???{ ???????int i = new UserServiceImpl().delUser(43420); ???????System.out.println((i>0)?"删除成功":"删除失败"); ???} ???/** ????* 删除用户信息:根据自己定义的对象删除 ????*/ ???@Test ???public void deleteUser1() ???{ ???????User user=new User(); ???????user.setuId(43417); ???????int i = new UserServiceImpl().delUser1(user); ???????System.out.println((i>0)?"删除成功":"删除失败"); ???} ???//当传递的 user 主键不生效的时便执行save方法 ???@Test ???public void saveUpdate() ???{ ???????User user=new User(); ???????user.setuId(42183); ???????user.setUserName("修改了"); ???????new UserServiceImpl().saveUpdate(user);//执行了Update方法更新 ???} ???//当传递的 user 主键不生效的时便执行save方法 ???@Test ???public void saveUpdate1() ???{ ???????User user=new User(); ???????user.setUserName("修改了"); ???????new UserServiceImpl().saveUpdate(user);//执行了save方法更新 ???} ???//当传递的 user 主键不生效的时便执行save方法,否则施行更新 ???@Test ???public void textMerge() ???{ ???????User user=new User(); ???????user.setUserName("Merge正在执行保存!!!"); ???????User user1 = new UserServiceImpl().testMerge(user);//执行了save方法更新 ???????System.out.println(user1); ???} ???@Test ???public void textMerge1() ???{ ???????User user=new User(); ???????user.setuId(42183); ???????user.setUserName("原来的模样"); ???????User user1 = new UserServiceImpl().testMerge(user);//执行了更新方法更新 ???????System.out.println(user1); ???}}

分享知识-快乐自己:搭建第一个 Hibernate (Demo)

原文地址:https://www.cnblogs.com/mlq2017/p/9675271.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved