1 hibernate 框架介绍

冬眠:开发的代码基本不变。

1.1回顾jdbc

Java提供的标准的数据访问的API

作用:完成应用程序java程序中的数据和db中的数据进行交换。

工作过程:

A 加载驱动

B建立连接

C定义sql,发生sql语句

D执行sql语句获得执行结果

E处理返回结果

F关闭资源

1.2 ORM对象关系映射

将大象保存数据库?

JAVA:

1 定义大象类

2定义类的属性

3创建对象

DB:

1 创建表

2定义表中的字段

3 插入记录(一行)

将大象保存到java程序?

ORM:

面向对象的java语言和关系型数据库之间的对应关系

类----表

类属性----表中的字段

对象----数据库的记录

1.3hibernate实现机制

Src:hibernate.cfg.xml

描述数据的操作环境

Hibernate通过对jdbc的封装,以orm对象关系映射为基础,让程序员以完全面向对象的思想,实现对数据库的crud操作。在使用hibernate进行数据库的操作的时候,程序员不需要考虑sql语句的开发

2 Hello Hhibernate

2.1 新建java项目

导入jar包

2.2 建立hibernate的主配置文件

在src目录下,建立hibernate.cfg.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!-- 配置数据库的连接信息 -->
  8. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <!-- jdbc:mysql://localhost:3306/1106 -->
  10. <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
  11. <property name="connection.username">root</property>
  12. <property name="connection.password">1111</property>
  13. <!-- 配置hibernate操作的数据库对应的方言 hjibernate在操作数据库的过程中,需要将普通话,翻译为特定数据对应的方言sql语句,hibernate开发的应用程序
  14. 可以在不同的数据库上进行移植。 -->
  15. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!-- 配置数据相关的其他属性 -->
  17. <!-- hibenrate生产的sql语句是否在控制台进行打印 -->
  18. <property name="show_sql">true</property>
  19. <!-- 是否将产生的sql语句进行格式化 -->
  20. <property name="format_sql">true</property>
  21. <!-- 配置hibenrate的正向工程: hibernate的反向工程:由数据库中的表,产生java程序中的类 hibenrate的正向工程:由java中的类,产生数据库中对应的表
  22. upate:如果数据库中存在某个java类对应的表,检查java类中的属性是否和数据库中的表字段一致,如果不一致进行更新 如果数据库中不存在表,会自动创建表。 -->
  23. <property name="hbm2ddl">update</property>
  24. <!-- 通过主配置文件,加载pojo的映射文件 -->
  25. <mapping resource="org/guangsoft/pojo/Pet.hbm.xml" />
  26. </session-factory>
  27. </hibernate-configuration> 

2.3建立java类(实体类)

建立pojo类

  1. package org.guangsoft.pojo;
  2. /***
  3. *
  4. * 定义宠物的pojo类:简单的java类
  5. *
  6. * ***/
  7. public class Pet
  8. {
  9. private Integer pid;
  10. private String pname;
  11. private String ptype;
  12. private String color;
  13. public Integer getPid()
  14. {
  15. return pid;
  16. }
  17. public void setPid(Integer pid)
  18. {
  19. this.pid = pid;
  20. }
  21. public String getPname()
  22. {
  23. return pname;
  24. }
  25. public void setPname(String pname)
  26. {
  27. this.pname = pname;
  28. }
  29. public String getPtype()
  30. {
  31. return ptype;
  32. }
  33. public void setPtype(String ptype)
  34. {
  35. this.ptype = ptype;
  36. }
  37. public String getColor()
  38. {
  39. return color;
  40. }
  41. public void setColor(String color)
  42. {
  43. this.color = color;
  44. }
  45. }

2.4 建立pojo的映射文件

必须和pojo类放入同一个包中。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!-- 描述java中的类和数据库的表映射关系 package:指定pojo所在的包 -->
  6. <hibernate-mapping package="org.guangsoft.pojo">
  7. <!-- 描述类和表的关系 -->
  8. <class name="Pet" table="t_pet">
  9. <!-- 描述java对象的标识和数据库中的主键的对应关系 name:属性名 column:数据库的列表 type:属性的数据类型 -->
  10. <id name="pid" column="pid" type="java.lang.Integer">
  11. <!-- native:pid这一列在数据库中管理方式: 如:mysql 会自动使pid自增 oracle:会为该列产生一个序列 -->
  12. <generator class="native"></generator>
  13. </id>
  14. <!-- 其他属性:简单属性 name:属性名 column:数据库的列表 type:属性的数据类型 -->
  15. <property name="pname" column="pname" type="java.lang.String"></property>
  16. <property name="ptype" column="ptype" type="java.lang.String"></property>
  17. <property name="color" column="color" type="java.lang.String"></property>
  18. </class>
  19. </hibernate-mapping>

2.5使用Hibernate的API

建立测试类,访问数据库

  1. package org.guangsoft.test;
  2. import java.io.Serializable;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.junit.Test;
  8. import org.guangsoft.pojo.Pet;
  9. public class TestHibernate {
  10. /***
  11. * 添加一个宠物信息,为模板代码
  12. * 单元测试:
  13. * @Test
  14. * 在定义单元测试方法的时候,方法不能有参数和返回值
  15. * ***/
  16. @Test
  17. public void addPet()
  18. {
  19. //1 创建Configuration对象,用来加载hibernate的配置文件
  20. Configuration cfg = new Configuration();
  21. //2加载配置文件
  22. cfg.configure("hibernate.cfg.xml");
  23. //3通过cfg构造一个会话工厂对象
  24. SessionFactory sf=cfg.buildSessionFactory();
  25. //4获得数据库的会话对象,和数据库的连接
  26. Session session = sf.openSession();
  27. //5开始事务
  28. Transaction tr=session.beginTransaction();
  29. //6进行数据库的curd操作
  30. Pet pet = new Pet();
  31. pet.setPname("奥巴马");
  32. pet.setColor("黑色");
  33. pet.setPtype("白头鹰");
  34. //返回值为当前增加的记录的主键值
  35. Serializable ser=session.save(pet);
  36. System.out.println("ser="+ser);
  37. //7提交事务
  38. tr.commit();
  39. //8释放资源
  40. session.close();
  41. }
  42. } 

3 hibernate的基本操作(curd)

3.1 准备工作

建立项目,加入jar

建立hibernate.cfg.xml

建立pojo类和对应的映射文件

3.2 定义Dao接口

  1. package org.guangsoft.dao;
  2. import java.util.List;
  3. import org.guangsoft.pojo.Student;
  4. /***
  5. *
  6. * 学生表的crud操作定义
  7. *
  8. * ***/
  9. public interface StudentDao
  10. {
  11. // 添加学生信息
  12. public void saveStudent(Student stu);
  13. // 删除学生信息
  14. public void deleteStudent(Student stu);
  15. // 修改学生信息
  16. public void updateStudent(Student stu);
  17. // 单条查询
  18. public Student selStudentBySno(Integer sno);
  19. // 查询所有学生信息
  20. public List<Student> selStudentAll();
  21. }

3.3建立接口的实现类

  1. package org.guangsoft.dao.impl;
  2. import java.util.List;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.guangsogt.dao.StudentDao;
  8. import org.guangsoft.pojo.Student;
  9. public class StudentDaoImpl implements StudentDao
  10. {
  11. /**
  12. *
  13. * 通过静态代码块加载配置文件
  14. *
  15. * ****/
  16. static SessionFactory sf = null;
  17. static
  18. {
  19. // 1 创建Configuration对象,用来加载hibernate的配置文件
  20. Configuration cfg = new Configuration();
  21. // 2加载配置文件
  22. cfg.configure("hibernate.cfg.xml");
  23. // 3通过cfg构造一个会话工厂对象
  24. sf = cfg.buildSessionFactory();
  25. }
  26. @Override
  27. public void saveStudent(Student stu)
  28. {
  29. // TODO Auto-generated method stub
  30. // 获得数据库的会话对象
  31. Session session = sf.openSession();
  32. // 打开事务操作
  33. Transaction tr = session.beginTransaction();
  34. // 添加数据
  35. session.save(stu);
  36. // 提交事务
  37. tr.commit();
  38. // 关闭资源
  39. session.close();
  40. }
  41. @Override
  42. public void deleteStudent(Student stu)
  43. {
  44. // TODO Auto-generated method stub
  45. //
  46. Session session = sf.openSession();
  47. //
  48. Transaction tr = session.beginTransaction();
  49. //
  50. session.delete(stu);
  51. //
  52. tr.commit();
  53. //
  54. session.close();
  55. }
  56. @Override
  57. public void updateStudent(Student stu)
  58. {
  59. // TODO Auto-generated method stub
  60. //
  61. Session session = sf.openSession();
  62. //
  63. Transaction tr = session.beginTransaction();
  64. //
  65. session.update(stu);
  66. /***
  67. *
  68. * 如果传入的对象的唯一标识是null,那对数据库进行保存操作
  69. *
  70. * 如果传入的对象的唯一标识不是null,会进行更新操作,如果不存在
  71. *
  72. * **/
  73. // session.saveOrUpdate(stu);
  74. //
  75. tr.commit();
  76. //
  77. session.close();
  78. }
  79. /**
  80. *
  81. * 单条查询
  82. *
  83. * ***/
  84. @Override
  85. public Student selStudentBySno(Integer sno)
  86. {
  87. // TODO Auto-generated method stub
  88. // 1 session
  89. Session session = sf.openSession();
  90. // 2 查询操作事务是可以不需要的
  91. // 3查询操作:参数1:需要查询的类对应的clas文件 参数2:查询条件(唯一标识)
  92. Object obj = session.get(Student.class, sno);
  93. return (Student) obj;
  94. }
  95. /*** 多条查询 ***/
  96. @Override
  97. public List<Student> selStudentAll()
  98. {
  99. // TODO Auto-generated method stub
  100. // 1 session
  101. Session session = sf.openSession();
  102. // 2(通过hibernate提供的查询语句进行查询)
  103. String hql = "from Student";
  104. // 3执行hql语句
  105. return session.createQuery(hql).list();
  106. }
  107. }

3.4 建立测试类

测试基本的crud操作

  1. package org.guangsoft.test;
  2. import java.util.List;
  3. import org.junit.Before;
  4. import org.junit.Test;
  5. import org.guangsoft.dao.StudentDao;
  6. import org.guangsoft.dao.impl.StudentDaoImpl;
  7. import org.guangsoft.pojo.Student;
  8. public class TestCrud
  9. {
  10. // 声明Dao变量
  11. StudentDao dao;
  12. /***
  13. *
  14. * init方法在所有加@Test注解的方法执行之前,会自动执行。
  15. *
  16. * ***/
  17. @Before
  18. public void init()
  19. {
  20. dao = new StudentDaoImpl();
  21. }
  22. /**
  23. *
  24. * 测试增加学生的功能
  25. *
  26. * ***/
  27. @Test
  28. public void testSaveStudent()
  29. {
  30. Student stu = new Student();
  31. stu.setSname("王岐山");
  32. stu.setAddress("中南海");
  33. stu.setBirthday("1956-10-10");
  34. dao.saveStudent(stu);
  35. }
  36. /***
  37. *
  38. *
  39. *
  40. * 测试更新功能
  41. *
  42. * ***/
  43. @Test
  44. public void testUpdateStudent()
  45. {
  46. Student stu = new Student();
  47. // 如果给定的id在数据库没有对应的记录,抛出异常
  48. stu.setSno(14);
  49. stu.setSname("特朗普");
  50. stu.setAddress("白宫");
  51. stu.setBirthday("1990-10-10");
  52. dao.updateStudent(stu);
  53. }
  54. /***
  55. *
  56. * 进行单条查询
  57. *
  58. * ***/
  59. @Test
  60. public void testSelectStudentBySno()
  61. {
  62. Student s = dao.selStudentBySno(4);
  63. System.out.println("-----" + s.getSno() + "\t" + s.getSname() + "\t"
  64. + s.getAddress() + "\t" + s.getBirthday());
  65. }
  66. /***
  67. *
  68. * 测试多条查询
  69. *
  70. * ***/
  71. @Test
  72. public void testSelectStudentAll()
  73. {
  74. List<Student> list = dao.selStudentAll();
  75. for (Student s : list)
  76. {
  77. System.out.println("-----" + s.getSno() + "\t" + s.getSname()
  78. + "\t" + s.getAddress() + "\t" + s.getBirthday());
  79. }
  80. }
  81. /***
  82. *
  83. * 测试删除
  84. *
  85. * **/
  86. @Test
  87. public void testDeleteStudent()
  88. {
  89. // 创建了对象,自己封装了id属性的值
  90. /*
  91. * Student stu = new Student();
  92. *
  93. * stu.setSno(4);
  94. */
  95. // 删除之前,先进行查询操作
  96. Student stu = dao.selStudentBySno(3);
  97. dao.deleteStudent(stu);
  98. }
  99. } 

4 crud操作总结

总结API:对象

Configuration :加载hibernate的配置文件。

SessionFactory:会话工厂,在实际的程序也只存在一个对象。

Session:用来操作数据库的会话对象,产生事务对象

Transaction:事务控制对象

Session方法

BeginTransaction()  开始事务

Save()

saveOrUpdate()

delete()

update()

get()/load();

Query q = createQuery()

q.list()

//session.createSQLQuery(arg0)

Query:执行数据库的查询操作,负责执行HQL语句

Hibernate基本CRUD的更多相关文章

  1. Hibernate的CRUD以及junit测试

    Hibernate的CRUD以及junit测试 1:第一步创建动态工程引包,省略. 2:第二步,创建数据库和数据表,省略. 3:第三步,创建实体类,如User.java,源码如下所示: 对于实体类,一 ...

  2. ssh架构之hibernate(一)简单使用hibernate完成CRUD

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

  3. Hibernate之CRUD实践

    Hibernate作为一个高度封装的持久层框架,曾经是非常牛逼的,现在虽然应用不是特别广,比如我前公司主要是做OA的,应用的框架就是Spring+SpringMVC+Hibernate. Hibern ...

  4. Hibernate的CRUD

    1.CRUD: C:sesion.save() R:session.get()? session.load() D:session.delete() U:session.update() 2.读取数据 ...

  5. hibernate之CRUD操作

    CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写. 下面列举实例来讲解这几个操作: 实体类: ...

  6. java框架篇---hibernate之CRUD操作

    CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写. 下面列举实例来讲解这几个操作: 实体类: ...

  7. hibernate的CRUD操作

    一对多关系映射的crud操作: 1.单项的保存操作 /** * 保存操作 * 正常的保存:创建一个联系人,需要关联客户 */ @Test public void test1(){ Session s= ...

  8. Hibernate的CRUD配置及简单使用

    参考博客:https://blog.csdn.net/qq_38977097/article/details/81326503 1.首先是jar包,可以在官网下载. 或者点击下面链接下载 链接:htt ...

  9. java之hibernate之crud

    这篇文章主要讲解: 1>.对Hibernate使用的一些简单封装: · 2>.在单元测试中,使用Hibernate的封装的工具进行增删改查的测试 1.目录结构展示 2.代码展示 2.0 配 ...

随机推荐

  1. 【C语言入门教程】5.1 函数说明 与 返回值

    C 语言是结构化语言,它的主要结构成分是函数.函数被作为一种构件,用以完成程序中的某个具体功能.函数允许一个程序的各个任务被分别定义和编码,使程序模块化.本章介绍 C 语言函数的设计,如何用函数分解程 ...

  2. php访问全局变量

    函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. PHP 同时在名为 $GLOBALS[index] 的数组 ...

  3. HDu1003(maxn sum)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBcAAAMDCAYAAAD5XP0yAAAgAElEQVR4nOy97a8c133n2X+H3xjIC4

  4. android socket编程用Bufferreader读取的一个失败教训

    由于我的手机需要用笔记本开的wifi,躺在床上玩手机时需要关电脑或者是要让电脑放歌的时候总是不想下床,于是我想能不能用一个APP,然后通过局域网实现在手机上对电脑进行操控呢?说干就干. 我在电脑上用的 ...

  5. 笔记(一):ES6所改良的javascript“缺陷”

    ES6笔记(一):ES6所改良的javascript“缺陷”   块级作用域 ES5没有块级作用域,只有全局作用域和函数作用域,由于这一点,变量的作用域甚广,所以一进入函数就要马上将它创建出来.这就造 ...

  6. ubuntu安装python一些安装包

    sudo apt-get install python-pip sudo pip install distribute sudo pip install nose sudo pip install v ...

  7. 问题: Oracle Database 10g 未在当前操作系统中经过认证

    问题: Oracle Database 10g 未在当前操作系统中经过认证 在Windows 7中安装Oracle 10g. 使用的Orcale版本是10g. 步骤1: 在Orcale官网上下载,下载 ...

  8. Python自动化之socket初识

    1. os.popen() os.system(cmd)会直接输出命令的结果到屏幕上,返回一个状态码0或1. os.popen(cmd)会返回一个<open file 'dir', mode ' ...

  9. phpmyadmin上传大sql文件办法

    进入php5文件夹下: cd /etc/php5/apache2 #根据你当时的配置选择,比如之前配置是apache2就进入apache2,如果是cli就进入cli文件夹下 打开php.ini文件 s ...

  10. JQuery 遍历 - prev() 方法

    http://www.w3school.com.cn/jquery/traversing_prev.asp http://www.w3school.com.cn/jquery/jquery_ref_t ...