Hibernate自学心得

来源:互联网 发布:如何注销淘宝卖家账号 编辑:程序博客网 时间:2024/06/07 12:54

快大四了,根据自学所学的框架(Sping、Mybatis、Struts2),想出去找找实习工作,所以去看看招聘信息,发现许多的招聘信息里边要求的框架大多都是Hibernate,所以我索性也学学Hibernate这一个框架,以下为个人心得:

查了些资料,发现,Hibernate在数据量上比不上Mybatis好,数据量在很大的情况下,Hibernate可能出现奔溃、不过在许多方面Hibernate还是很好用的,可以减少了写sql语句的麻烦,复杂的sql语句只需要简简单单的几行代码就可以搞定了。当然Hibernate还还是用了Hql语言,也挺好用的:eg:from 实体类名称 [条件...];

首先,Hibernate大多使用的是ORM模式(Object  Relation Mapping || 对象关系映射)。

不多说,开始编写:

使用Hibernate需要到官网去下载包(当然我的代码里边也有):http://hibernate.org/orm/

下载好了之后就可以安安心心的编写了:

第一步:新建Hibernate的配置文件,有两种形式

第一种是properties文件的配置


配置好了就要实现:

/** * 使用了properties配置文件和映射类 */@Testpublic void test(){//通过对象插值Student student = new Student();student.setId(5);student.setName("myks");student.setAge(23);Configuration cfg = new Configuration();cfg.addClass(com.myk.hibernate.Student.class);SessionFactory sf = cfg.buildSessionFactory();Session session = sf.openSession();Transaction t = session.beginTransaction();try {//添加session.save(student);t.commit();//事务提交} catch (HibernateException e) {t.rollback();//事务回滚e.printStackTrace();}finally{if(session!=null){session.close();}}}

这个地方只是简单的实现,如果还想要配置一些别的功能或者资源文件,需要使用自动动手使用java去编写,添加的方法很简单的,可以自己百度查,不过因为这样做很麻烦,且不方便,所以一帮使用xml文件的配置。

第二种是xml文件的配置

xml文件配置也有两种情况:

第一种情况是使用文件名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.driver_class">com.mysql.jdbc.Driver</property>    <property name="connection.url">jdbc:mysql://localhost/hibernate</property>    <property name="connection.username">root</property>    <property name="connection.password">maiyikai</property><!-- 数据库方言 -->             <property name="dialect">org.hibernate.dialect.MySQLDialect</property>     <!-- 是否后台显示sql语句 -->       <property name="show_sql">true</property><!-- 导入映射资源文件 -->        <mapping resource="com/myk/hibernate/Student.hbm.xml"/>             </session-factory></hibernate-configuration>
再看看映射文件(映射文件的文件名一般是以*.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 package="com.myk.hibernate"><!-- class设置关系映射表   name:映射路径   table="表名" -->    <class name="Student" table="student">    <!-- id定义的是主键列 name:表中的字段 -->        <id name="id" column="id">        <!-- generator设置主键模式   class="主键的模式" -->        <generator class="assigned"></generator>        </id>        <!-- 定义其他字段 -->        <property name="name"></property>        <property name="age"></property>    </class></hibernate-mapping>

在这里涉及到了主键的一种映射关系(来自:http://lqzit.iteye.com/blog/845163):

1:assigned:表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment:表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity:不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native:表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。
5.uuid: 唯一主键生成办法。从Hibernate中提取出来。
优点:避免了生成ID 时,与数据库的再次交道,性能上较高。但对于有的开发人员不太习惯这种id生成方式,UUID生成的32为的字符串,不同于identity 从1开始的整数。
 

Xml代码
1.<id name="实体类属性名" type="java.lang.Integer">  
2.      <column name="对应表中主键字段名" />  
3.      <generator class="assiged|increment|identity|native|........" />  
4.</id>  
<id name="实体类属性名" type="java.lang.Integer">
      <column name="对应表中主键字段名" />
      <generator class="assiged|increment|identity|native|........" />
</id>

采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了

配置文件和映射文件都写好了之后(部分实现代码):

/** * 使用*.cfg.xml配置文件和映射文件 */@Testpublic void delete(){Configuration configuration = new Configuration().configure();//加载配置文件SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactorSession session = sessionFactory.openSession();//打开sessionTransaction transaction = session.beginTransaction();//打开事务管理Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载try {session.delete(student);transaction.commit();//事务提交} catch (HibernateException e) {transaction.rollback();//事务回滚e.printStackTrace();}finally{if(session!=null){session.close();}}}

/** * 分页查询 */@Testpublic void pageSelect(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();int pageNo = 2;int pageNum = 2;try {//查询全部数据Criteria criteria = session.createCriteria(Student.class);criteria.setFirstResult((pageNo-1)*pageNum);//设置起始地记录位置criteria.setMaxResults(pageNo*pageNum);//设置终止的记录位置List<Student> list = criteria.list();System.out.println(list);} catch (HibernateException e) {e.printStackTrace();}}

/** * 删除 * 使用*.cfg.xml配置文件和映射文件 */@Testpublic void delete(){Configuration configuration = new Configuration().configure();//加载配置文件SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactorSession session = sessionFactory.openSession();//打开sessionTransaction transaction = session.beginTransaction();//打开事务管理Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载try {session.delete(student);transaction.commit();//事务提交} catch (HibernateException e) {transaction.rollback();//事务回滚e.printStackTrace();}finally{if(session!=null){session.close();}}}
/** * 条件查询 */@Testpublic void select(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student) session.load(Student.class, 1);try {transaction.commit();} catch (HibernateException e) {transaction.rollback();e.printStackTrace();}finally{if(session!=null){session.close();}}}/** * 查找 */@Testpublic void selectAll(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();try {//查询全部数据Criteria criteria = session.createCriteria(Student.class);criteria.addOrder(Order.asc("age"));//结果集排序List<Student> list = criteria.list();System.out.println(list);} catch (HibernateException e) {e.printStackTrace();}}
/** * 条件查找 */@Testpublic void selectWhere(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();try {//查询全部数据Criteria criteria = session.createCriteria(Student.class);//criteria.add(Restrictions.eq("age", 22));//条件查询//criteria.add(Restrictions.eq("name", "qw"));//条件查询//多条件查询criteria.add(Restrictions.and(Restrictions.eq("name", "myk"), Restrictions.ge("age", 21)));List<Student> list = criteria.list();System.out.println(list);} catch (HibernateException e) {e.printStackTrace();}}
/** * 列查询 */@Testpublic void selectCol(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Criteria criteria = session.createCriteria(Student.class);//criteria.setProjection(Projections.property("age"));//设置查询列criteria.setProjection(Projections.projectionList().add(Projections.property("id")).add(Projections.property("name")));//设置多个查询了列List<Student> list = criteria.list();Iterator it = list.iterator();//迭代while(it.hasNext()){Object[] obj = (Object[]) it.next();System.out.println("id: "+obj[0]+" name: "+obj[1]);}}

@Testpublic void colSelect(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Criteria criteria = session.createCriteria(Student.class);//criteria.setProjection(Projections.sum("age"));//计算总和//int ages = (int) criteria.uniqueResult();//取值//System.out.println(ages);//criteria.setProjection(Projections.distinct(Projections.property("age")));//去重//Iterator it = criteria.list().iterator();//while(it.hasNext()){//System.out.println(it.next());//}//分组//criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("age")).add(Projections.rowCount(),"age"));//Iterator it = criteria.list().iterator();//while(it.hasNext()){//Object[] obj = (Object[]) it.next();//System.out.println("age: "+obj[0]+" count: "+obj[1]);//}}
@Testpublic void sessionSelect(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction teTransaction = session.beginTransaction();String sql = "select * from student";List<Student> list = new ArrayList<Student>();try {Query query = session.createSQLQuery(sql);Iterator iterator = query.list().iterator();while(iterator.hasNext()){Student student = new Student();Object[] object = (Object[]) iterator.next();student.setId(Integer.parseInt(object[0].toString()));student.setName(object[1].toString());student.setAge(Integer.parseInt(object[2].toString()));list.add(student);}System.out.println(list);} catch (NumberFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (HibernateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

@Testpublic void sessionQuery(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction teTransaction = session.beginTransaction();String hql = "from Student";List list = new ArrayList();Query query = session.createQuery(hql);list = query.list();System.out.println(list);Student s = new Student();if(session.contains(s)){System.out.println("s在缓存中");}else{System.out.println("s不再缓存中");}}/** * 缓存机制 */@Testpublic void sessionContains(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Student s = new Student();//建立持久化对象s = (Student) session.get("com.myk.hibernate.Student", 1);//条件获取System.out.println("缓存"+session.contains(s));session.clear();//清空缓存System.out.println("缓存"+session.contains(s));}/** * 删除 */@Testpublic void sessiondelete(){Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();//创建一个持久化对象//Student s = (Student) session.createQuery("from Student where age = '22'").setMaxResults(1).uniqueResult();//session.delete(s);//单一删除//tx.commit();//批量删除List list = session.createQuery("from Student where name = 'myk'").list();Iterator iterator = list.iterator();while(iterator.hasNext()){Student s = (Student) iterator.next();session.delete(s);}tx.commit();}









等等等等都在文件里。





0 0
原创粉丝点击