1.什么是ORM
ORM(Object/Relationship Mapping):对象/关系映射
写SQL语句的缺点:
1.不同的数据库使用的SQL语法不同。比如:PL/SQL(Oracle)与T/SQL(SQL Server)
2.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL。
3.程序过分依赖SQL对程序的移植及扩展、维护等带来很大的麻烦。
为了完全使用面向对象思想开发软件,抛弃书写SQL的思想,需要采用一种可行ORM框架技术。
2.Hibernate简介
1.Hibernate是java领域的一个开源的ORM框架
2.Hibernate是对JDBC进行了非常轻量级的封装,实质上还是通过JDBC实现对数据库的操作
3.Hibernate在程序中的作用:持久化层,把程序中生成的对象 持久化到数据库的表中
其他主流的ORM框架技术
1.MyBatis:前身就是iBatis(Apache)
2.Toplink:后被Oracle收购,并重新包装为Oracle AS TopLink
3.EJB:本身是JAVAEE的规范(重量级)
3.使用Hibernate前准备
使用eclipse,注意要安装一个插件Hibernate Tools for Eclipse Plugins,插件可以简化ORM框架,使开发简捷高效
如何安装Hibernatetools插件:
下载http://tools.jboss.org/downloads/
点击help–install new。。–找到安装包–安装完重启
出现Hibernate文件夹即表示安装成功
原文地址:http://blog.sina.com.cn/s/blog_9868e32a010120qx.html
eclipse3.7 插件Hibernate Tools实现步骤:
1.启动eclipse
2.选择Help > Install New Software…>
3.添加如下地址:http://download.jboss.org/jbosstools/oxygen/stable/updates/
这个地址是怎么得到的。搜索jbosstools下载界面,点击下载即可。
4.出现如图:
5.在选择JBoss Web and Java EE Development展开后选择Hibernate Tools工具。
6.接下来就自动安装了,在此安装的过程网速很重要,其后就是next、finish就安装成功了。
7.接下来就可以使用Hibernate Tools 工具了在eclipse上查看如下图
4.编写第一个Hibernate例子
1.首先我们要编写一个Hibernate的配置文件hibernate.cfg.xml
2.然后创建持久化类
3.创建对象–关系映射文件
4.通过Hibernate API来编写访问数据库的代码
- 导入Hibernate必须的jar包
hibernate-release-4.2.4.Final\lib\required - 导入mysql的jdbc驱动
mysql-connector-java-5.17-bin.jar - 导入junit4的jar包
Junit-4.10.jar
5.创建hibernate工程
这里就是创建一个java项目,然后导入相应的jar包
建议在窗口 window选择最下面的一个首选项,然后打开java构建路径,将对应的jar包加在库中,这样在项目创建后可以直接导入jar包会比较方便
6.hibernate配置文档
使用hibernatetools插件去自动生成
如果编辑的时候eclipse没有出现代码提示功能,我们需要导入dtd文档的支持
配置hibernate:数据库用户名,密码,jdbc驱动,方言,URL
选择src new 最下面的其他 ,之后选择hibernate第一个cfg.xml即可。
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property> <! -- 在控制台显示出sql语句 -- >
<property name="format_sql">true</property> <! -- 按照格式化显示出sql语句 -- >
<property name="hbm2ddl.auto">create</property> <! -- 会重新创建一张表 -- >
<mapping resource="com/Student.hbm.xml" ></mapping>
</session-factory>
7.创建持久化类
持久化类需要符合javabeans的设计原则
package com.imooc;
import java.util.Date;
public class Students {
/**
* 1.共有的类
* 2.属性私有
* 3.有一个不带参的默认构造方法
* 4.属性geterseter封装
*/
public Students() {
}
private int sid;//学号
private String sname;//名字
private String gender;//性别
private Date birthday;//生日
private String address;//地址
public Students(int sid, String sname, String gender, Date birthday, String address) {
super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
}
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
+ ", address=" + address + "]";
}
}
8.创建对象-关系映射文件和数据库
创建对象关系映射文件,src,new其它,选择hibernate最后一个hbm.xml,下一步找到我们要持久化的学生类,点完成。
这是工具帮我们自动生成的配置文档,在这个文档中把我们的学生类实体类映射到一张表。并且把每一个属性都映射成了一个字段,column表示对应的字段名。这就是对象关系映射的配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-1-11 20:14:33 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.imooc.Students" table="STUDENTS">
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
</class>
</hibernate-mapping>
<hibernate-configuration>
<session-factory name="connectionName">
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="Students.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在.cfg.xml中添加<mapping resourse="Students.hbm.xml"/>
随后新建一个mysql数据库 hibernate。
9.使用JUnit进行测试
使用Junit进行测试,这里需要介绍三个注解
- @Test:测试方法
- @Before:初始化方法
- @After:释放资源
在我们执行测试方法前,也就是测试某个test标签下的方法时,它会先执行before注解标签下面的这个方法,然后在执行test这个方法,执行完毕之后要释放资源,执行after标签下的方法。
这里我们先在项目名下new source folder 新建源文件包,一般测试是test。在包里新建一个测试类StudentsTest
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
//测试类
public class StudentsTest {
@Before
public void init() {
}
@After
public void destory() {}
@Test
public void testSaveStudents() {
}
}
10.通过Hibernate API编写访问数据库的代码
最后我们呢就要通过Hibernate API来编写访问数据库的代码,分以下几步:
Configuration config=new Configuration().configure();//创建配置对象
ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings (config.getProperties()).buildServiceRegistry();
//创建服务注册对象
sessionFactory =config.buildSessionFactory(serviceRegistry);
//创建会话工厂对象
session =sessionFactory.openSession();//打开会话。
transaction =session.beginTransaction();//打开事务
这些步骤都是要放到我们的初始化方法当中
//测试类
public class StudentsTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
Configuration config=new Configuration().configure();//创建配置对象
config.addClass(Students.class);
ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//创建服务注册对象
sessionFactory =config.buildSessionFactory(serviceRegistry);
//创建会话工厂对象
session =sessionFactory.openSession();//打开会话。
transaction =session.beginTransaction();//打开事务
}
@After
public void destory() {
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
@Test
public void testSaveStudents() {
//生成一个学生对象
Students s=new Students(1,"张三丰","男",new Date(),"武当山");
session.save(s);//保存对象进数据库
}
}
junit4调试,可以看到数据库中多了一张students的表,并且添加了一行内容