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:softwareoracleapp16125product11.2.0dbhome_1jdbclibojdbc6.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();
}