Hibernate的好处在于程序员不需要精通Sql就可以操作数据库,Hibernate的映射机制是实现实体类和数据库的表对应起来,它提供了两种映射方法,一种是XML文件映射规则,另外一种是Annotation注解,这里主要说明通过注解来实现实体和表的映射
常用注解的说明
@Entity 表示当前类为实体Bean(POJO),需要进行持久化。将一个JavaBean声明为持久化类时,默认情况下,该类的所有属性都将映射到数据表的字段。如果在该类中添加了无需映射的属性,则需要用@Transient注解声明
@Table 实现数据表与持久化类之间的映射,catalog指定数据库名称,name指定表名,@Table注解位置在@Entity注解之下
@Id 指定当前持久化类的ID标识属性,与@GeneratedValue配合使用
@GeneratedValue指定ID标识生成器,即主键生成策略,与@Id配合使用
@Column 指定当前属性所对应的数据库表中的字段,name指定字段名,unique指定是否为唯一,nullable指定是否可为null
应用
新建一个包,在包中新建实体类,这里以UserInfo为例,关联数据库中的user_info表
package com.hibernate.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user_info",catalog="hibernate")
public class UserInfo{ //实体类
private int id;
private String userName;
private String password;
private Date regDate;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="userName",length=20)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name="password",length=20)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name="regDate")
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
@Override
public String toString() {
return "UserInfo [id=" + id + ", userName=" + userName + ", password="
+ password + ", regDate=" + regDate + "]";
}
public UserInfo() { //构造方法
super();
}
public UserInfo(String userName, String password, Date regDate) { //带参数的构造方法
super();
this.userName = userName;
this.password = password;
this.regDate = regDate;
}
}
编写配置文件,该配置文件位于项目中,作为全局配置文件,该配置文件是XML文件,命名为 hibernate.cfg.xml
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate?characterEncoding=utf8</property>
<!-- 设置方言(HQL转换成哪种数据库的sql语句) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="connection.username">root</property>
<property name="connection.password">zwj19970923</property>
<!-- 关联映射类 -->
<mapping class="com.hibernate.entity.UserInfo"/><!-- 注解方式映射的实体类 -->
</session-factory>
</hibernate-configuration>
编写测试单元,新建一个包,包内创建一个测试单元JUnit Test Case
实现测试
package com.hibernate.test;
import com.hibernate.entity.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HibernateTest { //单元测试
private Session session;
private Transaction transaction;
private SessionFactory sessionFactory;
@Before
public void init(){//最开始先执行
System.out.println("before");
//加载hibernate配置文件
StandardServiceRegistry registry=new StandardServiceRegistryBuilder().configure().build();
try{
//根据配置文件初始化sessionFactory
sessionFactory=new MetadataSources(registry).buildMetadata().buildSessionFactory();
//创建session
session=sessionFactory.openSession();
//通过session对象开始事务
transaction=session.beginTransaction();
}catch(Exception e){
StandardServiceRegistryBuilder.destroy(registry);
}
}
@Test
public void test() {//在开始和最后之间执行的测试
System.out.println("test");
//初始化一个User_Info对象
UserInfo user=new UserInfo("小张","74443",new java.util.Date());
Type type=new Type("手机");
session.save(user);
session.save(type);
}
@Test
public void getUserInfo(){
UserInfo ui=(UserInfo)session.get(UserInfo.class, 3);
System.out.println(ui.toString());
}
@Test
public void loadUserInfo(){
UserInfo ui=(UserInfo)session.load(UserInfo.class, 2);
System.out.println(ui.toString());
}
@Test
public void deleteUserInfo(){
UserInfo ui=(UserInfo)session.get(UserInfo.class, 2);
session.delete(ui);
}
@Test
public void updateUserInfo(){
UserInfo ui=(UserInfo)session.get(UserInfo.class, 7);
ui.setUserName("小明");
session.saveOrUpdate(ui);
}
@After
public void destory(){//最后才执行
System.out.println("after");
//提交事务
transaction.commit();
//关闭session
session.close();
//关闭sessionFactory
sessionFactory.close();
}
}
测试
选择一个模块进行测试,这里我选择getUserInfo()模块,选中模块名,右键,找到Run As并选择JUnit Test进行该模块的测试,从结果中就可以看到我们的注解实现映射以及生效