一,hibernate的介绍
hibernate是一款基于ORM的数据库开源框架,所谓的ORM即Object Realational Mapping(对象关系映射),简单的说就是可以让使用该框架的人通过面向对象的语言去操控关系型数据库。与传统的通过JDBC来完成数据库的操作相比,使用该框架可以大大降低开发者的工作量,使其从关系型数据库的各种操作中脱离出来(加载驱动,创建连接等)。JAVA中一个POJO的类是通过hibernate中的SQlSessionFactory维护,然后映射到数据库中相应的表。常用的ORM框架还有Mybatis等。
二,hibernate的使用
hibernate有两种使用方式,一种是通过配置相应的xml文件,然后进行各种初始化工作;另一种便是通过注解的方式。
2.1 项目的搭建
(1)通过Eclipse创建一个maven项目
(2)修改pom.xml文件引入hibernate所需要的一些jar包
本项目maven使用了3.5.4的版本,jdk使用了1.8,hibernate的版本是3.5.4-Final,pom文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mytest</groupId>
<artifactId>Hibernatetest</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Hibernatetest Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 添加hibernate的依赖 开始-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.1</version>
</dependency>
<!-- Hibernate library dependecy end -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<!-- 添加hibernate的依赖 结束-->
<!-- mysql数据库的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->
<!-- 添加maven的注解功能 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.4-Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<build>
<finalName>Hibernatetest</finalName>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
注意:在最后运行的时候要是报某某class文件找不到的错误,那就是说明引入的jar包少了,在网上搜一下报错信息找到缺少的jar包,然后引入相应的jar包依赖即可,我在刚开始用的时候也是前前后后添加了好几个依赖...以上pom文件在我的机器上是不存在问题的。
2.2 使用
创建项目相应的文件,最后整个项目的主要文件结构如下:
其中domain包下放JavaBean,test包下放相应的测试例子,mapping路径下放映射文件,hibernate.cfg.xml是hibernate的配置文件,里面配置有数据库连接属性等内容,hibernate就是通过该文件进行初始化的。
(1)在domain包下建一个Student类,内容如下:
package com.domain;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
该类将与数据库中的表进行映射,类中的属性便为数据库中的字段。
(2)在数据库中进行建表操作
create table tb_student(
id int(10) primary key auto_increment,
name varchar(20),
age int(3)
);
(3)修改hibernate.cfg.xml文件,其实使用properties文件一样可以,但是我比较习惯使用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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mytest</property>
<property name="hibernate.connection.username">root</property>
<!-- 方言设置,不同的数据库有不同的方言信息,以下为mysql的 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--2.2.显示Hibernate在运行的时候执行的sql语句-->
<property name="hibernate.show_sql">true</property>
<!--2.3.格式化sql-->
<property name="hibernate.format_sql">true</property>
<!--2.4.自动建表-->
<!-- 使用了该配置要是相应的表还没有被创建,那么在运行时hibernate会自动新建一个相应的表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="mapping/StudentMapping.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
//注意上面的mapping resource节点指明了映射文件所在路径
(4)在mapping文件夹新建一个StudentMapping.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>
<class name="com.domain.Student" table="tb_student">
<!-- id字段表示数据库主键生成策略
native 使 Hibernate 可以使用 identity, sequence 或 hilo 算法根据底层数据库的情况来创建主键。
-->
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<!-- type属性会将Java类型转换为sql数据类型,name指实体类中的属性名称,column指在数据库中的列名 -->
<property name="name" column="name" type="java.lang.String" length="20"/>
<property name="age" column="age" type="int"></property>
</class>
</hibernate-mapping>
(5)在com.test包下新建一个测试类,具体内容如下:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.domain.Student;
public class HibernateTest {
public static void main(String[] args) {
Configuration config = new Configuration().configure("hibernate.cfg.xml");
//开启会话工厂
SessionFactory sessionFactory = config.buildSessionFactory();
//开启会话
Session session = sessionFactory.openSession();
//开启事务
Transaction tr = session.beginTransaction();
try {
Student stu = new Student();
stu.setName("隔壁老王");
stu.setAge(17);
//保存数据
session.save(stu);
//记得要提交事务,不然不会保存的呀
tr.commit();
}catch(Exception e) {
e.printStackTrace();
tr.rollback();
}
}
}
运行,若控制台打印如下信息则表示执行成功:
查找tb_student表,看看数据是否被保存:
此处由于我们使用了mysql的主键自增,所以在进行保存的时候不用在显式的指明id的值。
常见的错误:
(1)保证自己的mysql在本地是可以被访问的
(2)hibernate.cfg.xml中关于数据库的配置信息要替换成自己的
(3)如何插入中文报错,说明数据库的默认编码方式不对,需要设置为utf-8。
下一节将记录hibernate注解的使用。