Hibernate实例

Hibernate实例

一、Hibernate简介

Hibernate是简化项目中连接数据库的一个框架工具

Hibernate是Java领域类技术成熟稳定的ORM框架

* ORM是对象关系映射
* 使用ORM的好处:使得习惯使用面向对象编程的程序员在项目中尽量少写和底层数据库相关的sql语句
* 这样做的好处:方便程序维护和修改以及跨平台性和扩展

二、使用的工具

(1)eclipse

Eclipse Java EE IDE for Web Developers. Version: Neon.3 Release (4.6.3)

(2)mysql

mysql-5.7.17

(3)Navicat

Navicat Premium_11.2.7简体中文破解版

(4)hibernate插件

jbosstools-4.4.4.Final

(5)junit工具

junit-4.8.2

* JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。
* Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
* Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

(6)jdbc

mysql-connector-java-5.1.7

(三)Hibernate开发的基本步骤

* (1)编写项目配置文档hibernate.cfg.xml
* (2)编写实体类(需遵循Java bins的规范)
* (3)生产对应实体类的映射文件并添加到配置文档中
* (4)调用Hibernate API函数进行测试

hibernate执行流程图

1)编写项目配置文档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         <property name="connection.username">root</property><!--数据库用户名 -->
 8         <property name="connection.password">1314</property><!--数据库密码 -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property><!--数据库驱动 -->
10         <!--数据库链接 -->
11         <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
12 
13         <!--表示数据库的方言,对数据库的语言结构进行优化 -->
14         <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
15 
16         <!--是否把要执行的语句输出到控制台 -->
17         <property name="show_sql">true</property>
18         <!--是否对要执行的语句格式化 -->
19         <property name="format_sql">true</property>
20         <!--生成表结构的策略,create表示删除原表重新生成,update表示更新原表 -->
21         <property name="hbm2ddl.auto">create</property>
22         <!--给数据库中的所有表加上前缀 -->
23         <property name="hibernate.default_schema">hibernate</property>
24         <!--getCurrentSession方法创建session要用到的属性 -->
25         <property name="hibernate.current_session_context_class">thread</property>
26 
27 
28         <mapping class="Students" />
29         <!--掉用映射 Students.hbm.xml -->
30         <mapping resource="Students.hbm.xml" />
31         
32     </session-factory>
33 </hibernate-configuration>

2)编写实体类(需遵循Java bins的规范)

Students.java

这是这个hibernate实例中的实体类,会映射到数据库的表中

 1 import java.util.Date;
 2 
 3 //学生类
 4 public class Students {
 5 
 6     /*
 7      * Java bin类的原则 1.公有的类 2.提供公有的不带参数的默认的构造方法 3.属性私有 4.属性setter/getter封装
 8      * 
 9      */
10 
11     private int sid;// 学号
12     private String sname;// 姓名
13     private String gender;// 性别
14     private Date birthday;// 出生日期
15     private String address;// 地址
16 
17     public Students() {
18 
19     }
20 
21     public Students(int sid, String sname, String gender, Date birthday, String address) {
22         // super();
23         this.sid = sid;
24         this.sname = sname;
25         this.gender = gender;
26         this.birthday = birthday;
27         this.address = address;
28     }
29 
30     public int getSid() {
31         return sid;
32     }
33 
34     public void setSid(int sid) {
35         this.sid = sid;
36     }
37 
38     public String getSname() {
39         return sname;
40     }
41 
42     public void setSname(String sname) {
43         this.sname = sname;
44     }
45 
46     public String getGender() {
47         return gender;
48     }
49 
50     public void setGender(String gender) {
51         this.gender = gender;
52     }
53 
54     public Date getBirthday() {
55         return birthday;
56     }
57 
58     public void setBirthday(Date birthday) {
59         this.birthday = birthday;
60     }
61 
62     public String getAddress() {
63         return address;
64     }
65 
66     public void setAddress(String address) {
67         this.address = address;
68     }
69 
70     @Override
71     public String toString() {
72         return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
73                 + ", address=" + address + "]";
74     }
75 
76 }

3)生产对应实体类的映射文件并添加到配置文档中

这个配置文件就是将java中的类映射到数据库中的表

每修改一次实例的属性,这个配置文件就需要修改

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2017-5-29 9:53:03 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="Students" table="STUDENTS"><!--name表示在java中的类  table表示映射在数据库中的表名-->
 7         <id name="sid" type="int"><!--id整个这个标签表示主键 -->
 8         <!--sid表示在java类中的属性名  type表示这个属性的类型-->
 9             <column name="SID" /><!--SID表示的是这个属性映射在数据库中的字段名称-->
10             <generator class="assigned" /><!--generator表示的是主键的生产方式 assigned表示人为指定 active表示数据库自动生成-->
11         </id>
12         <property name="sname" type="java.lang.String"><!--property是属性的意思-->
13             <column name="SNAME" />
14         </property>
15         <property name="gender" type="java.lang.String">
16             <column name="GENDER" />
17         </property>
18         <property name="birthday" type="java.util.Date">
19             <column name="BIRTHDAY" />
20         </property>
21         <property name="address" type="java.lang.String">
22             <column name="ADDRESS" />
23         </property>
24     </class>
25 </hibernate-mapping>

4)调用Hibernate API函数进行测试

通过junit进行测试

 1 //这里报错我一直在纠结,其实视频里面这里也有错啊,我浪费时间
 2 //多去看视频下面的评论,有告诉我们很多问题的解决方案
 3 //运行代码时老犯配置错误,原来配置文件中不支持java注释的写法
 4 //我是通过删减犯错位置的代码来发现错误的
 5 
 6 /*
 7  * 理解hibernate
 8  * hibernate是对jdbc进行了轻量级的封装,本身还是用的jdbc
 9  */
10 
11 /*
12  * 理解session
13  * Session对象相当于jdbc中的connection数据库,因为要面对对象的思想操作数据库,
14  * 所以用session而不是用而不是直接用jdbc
15  * hibernate是对jdbc进行了轻量级的封装,本身还是用的jdbc
16  * 所以可以简单理解session为操作数据库对象
17  * session与connection是一对多的关系,每个session都有一个与之对应的connection,
18  * 一个connection不同时刻可以供多个session使用
19  * session的增删改查:save(),update(),delete().createQuery()
20  */
21 
22 /*
23  * 理解transaction
24  * hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交方式,
25  * 所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
26  * 如果不开事务,要用session的doWork()方法将数据提交到数据库
27  */
28 
29 /*
30  * session详解
31  * 如何获得session对象
32  * 1)openSession
33  * 2)getCurrentSession
34  */
35 import java.sql.Connection;
36 import java.sql.SQLException;
37 import java.util.Date;
38 
39 import org.hibernate.Session;
40 import org.hibernate.SessionFactory;
41 import org.hibernate.Transaction;
42 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
43 import org.hibernate.cfg.Configuration;
44 import org.hibernate.jdbc.Work;
45 import org.hibernate.service.ServiceRegistry;
46 import org.junit.After;
47 import org.junit.Before;
48 import org.junit.Test;
49 
50 //测试类
51 public class StudentsTest {
52 
53     private SessionFactory sessionFactory;
54     private Session session;
55     private Transaction transaction;
56     
57     @Before
58     public void init(){
59         //创建配置对象
60         Configuration config = new Configuration().configure();
61         //创建服务注册对象
62         ServiceRegistry serviceRegistry =  new 
63                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//这里有点不一样
64         //创建会话工厂对象
65         sessionFactory = config.buildSessionFactory(serviceRegistry);
66         //创建会话对象
67         session = sessionFactory.openSession();
68         //开启事务
69         transaction = session.beginTransaction();
70     }
71     
72     @After
73     public void destory(){
74         transaction.commit();//提交事务
75         session.close();//关闭会话
76         sessionFactory.close();//关闭会话工厂
77     }
78     
79     
80     @Test
81     public void testSaveStudents(){
82         //生产学生对象
83         Students s = new Students(1,"饭饭","男",new Date(),"博客园");
84 //        session.doWork(new Work() {//匿名内部类
85 //            @Override
86 //            public void execute(Connection connection) throws SQLException {
87 //                // TODO Auto-generated method stub
88 //                connection.setAutoCommit(true);
89 //            }
90 //        });
91         session.save(s);//保存对象进入数据库
92 //        session.flush();//强制刷新流
93     }
94     
95 }

四、hibernate基本操作

hibernate基本数据类型

hibernate对象类型

hibernate常用基本类型

五、总结

* 1、什么是ORM?为什么要使用Hibernate?
* ORM是对象关系映射
* 使用ORM的好处是使得习惯使用面向对象编程的程序员在项目中尽量少写和底层数据库相关的sql语句
* 这样做的好处:方便程序维护和修改以及跨平台性和扩展
* Hibernate是Java领域类技术成熟稳定的ORM框架


* 2、Hibernate开发的基本步骤
* (1)编写项目配置文档hibernate.cfg.xml
* (2)编写实体类(需遵循Java bins的规范)
* (3)生产对应实体类的映射文件并添加到配置文档中
* (4)调用Hibernate API函数进行测试


* 3、什么是session?
* hibernate对数据库的操作都要使用session对象,session对象相当于我们使用jdbc开发的一个connection对象
* 我们使用hibernate对数据库的操作本质上就是调用session的API函数来实现的
* save():(增)保存数据 get()/load():(查)取出数据 update():(改)更新数据 delete():(删)删除数据


* 4、openSession与getCurrentSession
* openSession每次创建一个新的实例对象,需要我们显示关闭
* getCurrentSession使用的是一种单例模式,每次创建的都是相同的对象,自动关闭


* 5、单表操作有哪些方法?
* save():(增)保存数据 delete():(删)删除数据 update():(改)更新数据 get()/load():(查)取出数据


* 6、get和load
* get使用时立刻发送sql语句,而且直接获得实体类本身
* load是在使用到具体的实例的非主属性的时候才会发送sql语句,返回的是代理对象

原文地址:https://www.cnblogs.com/Renyi-Fan/p/6922422.html