首先导入hibernate 需要到的jar包
然后在src下面配置hibernate.cfg.xml,这里面是连接数据库需要的信息
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 以上是必输属性,下面是可选属性 -->
<!--DDL策略
create:表示启动的时候先drop,再create (测试人员 准备标准测试数据)
create-drop: 也表示创建,只不过再系统关闭前执行一下drop (测试程序是否正确)
update: 这个操作启动的时候会去检查表结构是否一致,如果不一致就会更新表结构 (可以建表,更新表结构【只能加】,比如将映射文件中的name改为cname,这时候会在表中给我们增加一列cname,而不是将name改为cname)
validate: 启动时验证现有表与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
在产品开发中 update 和 validate 使用较多,create、create-drop在测试环境下用的较多
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!-- <property name="hibernate.format_sql">true</property> -->
<!-- 事务是否自动提交
* 用于解决 没有开启事务的操作时,事务如何自动处理
注意如果自己手动开启了事务,没有commit,这个也不会提交到数据库
* 默认事务 自动回滚
-->
<property name="hibernate.connection.autocommit">true</property>
<!-- 数据库连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<!-- 配置映射文件 -->
<mapping resource="com/zz/entity/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后是Customer.hbm.xml文件:配置表的映射信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--类和表之间的映射 -->
<class catalog="hibernate1" table="customer" name="com.zz.entity.Customer">
<!-- 主键 -->
<id name="id" column="id" type="int">
<!--主键生成策略
常见的主键生成策略:
1.increament hibernate以递增的方式为代理主键赋值
原理: select max(id) ,insert max(id)+1
自动建表:使用increment创建的数据库表没有自动增长
优点:通过hibernate内部完成,可以跨平台
缺点:高并发时访问,可能会造成主键冲突问题
使用debug模拟并发
2.identity (无线程问题)----mysql
以底层数据库负责生成表示符,它要求底层数据库把主键定义为自动增长字段类型
原理:依赖数据库内部实现,与hibernate无关
自动建表:使用increment创建的数据库表没有自动增长
优点:无需程序处理,数据库自己完成主键增长
缺点:mysql支持主键自增长,oracle不支持
3.sequence ---Oracle
sequence 标识符生成器利用底层数据库提供的序列来完成标识符
原理:依赖数据库序列支持,和hibernate程序无关
Oracle 支持序列,mysql不支持序列
序列原理:create sequence customer_seq
insert into customer(id) values(customer_seq.nextval);
4.native
native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity,sequence或hilo标识符生成器。
mysql 自动选择identity
oracle 自动选择sequence
5.uuid uuid的主键生成 采用String类型主键
随机生成32位字符串
6.assigned
必须用户在程序中指定,无法自动生成
-->
<generator class="identity"></generator>
</id>
<!-- 普通属性 -->
<property name="name" column="name" type="java.lang.String"/>
<property name="age" column="age" type="int"/>
<property name="city">
<column name="city" sql-type="varchar(20)"></column>
</property>
</class>
</hibernate-mapping>
注意这两个配置文件里面引入的dtd文件是不一样的,具体的可以从下载的jar包hibernate3.jar下面有两个相关文件中复制
junit测试一下
@Test
public void testSave(){
// 实例化配置对象,加载配置文件 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话连接工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
//这里可以编写hibernate操作代码逻辑 (********************************************************)
Customer c1 = new Customer();
c1.setAge(20);
c1.setCity("浙江杭州");
c1.setName("张三丰");
session.save(c1);
// 提交事务,释放资源
transaction.commit();
session.close();
sessionFactory.close();
}