一、Hibernate的基本使用
通过session.creatQuery(String sql)来创建Query对象进行检索
4.QBC检索
首先需要配置相应的配置文件
Hibernate基本使用步骤
1.创建
org.hibernate.cfg.Configuration对象
2.调用configure方法将配置文件放入其中
3.调用buildSessionFactory()方法创建SessionFactory对象(该方法需要加载配置文件、创建表等等,及其耗费资源,所以一般一个项目只需要一个就足够,可以利用工具类和静态代码块使该项目中共用一个SessionFactory对象)
4.利用SessionFactory创建session对象,creatSession()创建一个Session对象
getCurrentSession()从当前线程中获得Session对象
5.开启事物,
Session.beginTransaction()
6.业务处理
7.提交处理
Hibernate几个数据库操作对象操作对象
1.利用Session直接操作对象
save();
get();直接获得对应的数据
load();延迟获得对应的数据
update();
delete();等等
关于Hibernate的延迟机制,可以在对应的class中配置
lazy属性
二、Hibernate的检索
1.对象导航检索
2.
OID检索
默认情况下load方式会延迟加载,可也在配置文件中修改延迟方式
3.HQL检索
普通查询,条件查询,投影查询,分组查询,排序等与普通SQL语句类似,select * 时 要省略 ,否则会报错
分页查询使用Query.setFirstResult(int startIndex);Query.setMaxResults(int pageSize);
参数设置:
4.QBC检索
特点:没有SQL语句,全都是方法进行检索
利用criteria.add(Restructions)来添加条件
例如:
Criteria
criteria
=
currentSession
.createCriteria(Customer.
class
);
criteria.add(Restrictions.or(Restrictions.eq("address", "深圳"), Restrictions.eq("telephone", "120")));
条件语句:
分页查询与Query语句类似;
排序查询:
查询count(*) criteria.setProjection(Projections.rowCount());
5.本地SQL检索
Session.creatSQLQuery(String sql)来创建一个本地SQL对象
然后设置实际参数进行相应的方法进行查询或者更新等语句
6.Query多表查询
迫切内连接:
select distinct c from Customer c inner join fetch c.linkmanSet
迫切左外连接:
select distinct c from Customer c left outer join fetch c.linkmanSet
ssh中hibernate模板的普通sql使用
SessionFactory sessionFactory = this.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
String sql = "select l.l_name,count(*) as count from tb_customer as c ,tb_level as l where c.l_id = l.l_id group by l.l_id";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Transformers.aliasToBean(HashMap.class));
List<Map<Object,Object>> list = query.list()
核心配置文件(默认设置文件名为hibernate.cfg.xml,放置在src目录下,如果不是需要加载配置时候设置)
<?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>
<!-- 基本四大参数
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test_frame</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库方言
#hibernate.dialect org.hibernate.dialect.MySQLDialect
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 其他辅助配置 -->
<!-- 自动创建表设置
#hibernate.hbm2ddl.auto create-drop
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- SQL语句显示设置
#hibernate.show_sql true
#hibernate.format_sql true
-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 配置数据库的事物隔离级别
1-Read uncommitted isolation 读未提交,所有隔离问题窦唯解决
2-Read cimmitted isolation 读已提交,解决了脏读
4-Repeatable read isolation 可重复读,解决了脏读、不可重复读,未解决幻读/MySQL的默认事物隔离级别
8-Serializable isolation 序列化/串行化,解决了所有问题,但效率极低
#hibernate.connection.isolation 4
-->
<property name="hibernate.connection.isolation">4</property>
<!-- 将Session与本地线程ThreadLocal绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="cn/zz/hibernate/domain/Customer.hbm.xml"/>
<mapping resource="cn/zz/hibernate/domain/Linkman.hbm.xml"/>
</session-factory>
</hibernate-configuration>
映射配置文件(建议放置在对应实体类包下,名字为实体类名.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 name="cn.zz.hibernate.domain.Customer" table="customer">
<!-- 基础单表配置 -->
<id name="cid" column="cid">
<generator class="uuid"></generator>
</id>
<property name="cname"></property>
<property name="address"></property>
<property name="level"></property>
<property name="source"></property>
<property name="telephone"></property>
<!-- 多对一表配置,多的一方 name:一的一方对应的Set集合来表示多的一方的属性名 cascade:级联操作,save-update开始级联存储,delete开启级联删除
inverse:倒转(如果为true,则不维护当前外键,反之维护) -->
<set name="linkmanSet" cascade="save-update,delete" inverse="true">
<!-- 对应的外键的字段名 -->
<key column="cid"></key>
<one-to-many class="cn.zz.hibernate.domain.Linkman" />
</set>
<!-- 多对一表配置,一的一方
name:表示多的一方对象的属性名
column:外键字段名称
cascade:联及操作,save-update开始联及存储,delete开启联及删除
inverse:倒转(如果为true,则不维护当前外键,反之维护)
-->
<many-to-one name="customer" class="cn.zz.hibernate.domain.Customer" column="cid" >
<!-- 多对多表配置
name:表示另一方对象Set集合的属性名
key:column表示第三张表中指向本类的外键名,foreign-key外建名
cascade:联及操作,save-update开始联及存储,delete开启联及删除
inverse:倒转(如果为true,则不维护当前外键,反之维护)
many-to-many:class表示对应另一方的实体类全路径,column表示第三张表中指向该类的外键名
-->
<set name="roleSet" table="user_role" cascade="save-update" inverse="false">
<key column="uid" foreign-key="uid_fk"></key>
<many-to-many class="cn.zz.hibernate.domain.Role" column="rid"></many-to-many>
</set>
</class>
</hibernate-mapping>
hibernat配置联合主键
<composite-id>
<key-many-to-one name="customer" class="cn.zz.crm.domain.Customer" column="c_id"></key-many-to-one>
<key-many-to-one name="user" class="cn.zz.crm.domain.User" column="u_id"></key-many-to-one>
</composite-id>