Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了。其实对于对象来说就是持久化。
持久化(Persistence):即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等
Hibernate所需要的maven节点
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.11.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
//因为个人使用的是 IntelliJ 开发环境maven并不提供ojdbc6.jar所以我们需要在本地电脑自行注册
<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc14 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
注册过本地仓库的同志们应该都清楚我就不多说了上代码:
注释:ojdbc6.jar是oracle提供的我们只需要找到自己jar的地址更改为你自己的地址,并在cmd中运行。如果没有配置maven工厂的同志可能会有问题。
mvninstall:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=
jar -Dfile=E:\software\oracle\app\16125\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar
HQl开篇:
<--! 分离参数防止代码冗余 -->
Configuration cfg;
Session session;
Transaction tx;SessionFactory factory;
@Before
public void myBefor(){
/*
* 线程安全:方法中来用一个对象,不用考虑线程安全问题
* Session 代表连接 线程不安全
* */
//创建配置对象
cfg=new Configuration().configure("Dog.cfg.xml");
//根据配置对象创建SessionFactory
factory=cfg.buildSessionFactory();
//根据SessionFactory去创建Session
session=factory.getCurrentSession();
//开启事务
tx=session.beginTransaction();
//6.提交
tx.commit();
//7.关闭
session.close();
}
//小配置users.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">
<hibernate-mapping package="cn.happy.Rental.entity">
<!--dynamic-update="true" 动态更新先检索再修改-->
<class name="cn.happy.Rental.entity.users" table="users" dynamic-update="true" >
<id name="id" column="id">
<!--主键生成策略 :
assigned:程序员手动给值
native:本地的 底层数据库来决定 到底 使用 序列(支持序列的DB:Oralce hibernate_sequence)
或者是自增(Mysql AutoIncrement)
-->
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="password" column="password"></property>
<property name="typehome" column="typehome"></property>
<property name="username" column="username"></property>
<property name="isadmin" column="isadmin"></property>
</class>
</hibernate-mapping>
//大配置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>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">xxx</property>
<property name="connection.password">xxx</property>
<!--getCurrentSession-->
<property name="hibernate.current_session_context_class">thread</property>
<!-- SQL dialect 方言-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--格式化SQL-->
<property name="format_sql">true</property>
<!--在控制台‘打印sql控制台-->
<property name="show_sql">true</property>
<!--自动构建表结构 create 先delete表结构 在创建 update 直接更新表结构-->
<property name="hbm2ddl.auto">update</property>
<!--关联小配置-->
<mapping resource="cn/happy/Rental/entity/users.hbm.xml" />
<mapping resource="cn/happy/Rental/entity/district.hbm.xml" />
<mapping resource="cn/happy/Rental/entity/house.hbm.xml" />
<mapping resource="cn/happy/Rental/entity/street.hbm.xml" />
<mapping resource="cn/happy/Rental/entity/type.hbm.xml" />
</session-factory>
</hibernate-configuration>
// 1.简单查询
@Test
public void s1(){
String hql="from users";
Query query=session.createQuery(hql);
List<users>users=query.list();
for(users u1:users){
System.out.println("========"+u1.getUsername());
}
}
//2.带条件查询
@Test
public void s2(){
String hql="from users us where us.username='xxx'";
Query query=session.createQuery(hql);
List<users>users=query.list();
for(users u1:users){
System.out.println("========"+u1.getTypehome());
}
}
//3.动态sql
@Test
public void s1(){
dg dl=new dg();
dl.setDogid("40288b8a6087bf0f016087bf12800000");
dl.setDogname("二黑");
dl.setDogage(10);
StringBuilder sb=new StringBuilder(" from Dog g where 1=1 ");
if(dl.getDogid()!=null){
sb.append("and g.dogid =:dogid ");
}
if(dl.getDogname()!=null){
sb.append("and g.dogname=:dogname ");
}
if(dl.getDogage()!=null){
sb.append("and g.dogage=:dogage");
}
Query query=session.createQuery(sb.toString());
query.setProperties(dl);
List<Dog>list=query.list();
for (Dog item:list){
System.out.println(item.getDogname());
}
}
//分页
@Test
public void s2(){
String hql="from Dog order by dogid";
Query query=session.createQuery(hql);
int pageIndex=2;
int pageSize=3;
query.setFirstResult((pageIndex-1)*pageSize);//起始记录数
query.setMaxResults(pageSize);
List<Dog>list=query.list();
for (Dog li:list){
System.out.println(li.getDogname());
}
}
简单封装UTIL
public class HQLutil {
static ThreadLocal<Session>tlSession=new ThreadLocal<Session>();
public static SessionFactory factory;
static Configuration cfg=null;
static {
cfg=new Configuration().configure("Dog.cfg.xml");
factory=cfg.buildSessionFactory();
}
public static Session getSession(){
Session session=tlSession.get();
if(session==null){
session=factory.openSession();
tlSession.set(session);
}
return session;
}
public static Session CloseSession(){
Session session=tlSession.get();
if(session!=null){
tlSession.set(session);
session.close();
}
return session;
}
}
双向表关联关系:
我们以下所要的测试实体:部门表,员工表
想要实现关联我们要分别在两个小配置植入我们所需要的属性:记得放在我们的<class>点中
Dept:
<!--一对多双向关联 //员工实体 一对多private Set<Emp>emps;-->
<!-- cascade="save-update"级联 -->
<!-- inverse="true"放弃维护关系:不干预顶层集合数据 -->
<!-- order-by="empno desc"排序 -->
<set name="emps" cascade="save-update,delete" inverse="true" order-by="empno desc">
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
Emp:
<!--
name:在多的一方植入对方的对象名
class:再多的一方植入对方的类型名
column:在当前分析的对象对应底层表的外列的值
-->
<many-to-one name="Dept" class="Dept" column="deptno" cascade="save-update"></many-to-one>
//多对一
@Test
public void s1(){
Emp emp= HQLutil.getSession().get(Emp.class,1);
System.out.println(emp.getDept().getDeptname());
}
//一对多
@Test
public void s2(){
Dept dept=new Dept();
dept.setDeptno(1);
Emp emp=HQLutil.getSession().load(Emp.class,2);
emp.setDept(dept);
HQLutil.getSession().saveOrUpdate(emp);
Transaction transaction = HQLutil.getSession().beginTransaction();
transaction.commit();
}
//一对多双向关联
@Test
public void s3(){
String hql="from Dept";
Query query = HQLutil.getSession().createQuery(hql);
List<Dept> list = query.list();
for (Dept dept:list){
System.out.println(dept.getDeptname()+"=====部门");
System.out.println("=======dept=======");
for (Emp emp:dept.getEmps()){
System.out.println(emp.getEmpname()+"=====员工");
System.out.println("=======emp=======");
}
System.out.println("======= yes ========");
}
}
//多对多添加
@Test
public void s4(){
String hql="from Dept";
Query query = HQLutil.getSession().createQuery(hql);
List<Dept> list = query.list();
for (Dept dept:list){
System.out.println(dept.getDeptname()+"=====部门");
System.out.println("=======dept=======");
for (Emp emp:dept.getEmps()){
System.out.println(emp.getEmpname()+"=====员工");
System.out.println("=======emp=======");
}
System.out.println("======= yes ========");
}
}
//导航属性 cascade="save-update"
@Test
public void s5(){
Transaction transaction = HQLutil.getSession().beginTransaction();
Dept dept=new Dept();
dept.setDeptname("sss4");
Emp emp=new Emp();
emp.setEmpname("呵呵哒4");
dept.getEmps().add(emp);
HQLutil.getSession().save(dept);
transaction.commit();
}