Hibernate 实现增删改查案例

Hibernate 实现增删改查案例

本案例使用的hibernate版本为  hibernate-release-5.2.10.Final 

为了测试,本案例在mysql数据库中创建了一个db数据库。

创建一个java项目:项目的结构如下:(lib文件夹用于存放jar包)


lib目录下则是hibernate5需要的jar包(注需要将jar加载到项目中:选中jar包右键 --》BuildPath--》Add to Build Path)

log4j.properties为日志配置文件(需要加载配置junit),此项目可以不需要日志,使用日志只是为了观察方便。
注:junit配置可以参考 http://blog.csdn.net/benxiaohai888/article/details/78231911

接下来是示例代码:

1、主配置文件 hibernate.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>
		<!-- 数据库URL -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db?characterEncoding=utf8</property>
		<!--数据库用户名, -->
		<property name="hibernate.connection.username">root</property>
		<!--数据库密码 -->
		<property name="hibernate.connection.password"></property>

		<!--配置二:数据库方言配置,配置数据库方言的作用是屏蔽数据库的差异,换句话说是使hibernate框架知道 要与哪种数据库取得联系 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

		<!--配置三:其它配置 (这些配置可选) -->

		<!-- 是否在控制台显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!--是否格式化删除sql语句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 自动生成数据表(数据表的生成方式) -->
		<property name="hbm2ddl.auto">update</property>
		<!-- 将session绑定到当前线程 -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 设置事务的隔离级别 -->
		<property name="hibernate.connection.isolation">4</property>

		<!-- 配置四:映射配置 -->
		<mapping resource="cn/sz/entity/User.hbm.xml" />
		<!-- 基于注解的配置方式 -->
		<!-- <mapping class="cn.sz.entity.Dept" /> -->
	</session-factory>
</hibernate-configuration>
	

2、工具类(获取Session)HibernateUtil.java

package cn.sz.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
	public static Session getSession() {
		Session session = null;
		// 创建一个读取主配置文件的对象
		Configuration cfg = new Configuration();
		// 读取主配置文件
		// cfg.configure("hibernate.cfg.xml");如果读取的主配置文件时默认的名字则可以省略参数
		cfg.configure();
		// 创建SessionFactory
		SessionFactory factory = cfg.buildSessionFactory();
		// 我们在主配置中已经将session绑定到线程中,所以可以从线程中取出session
		// 不从线程中取出session,则可以使用 factory.openSession(); 方式获得session
		session = factory.getCurrentSession();
		return session;
	}
}

3、定义方法接口 IUserDAO.java

package cn.sz.dao;
import java.util.List;
import cn.sz.entity.Page;
import cn.sz.entity.User;
public interface IUserDAO {
	// 添加用户方法
	public void add(User user);

	// 修改用户方法
	public void update(User user);

	// 删除用户方法
	public void delete(int uid);

	// 查询所有用户
	public List<User> queryAllUsers();

	// 根据id查询用户
	public User queryUserById(int uid);

	// 分页查看用户
	public List<User> queryUserPage(Page page);

}

4、接口的实现类 UserDAOImpl.java

package cn.sz.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import cn.sz.entity.Page;
import cn.sz.entity.User;
import cn.sz.utils.HibernateUtil;
public class UserDAOImpl implements IUserDAO {
	@Override
	public void add(User user) {
		// 获取session
		Session session = HibernateUtil.getSession();
		Transaction tr = null;
		try {
			// 开启事务
			tr = session.beginTransaction();
			// 调用添加方法
			session.save(user);
			// 提交
			tr.commit();
		} catch (Exception e) {
			// 异常则回滚
			tr.rollback();
			e.printStackTrace();
		} finally {
			// 关闭session
			session.close();
		}
	}

	@Override
	public void update(User user) {
		Session session = HibernateUtil.getSession();
		Transaction tr = null;
		try {
			tr = session.beginTransaction();
			// 调用修改方法
			session.update(user);
			tr.commit();
		} catch (Exception e) {
			tr.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@Override
	public void delete(int uid) {
		Session session = HibernateUtil.getSession();
		Transaction tr = null;
		try {
			tr = session.beginTransaction();
			// 先查询该用户信息
			User user = session.get(User.class, uid);
			// 然后调用删除方法
			session.delete(user);
			tr.commit();
		} catch (Exception e) {
			tr.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
	}

	@Override
	public List<User> queryAllUsers() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		// HQL查询方式 这里 User 表示的User类
		Query query = session.createQuery("from User");
		// 查询到一个List集合
		List<User> users = query.list();
		session.getTransaction().commit();
		session.close();
		return users;
	}

	@Override
	public User queryUserById(int uid) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		// 调用查询方法
		User user = session.get(User.class, uid);
		session.getTransaction().commit();
		session.close();
		return user;
	}

	@Override
	public List<User> queryUserPage(Page page) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		// 计算得到从那个位置开始查询
		int startRows = (page.getCurrentPage() - 1) * Page.PAGE_SIZE;
		Query query = session.createQuery("from User");
		// 设置开始查询的位置
		query.setFirstResult(startRows);
		// 设置每页查询几条数据
		query.setMaxResults(Page.PAGE_SIZE);
		// 查询结果为一个list集合
		List<User> users = query.list();
		session.getTransaction().commit();
		session.close();
		return users;
	}

}

5、用户实体类 User.java

package cn.sz.entity;

import java.io.Serializable;

public class User implements Serializable {
	private Integer uid;
	private String uname;

	public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

}

6、用户映射文件 User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package为实体类所在的包 -->
<hibernate-mapping package="cn.sz.entity">
	<!-- 实体类和哪个表对应 ;table用于配置实体类和表的对应;name用于配置哪个实体类和表对应 -->
	<class table="user" name="User">
		<!-- id用于配置主属性和主键字段对应;id的name用于配置属性名 ,column为对应字段名 -->
		<id name="uid" column="userid">
			<!-- 主键生成策略 -->
			<generator class="native"></generator>
		</id>
		<!-- property用于配置普通属性和字段的对应 -->
		<property name="uname" type="string" length="30"></property>
	</class>
</hibernate-mapping>

7、分页信息类 Page.java

package cn.sz.entity;

public class Page {
	// 每页显示的条数
	public static final int PAGE_SIZE = 2;
	// 当前页码
	private Integer currentPage;
	// 总的记录数
	private Integer counts;
	// 总的页数
	private Integer pageNums;
	// 开始从那一条数据开始查询
	private Integer startRows;

	public Integer getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}

	public Integer getCounts() {
		return counts;
	}

	public void setCounts(Integer counts) {
		this.counts = counts;
	}

	public Integer getPageNums() {
		return pageNums;
	}

	public void setPageNums(Integer pageNums) {
		this.pageNums = pageNums;
	}

	public Integer getStartRows() {
		return startRows;
	}

	public void setStartRows(Integer startRows) {
		this.startRows = startRows;
	}

}

8、测试类 UserTest.java

package cn.sz.test;
import java.util.List;
import org.junit.Test;
import cn.sz.dao.IUserDAO;
import cn.sz.dao.UserDAOImpl;
import cn.sz.entity.Page;
import cn.sz.entity.User;
public class UserTest {
	@Test
	// 测试添加用户方法
	public void testSave() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		User user = new User();
		user.setUname("张三");
		userDAOImpl.add(user);
	}

	@Test
	// 测试修改用户方法
	public void testUpdate() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		// 将id为1的用户姓名改为李四
		User user = new User();
		user.setUid(1);
		user.setUname("李四");
		userDAOImpl.update(user);
	}

	@Test
	// 测试删除用户方法
	public void testDelete() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		// 删除id为1的用户
		userDAOImpl.delete(1);
	}

	@Test
	// 测试查询所有用户方法
	public void testQueryAllUsers() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		List<User> users = userDAOImpl.queryAllUsers();
		for (User user : users) {
			System.out.println(user.getUid() + "," + user.getUname());
		}
	}

	@Test
	// 测试根据id查询用户方法
	public void testQueryUserById() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		User user = userDAOImpl.queryUserById(1);
		System.out.println(user.getUid() + "," + user.getUname());
	}

	@Test
	// 测试分页查看用户方法
	public void testQueryUserPage() {
		IUserDAO userDAOImpl = new UserDAOImpl();
		Page page = new Page();
		// 设置查询的是第一页
		page.setCurrentPage(1);
		List<User> users = userDAOImpl.queryUserPage(page);
		for (User user : users) {
			System.out.println(user.getUid() + "," + user.getUname());
		}
	}
}

9、日志文件log4j.properties

log4j.rootLogger=DEBUG,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.maxBackupIndex=100
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=c:/error1.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=1MB

下面是各个方法的运行截图:

 添加用户方法 add(User user)


 修改用户方法 update(User user)


为了后面的分页测试本人在数据库中多加了几条数据

 

删除用户方法 delete(int uid) id为1 的数据已经被删除


 查询所有用户方法 queryAllUsers()


根据id查询用户 方法queryUserById(int uid)


分页查看用户方法 queryUserPage(Page page)





  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值