持久层框架之Hibernate

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
发布了8 篇原创文章 · 获赞 0 · 访问量 115

猜你喜欢

转载自blog.csdn.net/weixin_45146962/article/details/103949122
今日推荐