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();}
等等等等都在文件里。
- Hibernate自学心得
- j2ee自学心得
- 自学JAVA的心得
- Cg编程自学心得
- android 数据库自学心得
- SpringMvc自学心得
- ios自学心得
- iOS开发自学心得
- 自学前端初学心得
- 自学jsp的难点心得
- 自学了一段时间的心得
- [心得]如何系统自学经济学
- Java自学心得—1
- hibernate的自学
- Hibernate自学:初步了解
- Hibernate 自学复习
- Hibernate自学详细笔记
- Hibernate之自学hql
- Qt国际化多国语言和发布例子
- 关于keystore 证书转*.x509.pem 和*.pk8
- Easyui集成mCustomScrollbar步骤
- swiper的基础使用(九)
- 手机摄像头技术
- Hibernate自学心得
- Git使用遇到的问题
- 谥号与谥号制度
- 如何查询Linux系统的一些相关信息
- 利用caffe跑自己的数据
- web项目中简单的管理spring的上下文
- Struts2的基本工作流程认识
- BZOJ4144 [AMPPZ2014]Petrol
- Pascal's Triangle II Leetcode Python java