Hibernate自学心得
2016-06-20 16:39
302 查看
快大四了,根据自学所学的框架(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文件的配置
配置好了就要实现:
这个地方只是简单的实现,如果还想要配置一些别的功能或者资源文件,需要使用自动动手使用java去编写,添加的方法很简单的,可以自己百度查,不过因为这样做很麻烦,且不方便,所以一帮使用xml文件的配置。
第二种是xml文件的配置
xml文件配置也有两种情况:
第一种情况是使用文件名hibernate.cfg.xml
另外一种是使用别的名字
--看配置(只是部分配置):
在这里涉及到了主键的一种映射关系(来自: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的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了
配置文件和映射文件都写好了之后(部分实现代码):
等等等等都在文件里。
查了些资料,发现,Hibernate在数据量上比不上Mybatis好,数据量在很大的情况下,Hibernate可能出现奔溃、不过在许多方面Hibernate还是很好用的,可以减少了写sql语句的麻烦,复杂的sql语句只需要简简单单的几行代码就可以搞定了。当然Hibernate还还是用了Hql语言,也挺好用的:eg:from 实体类名称 [条件...];
首先,Hibernate大多使用的是ORM模式(Object Relation Mapping || 对象关系映射)。
不多说,开始编写:
使用Hibernate需要到官网去下载包(当然我的代码里边也有):http://hibernate.org/orm/
下载好了之后就可以安安心心的编写了:
第一步:新建Hibernate的配置文件,有两种形式
第一种是properties文件的配置
配置好了就要实现:
/** * 使用了properties配置文件和映射类 */ @Test public 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配置文件和映射文件 */ @Test public void delete(){ Configuration configuration = new Configuration().configure();//加载配置文件 SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor Session session = sessionFactory.openSession();//打开session Transaction 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(); } } }
/** * 分页查询 */ @Test public 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配置文件和映射文件 */ @Test public void delete(){ Configuration configuration = new Configuration().configure();//加载配置文件 SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor Session session = sessionFactory.openSession();//打开session Transaction 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(); } } }
/** * 条件查询 */ @Test public 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(); } } } /** * 查找 */ @Test public 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(); } }
/** * 条件查找 */ @Test public 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(); } }
/** * 列查询 */ @Test public 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]); } }
@Test public 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]); // } }
@Test public 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 block e.printStackTrace(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
@Test public 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不再缓存中"); } } /** * 缓存机制 */ @Test public 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)); } /** * 删除 */ @Test public 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(); }
等等等等都在文件里。
相关文章推荐
- Unity长按屏幕计时器
- 程序员不得不注意的十大编程禁忌,你造吗?
- Ubuntu 14.04.2 + Vmware搭建Linux驱动开发环境
- swift 处理字符串
- 集成Slice2Java插件
- Android开发储存简单数据到本地的方法
- Android开发中遇到的坑
- 第十四周项目二(1)-两个成员的类模板
- Oracle:TNS数据传输协议-基础篇
- 多个Target的podfile文件配置
- JS 精确加减乘除
- Thinkpad L440 安装固态硬盘和加装内存条
- 1.3、Android Studio创建一个Android Library
- 你必须要知道的10款APP开发框架
- 1.3、Android Studio创建一个Android Library
- 获取class列表属性方法
- linux学习笔记 (fork && FILE && PC)
- 阅读程序(1)
- BZOJ4144 [AMPPZ2014]Petrol
- web项目中简单的管理spring的上下文