1.hibernate入门(hibernate笔记)

一、入门 这里我们首先新建一个java工程(工程hibernate_beginning),引入hibernate3.2的相关包(这里我是使用的3.2版本),然后将拷贝相关的配置文件到src下:
hibernate.cfg.xml

jdbc:mysql://localhost:3305/hibernate_beginningcom.mysql.jdbc.Driverrootwalp1314org.hibernate.dialect.MySQLDialecttrueupdate

说明:
  • 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,Rlog4j.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%nlog4j.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 {// Fieldsprivate 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(); } } } }

【1.hibernate入门(hibernate笔记)】最后:
  • 这里需要说明的是,在使用MyEclipse反向生成实体的时候也可以生成相关的配置文件,当然最好使用注解方式。
  • 我们在使用第一种方式生成数据库表的时候java.util.Date在数据库中生成的类型是datetime类型,但是如果在第二种方式中首先在数据库表中使用datetime这种类型,那么反向生成的类型是java.sql.Timestamp,但是我们在实体中一般不用此类型,所以这里需要注意。

    推荐阅读