JavaEE 之 Habernate

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);
    }

 

posted @ 2017-04-18 20:21  晨M风  阅读(435)  评论(0编辑  收藏  举报