目的:
掌握Hibernate的主要接口使用;
掌握设计持久化接口的基本方法;
熟悉提高Hibernate使用性能的方法;
内容:
使用Hibernate设计通用接口实现对Java对象进行增查改删(CRUD)的工作;
具体要求:实现CRUD接口具有通用性;可以在已有项
目中增加相应接口;提前设计好,最后一次实验演示,
并提交相关代码及本次实验报告。
设备及软件环境:
Myeclipes2014,Mysql
JDK1.8,hibernate5.2.10
过程及结果:
package org.lqz.sale.dao.impl;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.lqz.sale.dao.BaseDao;
import org.lqz.sale.utils.Page;
public class BaseDaoImpl implements BaseDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession() {
return sessionFactory.getCurrentSession();
}
// 带条件查询
public <T> List<T> find(String hql, Class<T> entityClass, Object[] params) {
Query query = this.getSession().createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
return (List<T>) query.list();
}
// 获取一条,根据主键id
public <T> T get(Class<T> entityClass, Serializable id) {
return (T) this.getSession().get(entityClass, id);
}
// 分页查询,查询两次,一次查询总数,一次查询分页记录
public <T> Page<T> findPage(String hql, Page<T> page, Class<T> entityClass, Object[] params) {
Query query = this.getSession().createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
// 查询一次,获取记录总数
int count = query.list().size(); // 可以优化???? "select count(*) " +hql
page.setTotalRecord(count);
// 设置分页
query.setFirstResult((page.getPageNo() - 1) * page.getPageSize()); // 设置开始位置
query.setMaxResults(page.getPageSize()); // 设置获取几条
page.setResults((List<T>) query.list());
return page;
}
// 新增和修改,hibernate根据id是否为null自动判断
public <T> void saveOrUpdate(T entity) {
this.getSession().saveOrUpdate(entity);
}
// 集合保存,这时新增还是修改,就自动判断,调用时是否简洁。适合批量新增和修改时。(Mrecord控件)
public <T> void saveOrUpdateAll(Collection<T> entitys) {
for (T entity : entitys) {
this.saveOrUpdate(entity);// 为什么hibernate批量操作时,要用循环一条一条记录去更新?
}
}
// 按主键id删除
public <T> void deleteById(Class<T> entityClass, Serializable id) {
this.getSession().delete(get(entityClass, id));
}
// 批量删除
public <T> void delete(Class<T> entityClass, Serializable[] ids) {
for (Serializable s : ids) {
deleteById(entityClass, s);
}
}
}
package org.lqz.sale.dao;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.lqz.sale.utils.Page;
public interface BaseDao {
// 查询所有,带条件查询
public <T> List<T> find(String hql, Class<T> entityClass, Object[] params);
// 获取一条记录
public <T> T get(Class<T> entityClass, Serializable id);
// 分页查询,将数据封装到一个page分页工具类对象
public <T> Page<T> findPage(String hql, Page<T> page, Class<T> entityClass, Object[] params);
// 新增和修改保存
public <T> void saveOrUpdate(T entity);
// 批量新增和修改保存
public <T> void saveOrUpdateAll(Collection<T> entitys);
// 单条删除,按id
public <T> void deleteById(Class<T> entityClass, Serializable id);
// 批量删除
public <T> void delete(Class<T> entityClass, Serializable[] ids);
}
package org.lqz.sale.domain;
import java.io.Serializable;
import java.util.Set;
/**
* 分类
*
*/
public class Category implements Serializable {
private Set<Good> goods; // 分类对商品 一对多
private String id;
private String name;// 分类名
private int delFlag;// 删除标识{1表示已删除,0表示未删除}
@Override
public String toString() {
return "Category [id=" + id + ", name=" + name + ", delFlag=" + delFlag + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDelFlag() {
return delFlag;
}
public void setDelFlag(int delFlag) {
this.delFlag = delFlag;
}
public Set<Good> getGoods() {
return goods;
}
public void setGoods(Set<Good> goods) {
this.goods = goods;
}
}
package org.lqz.sale.domain;
import java.io.Serializable;
import java.util.Set;
/**
* 销售订单表
*
*
*/
public class Sale implements Serializable {
private Set<SaleGoods> saleGoods; // 销售单对销售货物, 一对多
private User handler; // 销售单对经手人, 多对一
private String id;// 订单id
private Integer delFlag;// 删除标识{1表示已删除,0表示未删除}
@Override
public String toString() {
return "Sale [handler=" + handler + ", id=" + id + ", delFlag=" + delFlag + "]";
}
public Set<SaleGoods> getSaleGoods() {
return saleGoods;
}
public void setSaleGoods(Set<SaleGoods> saleGoods) {
this.saleGoods = saleGoods;
}
public User getHandler() {
return handler;
}
public void setHandler(User handler) {
this.handler = handler;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getDelFlag() {
return delFlag;
}
public void setDelFlag(Integer delFlag) {
this.delFlag = delFlag;
}
}
package org.lqz.sale.domain;
import java.io.Serializable;
import java.util.Set;
/**
* 出入库订单表
*
*
*/
public class Stock implements Serializable {
private Set<StockGoods> stockGoods; // 出入库与货物 一对多
private User handler;// 经手人
private String id;
private int sign;// 出入库标识{0表示入库,1表示出库}
private int delFlag;// 删除标识{1表示已删除,0表示未删除}
public Set<StockGoods> getStockGoods() {
return stockGoods;
}
public void setStockGoods(Set<StockGoods> stockGoods) {
this.stockGoods = stockGoods;
}
public User getHandler() {
return handler;
}
public void setHandler(User handler) {
this.handler = handler;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getSign() {
return sign;
}
public void setSign(int sign) {
this.sign = sign;
}
public int getDelFlag() {
return delFlag;
}
public void setDelFlag(int delFlag) {
this.delFlag = delFlag;
}
}
package org.lqz.sale.domain;
import java.io.Serializable;
import java.util.Set;
/**
* 用户
*
*
*/
public class User implements Serializable {
private Set<Stock> stocks; // 用户与出入库 一对多
private Set<Sale> sales;// 用户与销售 一对多
private Role role;
private String id;
private String name;
private String password;
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
}
public Set<Stock> getStocks() {
return stocks;
}
public void setStocks(Set<Stock> stocks) {
this.stocks = stocks;
}
public Set<Sale> getSales() {
return sales;
}
public void setSales(Set<Sale> sales) {
this.sales = sales;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lqz.sale.domain">
<class name="Category" table="category" dynamic-insert="true" dynamic-update="true">
<id name="id" column="category_id">
<generator class="uuid" />
</id>
<property name="name" column="name" />
<property name="delFlag" column="del_flag" />
<!-- 分类对商品 一对多 -->
<set name="goods" cascade="all" inverse="true">
<key column="category_id"></key>
<one-to-many class="Good" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lqz.sale.domain">
<class name="Role" table="role" dynamic-insert="true" dynamic-update="true">
<id name="id" column="id">
<generator class="uuid" />
</id>
<property name="name" column="name" />
<!-- 角色与用户 一对多 -->
<set name="users" cascade="all" inverse="true">
<key column="role_id"></key>
<one-to-many class="User" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lqz.sale.domain">
<class name="Sale" table="sale" dynamic-insert="true" dynamic-update="true">
<id name="id" column="sale_id">
<generator class="uuid" />
</id>
<property name="delFlag" column="del_flag" />
<!-- 销售单对销售货物, 一对多 -->
<set name="saleGoods" cascade="all-delete-orphan" inverse="true">
<key column="sale_id"></key>
<one-to-many class="SaleGoods" />
</set>
<!-- 销售单对经手人, 多对一 -->
<many-to-one name="handler" class="User" column="handler_id" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lqz.sale.domain">
<class name="Stock" table="stock" dynamic-insert="true"dynamic-update="true">
<id name="id" column="stock_id">
<generator class="uuid" />
</id>
<property name="sign" column="sign" />
<property name="delFlag" column="del_flag" />
<!-- 出入库与货物 一对多 -->
<set name="stockGoods" cascade="all-delete-orphan" inverse="true">
<key column="stock_id"></key>
<one-to-many class="StockGoods" />
</set>
<!-- 出入库订单表对经手人, 多对一 -->
<many-to-one name="handler" class="User" column="handler_id" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lqz.sale.domain">
<class name="User" table="user" dynamic-insert="true" dynamic-update="true">
<id name="id" column="user_id">
<generator class="uuid" />
</id>
<property name="name" column="name" />
<property name="password" column="password" />
<many-to-one name="role" class="Role" column="role_id"></many-to-one>
<!-- 用户与出入库 一对多 -->
<set name="stocks" cascade="all" inverse="true">
<key column="handler_id"></key>
<one-to-many class="Stock" />
</set>
<!-- 用户与出销售 一对多 -->
<set name="sales" cascade="all" inverse="true">
<key column="handler_id"></key>
<one-to-many class="Sale" />
</set>
</class>
</hibernate-mapping>
<?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.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">false</property>
<property name="format_sql">false</property>
<property name="hbm2ddl.auto">update</property><!-- none、update -->
<!-- 懒加载,配合web.xml中配置的 openSessionInViewFilter -->
<property name="hibernate.enable_lazy_load_no_trans">true</property>
<!--校验模式 JPA java persistent api-->
<property name="javax.persistence.validation.mode">none</property>
<mapping resource="org/lqz/sale/domain/Category.hbm.xml" />
<mapping resource="org/lqz/sale/domain/Good.hbm.xml" />
<mapping resource="org/lqz/sale/domain/Sale.hbm.xml" />
<mapping resource="org/lqz/sale/domain/SaleGoods.hbm.xml" />
<mapping resource="org/lqz/sale/domain/Stock.hbm.xml" />
<mapping resource="org/lqz/sale/domain/StockGoods.hbm.xml" />
<mapping resource="org/lqz/sale/domain/User.hbm.xml" />
<mapping resource="org/lqz/sale/domain/Warehouse.hbm.xml" />
<mapping resource="org/lqz/sale/domain/Role.hbm.xml"/>
</session-factory>
</hibernate-configuration>
总结:
本次内容让我们使用Hibernate进行数据库操作,运用hibernate技术进行数据库增删查改的四种操作,更加熟悉hibernate的原理与应用。