记录一下hibernate框架的使用
一、下载Hibernate
从官网下载hibernate,解压后可以看到这么几个文件夹
documentation——hibernate的帮助文档
lib——hibernate的依赖包
project——hibernate的示例项目
首先新建一个java项目,打开lib文件夹,将required文件夹下的所有jar包以及jap文件夹下的jar包拷贝到项目下作为依赖
除了这些必须的jar包外,还可以根据需求,拷贝其他jar包,例如optional文件夹下可选的jar包,如:c3p0连接池、echcache缓存等等。。。
接下来就是配置文件了,打开project文件夹下的etc文件夹,里面有一些配置文件,这里拷贝这两个hibernate配置文件放到src路径下
hibernate可以有两种方式进行配置,一种是使用xml文件的方式,另一种则是使用properties文件了。
先写一下xml文件的配置方式
打开hibernate.properties文件,可以看到里面的很多配置,Ctrl+F查找一下mysql的配置,可以看到下面这几行
## MySQL
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
这说明要使用mysql数据库进行连接,则需要使用上面这些配置(前面为key,空格后为配置的值)。
说明一下这些配置的含义:
hibernate.dialect——表示使用的数据库方言,这里有多个值,只选一种就可以了
hibernate.connection.driver_class——数据库驱动
hibernate.connection.username——用户名
hibernate.connection.password——密码
除了数据库的配置外,还要再配置一下表的生成模式,同样Ctrl+F查找schema
有如下配置
## auto schema export
#hibernate.hbm2ddl.auto create-drop
#hibernate.hbm2ddl.auto create
#hibernate.hbm2ddl.auto update
#hibernate.hbm2ddl.auto validate
hibernate.hbm2ddl.auto配置的值:
create-drop——表示创建sessionFactory时创建表,sessionFactory关闭时删除表
create——每次sessionFactory创建时创建表
update——sessionFactory创建时创建表,存在表则不创建
validate——校验
将这些配置写到刚刚拷贝的xml文件里
xml文件中加了两个配置
hibernate.show_sql(显示sql语句)和hibernate.format_sql(格式化sql语句),值为true表示启用
下面是完整的配置文件,c3p0连接池和缓存配置根据需要加入
<!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>
<!-- mysql数据库配置 -->
<!-- 用的是5.0以上的数据库驱动,
把org.hibernate.dialect.MySQLInnoDBDialect换成
org.hibernate.dialect.MySQL5InnoDBDialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- c3p0连接池配置 -->
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 显示_格式化sql语句 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 表生成模式 -->
<!-- create-drop : 创建sessionFactory时创建表,sessionFactory关闭时删除表 -->
<!-- create : 每次sessionFactory创建时创建表 -->
<!-- update : sessionFactory创建时创建表,存在表则不创建 -->
<!-- validate : 验证 -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
配置完成,下面是数据库表和类的映射,新建一个User类来对应数据库中的一张表
@Entity(name="tb_user")
//@Table(name="tb_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
User类中的一些注解说明:
@Entity(name="tb_user")——表示此类作为一张表,name的值作为类名(也可不指定,以类名作为表名)
@Id——这个注解必须要加,将被注解的字段作为表的主键
@GeneratedValue(strategy = GenerationType.IDENTITY)——主键生成策略,strategy的值为自增长
@Column(name = "user_id")——申明被注解的字段对应数据库的字段名,name的值为数据库的字段名
再来建个test类测试一下
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//加载配置文件
Configuration configuration = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
//定义一个SessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//SessionFactory sessionFactory = configuration.buildSessionFactory();
//获得Session
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//提交事务
transaction.commit();
//关闭资源
session.close();
sessionFactory.close();
}
}
test类中被注释掉的SessionFactory sessionFactory = configuration.buildSessionFactory();这一句虽然已经被淘汰了,但还是可以使用,使用这句代码则不需要拿到服务注册对象
最后,还要在配置文件中配置好映射,把User表对应的位置添加到mapper中
<!-- 添加映射 -->
<mapping class="com.fws.domain.User"/>
运行test类,可以看到数据库中多了一张叫做tb_user的表