Hibernate相关jar包下载(官网):http://hibernate.org/orm/releases/
jar包参考文献:https://blog.csdn.net/weixin_39209728/article/details/78840663
jar包这部分也是copy这篇文章的:
hibernate 框架用到的jar包:=======================Request文件夹下的:
hibernate-core-5.2.12.Final.jar =======================核心组件
antlr-2.7.7.jar=====================================词法分析器 实现HQL语句到SQL转换
classmate-1.3.0.jar================================对属性和方法的解析
dom4j-1.6.1.jar===================================xml解析器
hibernate-commons-annotations-5.0.1.Final.jar==========注解翻译
hibernate-jpa-2.1-api-1.0.0.Final.jar====================持久化关系映射 jpa/orm标准接口
javassist-3.20.0-GA.jar==============================java字节编码器
jboss-transaction-api_1.2_spec-1.0.1.Final.jar===========事务处理
总结的Hibernate操作数据库部分:
Hibernate查询数据库的不同方法:
session进行查询:
- session.save(obj); 【保存一个对象】
- session.update(obj); 【更新一个对象】
- session.saveOrUpdate(obj); 【保存或者更新的方法】
-
- 没有设置主键,执行保存;
- 有设置主键,执行更新操作;
- 如果设置主键不存在报错!
通过主键来查询数据库的记录,从而返回一个JavaBean对象
- session.get(javaBean.class, int id); 【传入对应的class和id就可以查询】
- session.load(javaBean.class, int id); 【支持懒加载】
HQL查询:
HQL:hibernate query language 即hibernate提供的面向对象的查询语言
- 查询的是对象以及对象的属性【它查询的是对象以及属性,因此是区分大小写的!】。
SQL:Struct query language 结构化查询语言
- 查询的是表以及列【不区分大小写】
HQL是面向对象的查询语言,可以用来查询全部的数据!
Query query = session.createQuery("FROM User"); List list = query.list(); System.out.println(list); 可以传递参数: Query query = session.createQuery("FROM User WHERE id=?"); //这里的?号是从0开始的,并不像JDBC从1开始的! query.setParameter(0, user.getId()); List list = query.list(); System.out.println(list);
QBC查询:
QBC查询: query by criteria 完全面向对象的查询
从上面的HQL查询,我们就可以发现:HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码....QBC查询就是完全的面向对象查询
//创建关于user对象的criteria对象 Criteria criteria = session.createCriteria(User.class); //添加条件 criteria.add(Restrictions.eq("id", 1)); //查询全部数据 List list = criteria.list(); System.out.println(list);
本地SQL查询
有的时候,如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!
但是呢,它有一个缺陷:它是不能跨平台的...因此我们在主配置文件中已经配置了数据库的“方言“了。
//将所有的记录封装成User对象存进List集合中 SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM user").addEntity(User.class); List list = sqlQuery.list(); System.out.println(list);
利用Hibernate操作对象不同状态:
1 . 瞬态:对象由new操作符创建出来之后,还未与Hibernate Session相关联,对应的数据表中没有该对象对应的数据。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失去了对瞬态对象的引用,则该对象会被垃圾回收器处理掉。使用Hibernate Session可以将其持久化
2 .持久化:持久化对象在数据表中有对应的记录,并且有持久化标识。持久化的对象可以使刚刚被保存的,也可以是刚刚被加载的。无论哪一种,持久化对象都必须与指定的Hibernate Session关联。Hibernate会检测到持久化对象的改动,在当前操作执行完成时将改动过的数据写回数据库,而不需要在执行update。
3 . 脱管:如果某个对象曾经处于持久化状态,但随着与之关联的Session的关闭,该对象就会变为托管状态。此时数据表中依然存在与之对应的记录。这时对于托管对象的引用依然有效,可以对该托管对象进行修改。如果重新让托管对象与某个Session相关联,这个托管对象又会重新变为持久化状态,而且在托管状态进行的修改不会丢失,也能被写入数据库。
Hibernate持久化对象的状态转换图:
瞬态的对象转换为持久化状态的方法,Serializable save(Object obj) ;
Serializable save(Object obj , Object id);
void persist(Object obj) ;
void persist(Object obj ,Object id);
根据主键加载持久化实体: Object load(Object.class , Serializable id ) ;
Object get (Object.class , Serializable id )
Object find(Object.class , Serializable id )
一、Hibernate中条件查询,通过如下3个类完成。
Criteria:代表一次查询。
Criterion:代表一个条件查询。
Restrictions:产生条件查询的工具类。
执行条件查询的步骤:
1. 获取Hibernate的Session对象。
2. 以Session对象创建Criteria对象。
3. 使用Restrictions的静态方法创建Criterion查询条件。
4. 向Criteria添加Criterion查询条件。
5. 执行Criteria的list等方法返回结果。
以下是一个小例子,利于理解:
Configuration c = new Configuration().configuration();
SessionFactory sf = c.buildSessionFactory();
Session s = sf.openSession();
Criteria t = s.createCriteria(User.class);//物件表名是User;
List users = t.list();
for(Iterator it = user.iterator();it.hasnext())
{
User user = (User)it.next();
System.out.println(user.getUsername()+"\t"+user.getPassword()+"\t"+user.getAge());
}
二、hibernate提升性能方法?
1、延迟加载 Lazy Load
2、Cache缓存,一级缓存位于Session部分,二级缓存可以明显提高系统性能,一般采用的Cache工具有:默认EhCache,常用JBossCache,区别在于对cluster的支持上
3、高效的查询语句,——占位符的语法查询
4、配置,连接池 JNDI
@cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作。级联的意思是:本实体做了什么事,也要拉上 另一个关联的实体,导致另一个实体跟着做事情。就是说我删除了,你也得删除! 关联目标,指的是 关联的那个实体。
5、FetchMode是让两个表建立连接
DetachedCriteria dc = DetachedCriteria.forClass(Contract.class); dc.setFetchMode("product", FetchMode.JOIN); 合同对象设置: @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "FK_PRODUCT") Product product; 产品表没有设置。
合同表连接产品表进行查询
Hibernate相关配置文件:
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>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///db40</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql
<property name="hibernate.format_sql">true</property> -->
<!-- 2.3 自动建表
<property name="hibernate.hbm2ddl.auto">create</property> -->
<!--3. 加载所有映射-->
<mapping resource="com/aitou/model/car.hbm.xml"/>
</session-factory>
</hibernate-configuration>
xxx.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 package="com.aitou.model">
<!--类名为User,表名也为User-->
<class name="Car" table="car">
<!--主键映射,属性名为id,列名也为id-->
<id name="id" column="id"></id>
<!--非主键映射,属性和列名一一对应-->
<property name="model" column="model"/>
<property name="make" column="make"/>
<property name="preview" column="preview"/>
<property name="description" column="description"/>
<property name="price" column="price"/>
</class>
</hibernate-mapping>
log4j.properties
#
# Hibernate, Relational Persistence for Idiomatic Java
#
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
#
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
#log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace