1.Habernate

  a.定义:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO(简单java对象,即javabean)与数据库表建立映射关系,是一个全自动的ORM框架

  b.ORM:对象关系映射(Object Relation Mapping)

2.使用:

  a.在SRC下建hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">
jdbc:mysql://localhost:3306/j116
</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/wode/pojo/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

  b.建User的映射配置User.hbm.xml

<?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>
<class name="com.wode.pojo.User" table="users">
<id name="userId" column="user_id" type="integer">
<generator class="native"></generator>
</id>
<property name="userName" column="user_name" type="string"></property>
<property name="userPwd" column="user_pwd" type="string"></property>
<property name="userType" column="user_type" type="int"></property>
</class>
</hibernate-mapping>

  c.使用

        User u=new User();
u.setUserName("test");
u.setUserPwd("test");
u.setUserType(1);
Configuration cfg=new Configuration();
cfg.configure();//加载hibernateConfiguration
ServiceRegistry registry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory factory=cfg.buildSessionFactory(registry);
Session session=factory.openSession();
Transaction tx=session.beginTransaction();
session.save(u);
tx.commit();
session.close();

3.增删查改

  a.增

session.save(u);

  b.删

session.delete(u);    //需要设置User的Id

  c.查

//方法一:hql
Query query = session.createQuery("from User");
List<User> list=query.list(); //方法二:sql
Query query =session.createSQLQuery("select * from users").addEntity(User.class);
List<User> list=query.list(); //方法三:单个对象
User u=(User) session.load(User.class, 1);//延迟加载
User u=(User) session.get(User.class, 1);

  d.改

//方法一
User u = (User) session.get(User.class, 1);
u.setUserPwd("123456");
session.beginTransaction().commit(); //方法二(没set的属性将自动设为空,不建议使用)
User u = new User();
u.setUserId(1);
u.setUserPwd("123456");
session.update(u);
session.beginTransaction().commit();

4.查询拓展

  a.分页查询

        Query query = session.createQuery("from User");
//当前页
int currentPage = 1;
//一页多少条
int pageSize = 5; query.setFirstResult((currentPage-1)*pageSize);
query.setMaxResults(pageSize); List<User> list = query.list();
for(User u : list){
System.out.println(u.getUserName()+" "+u.getUserPwd());
}

  b.聚合函数

Query query=session.createQuery("select count(*) from Course");

  c.模糊查询

//Query query = session.createQuery("from User u where u.userName like ?");
//query.setString(0, "%z%");
Query query = session.createQuery("from User u where u.userName like :name");
query.setString("name", "%z%");
List<User> list = query.list();

  d.不用session的方式

Query query=session.createQuery("delete  Course c where c.courseName =wa ");
int =query.executeUpdate()

5.一对多

  a.在Many方xml中配置 

<many-to-one name="dept" class="com.wode.entity.Dept" column="deptNo" lazy="false" fetch="join"/>

  b.在One方xml中配置

<set name="emps"  lazy="false" fetch="join"  cascade="all">
<key column="deptNo"></key>
<one-to-many class="com.wode.entity.Emp"/>
</set>

  c.级联添加

        Dept dept = new Dept();
dept.setDeptNo(40);
dept.setDname("销售部");
dept.setLoc("红瓦寺"); Emp emp = new Emp();
emp.setEmpno(9527);
emp.setEname("若湖");
...
emp.setDept(dept); Emp emp2 = new Emp();
emp2.setEmpno(9528);
emp2.setEname("江瑕");
...
emp2.setDept(dept); Set<Emp> emps = new HashSet<Emp>();
emps.add(emp);
emps.add(emp2);
dept.setEmps(emps); session.save(dept);
session.beginTransaction().commit();

  d.级联删除

        Dept dept = (Dept) session.get(Dept.class, 40);
session.delete(dept);
session.beginTransaction().commit();

  e.通过Dept删除某个Emp

        Dept dept = (Dept) session.get(Dept.class, 40);
Set<Emp> emps = dept.getEmps();
Iterator<Emp> it = emps.iterator();
while(it.hasNext()){
if(it.next().getEname().equals("江瑕")){
it.remove();
}
}
session.beginTransaction().commit();

  f.查找所有的Dept以及所有Dept里面的Emp

        List<Dept> depts = session.createQuery("select distinct(d) from Dept d join fetch d.emps").list();
for(Dept dept : depts){
System.out.println(dept.getDname());
for(Emp emp : dept.getEmps()){
System.out.println(emp.getEname());
}
}

6.多对多

  a.配置xml

     <set name="courses" table="t_s_fk">
<key column="sId"></key>
<many-to-many class="Course" column="cId"></many-to-many>
</set>

  b.添加(近增加相互之间的关系)

        Student stu = (Student) session.get(Student.class, 3);
Course course1 = (Course) session.get(Course.class, 1);
Course course2 = (Course) session.get(Course.class, 3); stu.getCourses().add(course1);
stu.getCourses().add(course2); session.beginTransaction().commit();

  c.通过科目名称查找选了这门课程的学生

        Course course = (Course) session.get(Course.class, 1);
Set<Student> stus = course.getStus();
for(Student stu : stus){
System.out.println(stu.getStuName());
}

7.注解方式

  a.将 <mapping resource="com/wode/pojo/Emp.hbm.xml" /> 改为 <mapping class="com.wode.pojo.Emp" />

  b.标注方法参考Spring Data JPA

8.二级缓存

  a.在src下创建ehcache.xml

  b.在hibernate.cfg.xml中配置

        <property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

  c. 在Bean的映射配置xml中配置

 <cache usage="read-only" region="sampleCache1"/>

  d.若使用的是注解则加@注解

@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)

9.Habernate在Spring中的使用

  a.在web.xml及applicationContext.xml中配置相应配置

  b.使用:

    @Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory; @Override
public void addUser(User user) {
// TODO Auto-generated method stub
Session session = sessionFactory.getCurrentSession();
session.save(user);
}

JavaEE 之 Habernate的更多相关文章

  1. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  2. javaEE设计模式——门面模式

    1.本节内容 门面模式的意图介绍 门面模式带来的好处 门面模式的应用场景 实现模式的3中方式:POJO.无状态与有状态回话Bean门面 有状态与无状态回话Bean门面的重要差别 关于门面模式使用的警告 ...

  3. 【解决方案】cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-r

    [JAVA错误] cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One o ...

  4. [JavaEE笔记]Cookie

    引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...

  5. JavaEE开发基础

    1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...

  6. javaEE基础08

    javaEE基础08 一.继承 特点:继承父类的属性和方法,单继承(多继承) 特性:方法的复写(重写) 比如:人可以养狗 人------>狗:整体和部分(拥有)关系 关键字:extends 结构 ...

  7. JavaEE:JavaEE技术组成

    Java平台版本: JavaSE:Java Platform Standard Edition,标准版,用来开发桌面应用系统: JavaEE:Java Plateform Enterprise Edi ...

  8. JavaEE中Web服务器、Web容器、Application服务器区别及联系

    在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...

  9. Linux服务器oraclejdk与openjdk共存并配置JavaEE开发环境

    由于本人学业的需要,需要在linux中搭建JavaEE开发环境,与windows的同学协同开发. JDK 由于fedora默认使用openjdk,移除多多少少会出现点问题,由于很多开源软件默认使用到它 ...

随机推荐

  1. linux压缩与解压(持续更新)

    压缩 tar cvzf  w.tar.gz  xxx1 xxx2  对应解压:tar xvzf w.tar.gz

  2. Confluence 6 PostgreSQL 问题解决

    如果 Confluence 提示没有 class 文件,你可能将你的 JDBC 驱动放置到了错误的文件夹. 如果你不能从你从 Confluence 中连接到 PostgreSQL ,并且这 2 个服务 ...

  3. Confluence 6 创建一个主题

    如果你希望创建你自己的主题,你需要写一个 Confluence 插件.请参考我们开发文档中的下面页面 开始使用 插件开发. 请参考开发者指南的页面来 写一个 Confluence 主题. 使用 主题插 ...

  4. Swift Write to file 到电脑桌面

    (arr as NSArray).write(toFile: "Users/你的用户名/Desktop/mian.plist", atomically: true)

  5. sticky footer 模板

    http://www.w3cplus.com/blog/tags/136.html http://www.w3cplus.com/css/css-sticky-foot-at-bottom-of-th ...

  6. Linux用户、用户组、文件权限学习笔记

    最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...

  7. Visual Studio UML类图

    1.unified Modeling Language(UML)称为同一建模语言或者标准建语言, 用例图:对系统的使用方式的分类.类图:显示类和他们的相互关系.  对象图:只显示对象及他们的相互关系. ...

  8. 直径上的乱搞 bzoj1999求树直径上的结点+单调队列,bzoj1912负权树求直径+求直径边

    直径上的乱搞一般要求出这条直径上的点集或者边集 bzoj1999:对直径上的点集进行操作 /* 给出一颗树,在树的直径上截取长度不超过s的路径 定义点u到s的距离为u到s的最短路径长度 定义s的偏心距 ...

  9. Loadrunner11.0 录制手机App脚本的方法一

    使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...

  10. 获取git更新文件

    #获取最后一个版本的更新日志workspace2=/testtemplogdir=/testtmprm -rf ${logdir}/change.loggit diff --stat $GIT_PRE ...