一、入门
这里我们首先新建一个java工程(工程hibernate_beginning
),引入hibernate3.2的相关包(这里我是使用的3.2版本),然后将拷贝相关的配置文件到src下:
hibernate.cfg.xml
jdbc:mysql://localhost:3305/hibernate_beginning
com.mysql.jdbc.Driver
root
walp1314
org.hibernate.dialect.MySQLDialect
true
update
说明:
-
hibernate.connection.url
配置自己数据库的url地址 -
hibernate.connection.driver_class
配置jdbc驱动 -
hibernate.connection.username
数据库用户名 -
hibernate.connection.password
数据库密码 -
hibernate.dialect
配置hibernate的方言 -
hibernate.show_sql
打印sql语句 -
hibernate.hbm2ddl.auto
自动创建|更新|验证数据库表结构 -
mapping
就是用来指明模型类的配置文件
log4j.properties
log4j.rootLogger=INFO,A1,R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target=System.out
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%c]%m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=sshe.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.Threshold=ALL
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
创建一个实体类
User.java
package cn.itcast.model;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date createTime;//创建日期
private Date expireTime;//销毁日期
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
}
在后面我们需要在数据库中自动生成相关的表,需要一个针对实体类的配置:
user.hbm.xml
说明:如果实体类中属性名和数据库中字段名名字一样就不需要配置column属性,如果不一样就需要配置,比如实体类中属性id对应数据库中的字段为user_id,那么id项就需要这样配置:
当然这里我一般不配。而对于table我一般在前面加上下划线。
然后我们编写一个工具类自动在数据库中生成表,但是在这之前必须新建一个数据库create database hibernate_beginning
。
ExportDB.java
package cn.itcast.util;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
public static void main(String[] args) {
//读取hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
//自动生成对应的表
export.create(true, true);
}
}
说明:当我们运行此类的时候就会在数据库中自动生成相应的表。
测试:
Client.java
package cn.itcast.dao;
import java.util.Date;
import java.util.UUID;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import cn.itcast.model.User;
public class Client {
public static void main(String[] args) {
//读取配置文件
Configuration cfg = new Configuration().configure();
//一个数据库对应一个工厂,和配置文件中的配置是对应的
SessionFactory factory = cfg.buildSessionFactory();
//创建Session,但是和之前的Session是不一样的,应该是对connection的封装
Session session = null;
try{
session = factory.openSession();//使用工厂创建一个Session
//hibernate中必须手动开启事务
session.beginTransaction();//注意Session不是线程安全的
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
session.save(user);
//手动提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();//出现问题后记得回滚
}finally{
if(session != null){
if(session.isOpen()){
session.close();//关闭Session
}
}
}
}
}
说明:jdbc的一些基础内容这里不细说了,成功之后查看数据库数据是否存入。
二、反向生成实体类
一般在开发中很少这样新编写实体类,再生成相关的表,一般是在数据库中将相关的表建好之后,然后再使用MyEclipse反向生成相关的实体类。具体的操作在笔记(Maven中添加hibernate支持)中详细讲了,这里不再说。
这里我们再新建一个工程(hibernate_beginning_1
)
反向生成实体:
User.java
package cn.itcast.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* User entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "_user", catalog = "hibernate_beginning")
public class User implements java.io.Serializable {
// Fields
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
// Constructors
/** default constructor */
public User() {
}
/** minimal constructor */
public User(String id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
/** full constructor */
public User(String id, String name, String password, Date createTime,
Date expireTime) {
this.id = id;
this.name = name;
this.password = password;
this.createTime = createTime;
this.expireTime = expireTime;
}
// Property accessors
@Id
@Column(name = "id", unique = true, nullable = false, length = 36)
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
@Column(name = "name", nullable = false, length = 20)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "password", nullable = false, length = 20)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Temporal(TemporalType.DATE)
@Column(name = "createTime", length = 10)
public Date getCreateTime() {
return this.createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Temporal(TemporalType.DATE)
@Column(name = "expireTime", length = 10)
public Date getExpireTime() {
return this.expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
}
说明:这里我是使用的hibernate4.1版本,然后使用了注解。
测试:
Client.java
package cn.itcast.dao;
import java.util.Date;
import java.util.UUID;
import org.hibernate.Session;
import cn.itcast.model.HibernateSessionFactory;
import cn.itcast.model.User;
public class Client {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
try{
//hibernate中必须手动开启事务
session.beginTransaction();//注意Session不是线程安全的
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("tom");
user.setPassword("111");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
session.save(user);
//手动提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();//出现问题后记得回滚
}finally{
if(session != null){
HibernateSessionFactory.closeSession();
}
}
}
}
最后:
- 这里需要说明的是,在使用MyEclipse反向生成实体的时候也可以生成相关的配置文件,当然最好使用注解方式。
- 我们在使用第一种方式生成数据库表的时候
java.util.Date
在数据库中生成的类型是datetime
类型,但是如果在第二种方式中首先在数据库表中使用datetime
这种类型,那么反向生成的类型是java.sql.Timestamp
,但是我们在实体中一般不用此类型,所以这里需要注意。