Hibernate 应知应会
Hibernate 的关联关系的配置:
一对一外键约束:
举例子是一个丈夫和妻子:【一个丈夫只能有一位妻子】
表结构:
CREATE TABLE `tbl_hus` (
`uuid` bigint(10) NOT NULL auto_increment,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `tbl_wife` (
`uuid` bigint(10) NOT NULL auto_increment,
`name` varchar(30) NOT NULL,
`husUuid` bigint(10) NOT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
妻子表中有个外键,是丈夫的 uuid,所以称丈夫类为主方,妻子类为从放。
在 Model 中:
下面是我实现的 Hibernate 的 Dao 层:
Spring 为整合 Hibernate3 提供了两个工具类,分别是 HibernateTemplate 和 HibernateDaoSupport ,但是 Spring 不推荐使用这两个实现 Dao 层,因为操作复杂 CRUD 不是很灵活,而是推荐使用通过注入 SessionFactory 的方式,用过 getCurrentSession() 获取当前线程的 Session 对象,然后进行持久化。
下面是我在自己练手项目中实现的 dao 模块的一部分:
1 . Dao层的顶层接口类:
package dao; import java.io.Serializable;
import java.util.List; /**
* Dao层的顶层接口
*
* @author 码上猿梦
* http://www.cnblogs.com/daimajun/
* @param <T>
*/
public interface BaseDao<T> {
/**
* 根据类和主键值获取一个实体对象
* @return
*/
T get(Class<T> entityClazz, Serializable id); /**
* 根据实体对象保存数据
* @param entity
* @return
*/
Serializable save(T entity); /**
* 根据实体对象更新数据
* @param eneity
*/
void update(T eneity); /**
* 根据实体对象删除数据
* @param entity
*/
void delete(T entity); /**
* 根据实体类型和主键id删除数据
* @param entityClazz
* @param id
*/
void deleteById(Class<T> entityClazz,Serializable id); /**
* 根据实体类型获取其所有对象,并封装为List集合
* @param entityClazz
* @return
*/
List<T> findAll(Class<T> entityClazz); /**
* 根据实体类获取对象总数
* @param entityClazz
* @return
*/
Long findCount(Class<T> entityClazz);
}
2 . Dao层的空实现类:【用于注入 SessionFactory】
package dao.impl; import java.io.Serializable;
import java.util.List; import org.hibernate.SessionFactory; import dao.BaseDao; /**
* BaseDao的空实现
* 用于注入SessionFactory
*
* @author 码上猿梦
* http://www.cnblogs.com/daimajun/
* @param <T>
*/
public class BaseDaoEmptyImpl<T> implements BaseDao<T> { /**
* 会话工厂
*/
private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {
return sessionFactory;
} /**
* 注入SessionFactory
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} @Override
public T get(Class<T> entityClazz, Serializable id) {
return null;
} @Override
public Serializable save(T entity) {
return null;
} @Override
public void update(T eneity) { } @Override
public void delete(T entity) { } @Override
public void deleteById(Class<T> entityClazz, Serializable id) { } @Override
public List<T> findAll(Class<T> entityClazz) {
return null;
} @Override
public Long findCount(Class<T> entityClazz) {
return null;
}
}
3 . Dao层实现类:
package dao.impl; import java.io.Serializable;
import java.util.List; import org.hibernate.Query; /**
* Dao层的实现类
*
* @author 码上猿梦
* http://www.cnblogs.com/daimajun/
* @param <T>
*/
public class BaseDaoImpl<T> extends BaseDaoEmptyImpl<T> { @Override
public T get(Class<T> entityClazz, Serializable id) {
return this.getSessionFactory().getCurrentSession().get(entityClazz, id);
} @Override
public Serializable save(T entity) {
return getSessionFactory().getCurrentSession().save(entity);
} @Override
public void update(T eneity) {
getSessionFactory().getCurrentSession().saveOrUpdate(eneity);
} @Override
public void delete(T entity) {
getSessionFactory().getCurrentSession().delete(entity);
} @Override
public void deleteById(Class<T> entityClazz, Serializable id) {
this.getSessionFactory().getCurrentSession()
.createQuery("delete" + entityClazz.getSimpleName() + "en where en.id = ?0")
.setParameter(0, id)
.executeUpdate();
} @Override
public List<T> findAll(Class<T> entityClazz) {
return find("select * en from" + entityClazz.getSimpleName() + "en");
} /**
*
*/
@Override
public Long findCount(Class<T> entityClazz) {
List<T> list = find("select" + entityClazz.getFields()[0].toString() + "from" + entityClazz.getSimpleName() + "en");
if (null!=list && list.size()==1 ) {
return (Long)list.get(0);
}
return 0L;
} /**
* 根据Hql语句查询
* @param Hql
* @return
*/
@SuppressWarnings("unchecked")
protected List<T> find(String Hql) {
List<T> list = getSessionFactory().getCurrentSession().createQuery(Hql).list();
return list;
} /**
* 根据带参数的Hql语句查询数据
* @param Hql
* @param params
* @return
*/
@SuppressWarnings("unchecked")
protected List<T> find(String Hql,Object...params) {
Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
for (int i = 0; i < params.length; i++) {
query.setParameter(i + "", params[i]);
}
return query.list();
} /**
* 使用Hql语句,执行分页查询
* @param hql
* @param pageNo 当前页码
* @param pageSize 每页大小
* @return
*/
@SuppressWarnings("unchecked")
protected List<T> findByPage(String hql, int pageNo, int pageSize) {
Query query = getSessionFactory().getCurrentSession().createQuery(hql);
query.setFirstResult((pageNo-1) * pageSize).setMaxResults(pageSize);
return query.list();
} /**
* 使用带参的Hql语句,进行分页查询
* @param Hql
* @param pageNo 当前页码
* @param pageSize 每页大小
* @param params
* @return
*/
@SuppressWarnings("unchecked")
protected List<T> findByPage(String Hql, int pageNo, int pageSize, Object...params) {
Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
query.setFirstResult(pageNo).setMaxResults(pageSize);
return query.list();
}
}
代码思路来源于【轻量级JavaEE 企业级应用实战第4版 Struts2 + Spring + Hibernate 整合开发】。
Hibernate 应知应会的更多相关文章
- 测试TwemProxy的应知应会
一.背景 最近中间件开发组对twemproxy的发现注册机制做了改造,之前没有接触过twemproxy,借这次测试的机会,初步学习了一下twemproxy相关的知识:下面用"测试语言&quo ...
- SpringMVC 应知应会
springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...
- Markdown的应知应会
Markdown介绍 什么是Markdown Markdown是一种纯文本.轻量级的标记语言,常用作文本编辑器使用.和记事本.notepad++相比,Markdown可以进行排版:和Word相比,Ma ...
- Linux用户应知应会的7个‘ls’命令的独特技巧
在前面我们系列报道的两篇文章中,我们已经涵盖了关于‘ls’命令的绝大多数内容.本文时‘ls命令’系列的最后一部分.如果你还没有读过该系列的其它两篇文章,你可以访问下面的链接. Linux中的15个基本 ...
- 【应知应会】15个常用的JavaScript字符串操作方法
1 初始化 //常用初始化方法 var stringVal = "hello iFat3"; //构造函数创建方法 var stringObj = new String(" ...
- Struts2 应知应会
struts.xml 文件的 action 的配置: Struts2 中结果类型的配置来自于下面: 其中: dispatcher:转发技术,转发到一个 jsp 视图 redirect:重定向到一个 j ...
- .NET架构开发应知应会
.NET程序是基于.NET framework..NET Core.Mono.UWP[.NET实现]开发和运行的 ,定义以上[.NET实现]的标准规范称为.NET Standard L1:.NET S ...
- Java 多线程应知应会
请简单说说 synchronized 关键字的底层原理 java 说到多线程绝对绕不开 synchronized,很多 java 工程师对 synchronized 是又爱又恨.为什么呢?主要原因包括 ...
- 关于HDFS应知应会的N个问题 | 技术点
1. Namenode的安全模式 ? 安全模式是Namenode的一种状态(Namenode主要有active/standby/safemode三种模式). 2. 哪些情况下,Namenode会进入安 ...
随机推荐
- SDR软件无线电知识要点(一)噪声系数与噪声因子
SDR软件无线电知识要点(一)噪声系数与噪声因子 信号质量如何评估 Noise Figure (NF) or sensitivity and Error Vector Magnitude (EVM) ...
- 并查集(模板&典型例题整理)
参考:https://blog.csdn.net/oliver233/article/details/70162173 带路径压缩模板: #include<stdio.h> ]; int ...
- 20155230 2016-2017-2《Java程序设计》第二周学习总结
20155230 2016-2017-2 <Java程序设计>第er周学习总结 教材学习内容总结 JAVA编程风格 1.命名变量时不可以使用数字及特殊字符作为开头. 2.变量名称不可以与J ...
- 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD
20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...
- 20145207 2016-2017-2 《Java程序设计》第4周学习总结
一.继承与多态 1.继承的定义 面对对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,滥用而继承会导致程序维护上的问题. 程序代码重复在程序设计上就是不好的信号,多个类 ...
- WPF GDI+字符串绘制成图片(一)
原文:WPF GDI+字符串绘制成图片(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...
- JDK1.7的HashMap的put(key, value)源码剖析
目录 HashMap的put操作源码解析 1.官方文档 2.put(key, value) 3.完结 HashMap的put操作源码解析 1.官方文档 1.1.继承结构 java.lang.Objec ...
- [BZOJ1857][SCOI2010]传送带-[三分]
Description 传送门 Solution 三分套三分.代码简单但是证明苦兮兮.. 假如我们在AB上选了一个点G,求到该点到D的最小时间. 图中b与CD垂直.设目前从G到D所耗时间最短的路径为G ...
- OpenCV人脸识别的原理 .
OpenCV人脸识别的原理 . 在之前讲到的人脸测试后,提取出人脸来,并且保存下来,以供训练或识别是用,提取人脸的代码如下: void GetImageRect(IplImage* orgImage, ...
- VBA_常用VBA代码
'批量替换字符 Sub Test() Dim i As Integer ).Value = "已激活" Then Cells(i, ).Value = "Active&q ...