持久层框架hibernate
本文描述hibernate的主要配置和基本的使用
- 基础配置
首先在src目录下创建一个hibernate.cfg.xml文件,在这个文件中进行以下基础配置:
<hibernate-configuration>
<!-- 会话工厂:代表物理数据库在内存中的一个镜像 -->
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/userrolepower</property>
<property name="connection.username">root</property>
<property name="connection.password">512512zbb</property>
<!-- 设定针对数据库的方言 这里是配置mysql的方言标准 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 生成的sql语句可见 和格式化 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 配置需要作关系映射的实体类 -->
<mapping class="bwf.bin.vivian.entity.实体类名" />
......
</hibernate-configuration>
- 配置连接池
这里主要是c3p0的数据库连接池的配置
也可以使用alibaba的druid数据库连接池
<!-- 配置连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">5</property>
<property name="c3p0.idle_test_period">300</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.max_statements">100</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.timeout">90</property>
<property name="c3p0.preferredTestQuery ">select 1 from user where id=1</property>
<property name="c3p0.idleConnectionTestPeriod ">18000</property>
<property name="c3p0.maxIdleTime">25000</property>
<property name="c3p0.testConnectionOnCheckout">true</property>
- 实体类注解配置
- 在实体类的头部注解
@Entity
@Table(name=”表名”) - 在属性上注解主键id标识
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name=”主键名”) - 在其他的属性上面注解
@Column(name=”表字段”) - 注意:如果数据库表字段名和实体类的字段名相同,那么可以不用注解说明,hibernate会默认处理
- 在实体类的头部注解
- 基于hibernate实例的三种状态
- 自由状态(transient)(瞬态): 不曾进行持久化,未与任何Session相关联
- 持久化状态(persistent): 仅与一个Session相关联
- 游离状态(detached)(脱管): 已经进行过持久化,但当前未与任何Session相关联
- sessionFactory的使用
在配置文件中配置好了会化工厂后,在Java程序中如下获得:
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("/Hibernate.cfg.xml").build();
sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
在获得sessionFactory之后,可以调用openSession()方法获得一个session管理器,拿到session之后就可以基于对象来操作数据库表的数据更新了
- Session管理器API操作
Session中的方法:
1. 根据ID查询:
get、load(不常用)
区别:
get方法不延迟加载,直接发起sql语句查询;如果试图发起一个id不存在的查询,会报空指针异常
load方法属于延迟加载,不直接发起sql语句查询,得到一个代理对象模型,如果要使用这个对象的时候才会发起sql语句查询,否则只会有一个ID属性;如果发起一个id不存在的查询,会报对象找不到的异常
2. 插入对象:save、persist(不常用)
区别:
save方法持久实例,有返回标识符,会立即执行Sql insert(针对的是新的对象实例)
persist方法持久化实例,没有返回标识符,标识符的填入可能被推迟到flush的时候
3. update、merge(不常用)
区别:
update方法直接执行update语句(针对脱管状态的实例)
merge方法会先判断当前会话中是否有这个对象,没有会去数据库查询;拿到结果实例之后会把obj的值copy到对象里去,此时原来的obj会变成脱管状态
4. saveOrUpdate方法综合了save和update两个功能的实现
5. delete方法会删除一个持久化的实例,使之变成游离态的实例
6. 其他的方法
flush将session会话中持久态的对象立刻更新到数据库中
evict(obj)清除session会话缓存集合中指定的实例对象出集合
clear()清除session会话缓存集合中所有的持久化实例