1.hibernate入门(hibernate笔记)

一、入门

这里我们首先新建一个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,但是我们在实体中一般不用此类型,所以这里需要注意。

你可能感兴趣的:(1.hibernate入门(hibernate笔记))