1.Hibernate配置文件
hibernate.cfg.xml。该配置文件应该放在项目的src根目录下。其配置如下
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/UH
root
123456
org.hibernate.dialect.MySQLDialect
true
该属性指定连接数据库的驱动,不过要注意版本的问题。
在Oracle中常为oracle.jdbc.driver.OracleDiver。其缺省端口通常1521。
在mysql数据库中,常为com.mysql.jdbc.Driver,其缺省端口通常为3306.。
该属性为设置数据库的URL地址
在Oracle中其形式通常为 jdbc:oracle:thin:@dbip:port:databasename,dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。port –为数据库的监听端口,需要看安装时的配置,缺省为1521。databasename –为数据库的SID,通常为全局数据库的名字。
在MySQL中其形式通常为jdbc:mysql://dbip:port/databasename,dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。port –为数据库的监听端口,需要看安装时的配置,缺省为3306。databasename –为数据库的SID,通常为全局数据库的名字。
分别为设置连接数据库的用户名和密码。
dialect属性为设置数据库的方言类型,由于目前有各种各样开发数据库管理软件的公司,为了提高自己数据库的性能或者增加一些功能都采用了一套额外的标准语法。像Oracle, MySQL, MS SQL Server等。
是否在控制台打印SQL语句,通常我们会设置为true,这样方便开发和维护人员了解数据库内部的运行动态。
是否格式化SQL语句,这个属性的设置会挺高代码的可读性。
设置是否自动生成数据库表,其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。
create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
再说点“废话”:
当我们把hibernate.hbm2ddl.auto=create时hibernate先用hbm2ddl来生成数据库schema。
当我们把hibernate.cfg.xml文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常 只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删除掉(drop)---- create配置的含义是:“在创建SessionFactory的时候,从scema中drop掉所以的表,再重新创建它们”。
注意,很多Hibernate新手在这一步会失败,我们不时看到关于Table not found错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema, 后续的应用程序重启后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。
在Hibernate中持久化类是Hibernate操作对象,也是通过对象-关系映射(ORM)后所映射的实体类,用来描述数据库表的结构信息。持久化类中的属性应该与数据库表中的字段想匹配。
package hibernate;
public class User {
private Integer id;
private String name;
private String password;
public User(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
..... //省略一些getter和setter方法。
}
我们要注意在编写持久化类的时候要加上无参数构造方法,和实现getter和setter方法。还有类中要有一个标识属性像本类中的id。属性的域应为private。
Configuration cfg = new Configuration().configue(); //加载hibernate的配置文件
factory = cfg.buildSessionFactory(); //实例化SessionFactory
Configuration cfg = new Configuration().configure();
ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
ServiceRegistry sr = srb.buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(sr);
package hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil {
private static final ThreadLocal threadLocal = new ThreadLocal();
private static SessionFactory sessionFactory = null;
static {
try {
Configuration cfg = new Configuration().configure();
ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
ServiceRegistry sr = srb.buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(sr);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//获取session
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
//TODO
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession():null;
threadLocal.set(session);
}
return session;
}
public static void rebuildSessionFactory() {
try {
Configuration cfg = new Configuration().configure();
ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
ServiceRegistry sr = srb.buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(sr);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//close session
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null){
session.close();
}
}
}
package hibernate;
import org.hibernate.Session;
public class AddUser {
private Session session = null;
private User user = new User();
public void addUser(int id, String name, String password){
user.setId(id);
user.setName(name);
user.setPassword(password);
//Hibernate持久化操作
try{
session = (Session) HibernateUtil.getSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}catch (Exception e) {
// TODO: handle exception
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
public static void main(String[] args){
AddUser opt = new AddUser();
//opt.addUser(1234, "xiaohuang", "123456");
opt.addUser(1235, "xiaocheng", "123456");
}
}
运行效果: