发下牢骚,这段时间要作项目,又要学框架,搞得都没时间写笔记,可是以为这知识学过仍是要记录下。进入主题了java
1.一、Hibernate简介mysql
什么是Hibernate?Hibernate有什么用?算法
Hibernate是开放源代码的对象关系映射框架,用来把java的对象映射到数据库中的关系数据中,以便永久保存数据。sql
(简单说来,咱们都知道Java语言是面向对象的语言,数据库是面向关系的,咱们每次要往数据库中添加数据的时候,是否是每次都须要写SQL语句,进行CRUD,而优秀的开发人员数据库
他们想出了一个很是好的映射框架,对象关系映射,也就是Hibernate,再透彻点说,就是你往对象添加数据的时候,数据库中的表就自动添加了数据了。是否是很神奇!)网络
Hibernate的做用:session
一、管理Java类的对象到数据库的映射app
二、提供数据查询框架
三、提升效率,减小开发人员使用SQL和jdbc处理数据的时间ide
四、Hibernate能实现数据持久化和对象关系的映射
1.二、理解Hibernate
笔者在前面有说过,学一个东西,首先要理解它是什么?有什么用?为什么存在?
咱们要了解Hibernate,首先要先去了解三层结构,三层结构咱们都听过,可是,它和Hibernate有什么关系呢?
这里简要说明下三层结构
三层结构分为: 表示层,业务逻辑层,数据库层
表示层: 提供与用户进行交互的界面
业务逻辑层: 负责各类业务逻辑,提供对业务数据的保存,更新,删除和查询操做等
数据库层: 存放管理应用的持久化业务数据
而Hibernate,其实就是在业务逻辑层和数据库层中间,添加一个持久化层,这个持久化层是业务逻辑中分离出来的;这样,业务逻辑层经过持久化层,持久化层经过数据库层。
这里说了持久化,那么什么是持久化呢?
将数据(如内存中的对象)永久的保存到存储设备中,就是持久化,持久化的做用是将内存中的数据存储到关系型的数据库中。
说到底其实数据存放分为两种,一种是短时间存放,就是存放在内存中,当你从新运行项目的时候,内存中的数据就消失,而另一种就是永久存放。
理论就到这里。
1.二、简单例子——增删改查
1.2.一、搭建环境
新建java property,这里笔者的环境是Eclipse+Tomcat8.0,下载所须要的jar包,打包在这里,注意还得添加mysql的jar包,将包导入到项目中,具体操做
右键项目名——Properties——Java Build Path——Libraries——Add Library——User Library——User Libraryies——New,接下来就添加jar,而后起个名字,以后将导入到你的项目就能够了。
效果图:
1.2.二、新建配置文件
这里须要注意一点就是:在Hibernate中,默认配置文件的命名为hibernate.cfg.xml,因此咱们配置文件命名通常就是这个,若是说你想要从新命名的话,那么在读取配置文件的时候就要指定相对路径。
在src下新建hibernate.cfg.xml
内容有链接数据库,指定读取实体类的配置信息,还有在控制台输出SQL语句等数据;配置文件中的dtd文件,在hibernate-core-4.2.4.Final.jar中的org.hibernate中的最后就能看到hibernate-configuration-3.0.dtd,打开该文件,而后将下面的dtd文件限制加到xml配置文件中便可。注意:笔者这里使用的是hibernate 4.2的版本。可是通常都在核心包里面的。
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
新建实体类:Student.java
package com.hibernate.hellos; public class Student { private int sid; private String sname; private int sage; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } }
重点来了:当咱们新建实体类时,须要在该实体类的基础上新建映射文件,dtd限制一样在核心包中里面查找
新建配置文件:Student.hbn.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> <!-- name:表示的是该类的相对路径 table:表示的是数据库的表名 --> <class name="com.hibernate.hellos.Student" table="Student"> <!-- type:表示该属性是int类型 column:映射的是数据库中的列名 native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个,就是根据数据库生成 --> <id name="sid" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <property name="sage" type="int"> <column name="SAGE" /> </property> </class> </hibernate-mapping>
注意:
其中generator的class有:
increment(递增)
用于为long, short或者int类型生成惟一标识。只有在没有其余进程往同一张表中插入数据时才能使用。
identity (标识)
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的
uuid
用一个128位的UUID算法生成字符串类型的标识符。在一个网络中惟一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
新建配置文件:hiberate.cfg.xml,该文件放在src下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <!-- 显示sql语句 --> <property name="format_sql">true</property> <!-- 格式化sql语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url"> <![CDATA[jdbc:mysql://localhost:3306/myhibernate?useUnicode=true&characterEncoding=utf8]]> </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 建立表 使用create,查询或者更新的时候使用update--> <property name="hibernate.hbm2ddl.auto">create</property> <!-- hibernate的第一个测试例子 --> <mapping resource="com/hibernate/hellos/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
注意:使用hibernate.hbm2ddl.auto的时候,当为create的时候,表示若是你数据库中没建立表也不要紧,hibernate会自动帮你建立,当使用update的时候,表示在表的基础上使用
接下来新建一个测试类:Test.java
package com.hibernate.hellos; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class Test { private static SessionFactory sessionfactory; private static Session session; public static void main(String[] args){ //读取默认配置文件名 hibernate.cfg.xml //若是要指定文件名,只须要在new Configuration().configure("指定文件的路径"); Configuration config = new Configuration().configure(); //注册服务 ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()) .buildServiceRegistry(); //实例化一个session工厂 SessionFactory sessionfactory = config.buildSessionFactory(service); //打开hibernate的session,执行操做 session = sessionfactory.openSession(); //添加 add(); //查询 sel(); //修改 update(); //删除 delete(); } //添加 public static void add(){ Transaction transaction = session.beginTransaction(); Student s = new Student(); s.setSname("张三"); s.setSage(20); session.save(s); transaction.commit(); //注意:若是session关闭的话,须要指定打开 } //查询 public static void sel(){ Student s = (Student) session.get(Student.class, 1); System.out.println(s.getSname()); } //修改数据 public static void update(){ Student s = new Student(); s.setSname("李四"); s.setSage(30); Transaction transaction = session.beginTransaction(); //获取数据库中的表 Student s1 = (Student) session.get(Student.class,1); transaction.commit(); s1.setSname("李思思"); transaction = session.beginTransaction(); session.update(s1); transaction.commit(); } public static void delete(){ Transaction transaction = session.beginTransaction(); Student s = (Student) session.get(Student.class, 1); session.delete(s); transaction.commit(); } }
若是你直接复制我代码的话,你就会看到数据库中除了一张表数据什么都没有,把delete()方法注释掉。恩,别犯傻。
当咱们使用格式化的时候,就能够看到
添加和修改的效果图:
数据库中的表的数据:
总结:
一、新建实体类的时候,记得要写映射文件,固然可使用注解的方式,后期笔者会慢慢记录
二、table表名不能够是mysql中的关键字
三、hibernate.hbm2ddl.auto的使用须要注意