spring 整合 hibernate和 mybatis 区别

hibernate整合和mybatis区别

JPA和Hibernate到底是什么关系

在学习框架的过程中,发现学的东西很多,但是感觉他们之间的联系区别都不是很了解,知道JPA可以去实现持久化数据到数据库当中,Hibernate也有这样的功能,总以为他们之间是一种平级的关系,拥有同样的作用,是一种可以相互替代的关系,就像你吃饭时,选择吃米饭和吃面条一样,然而,在进行了一番搜索之后,发现并不是那么回事儿。

JPA本身是一种规范,它的本质是一种ORM规范(不是ORM框架,因为JPA并未提供ORM实现,只是制定了规范)因为JPA是一种规范,所以,只是提供了一些相关的接口,但是接口并不能直接使用,JPA底层需要某种JPA实现,JPA现在就是Hibernate功能的一个子集

Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的 JPA(Java Persistence API) 兼容认证。JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现,并不是对标关系,借用下图可以看清楚他们之间的关系,Hibernate属于遵循JPA规范的一种实现,但是JPA是Hibernate遵循的规范之一,Hibernate还有其他实现的规范,所以它们的关系更像是JPA是一种做面条的规范,而Hibernate是一种遵循做面条的规范的汤面,他不仅遵循了做面条的规范,同时也会遵循做汤和调料的其他规范,他们之间并不是吃面条和吃米饭的关系

img

1.JPA

JPA全称: Java Persistence API,JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA的出现有两个原因:
其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;
其二,Sun希望整合对ORM技术,实现持久化领域的统一。

Sun之所以提出JPA规范,其目的是以官方身份来统一各种ORM框架的规范,包括著名的Hibernate、TopLink等

不过JPA规范给开发者带来了福音:开发者面向JPA规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现……这样开发者可以避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架

JPA提供的技术:
(1)ORM映射元数据
JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持
久化到数据库表中;
(2)JPA 的API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解
脱出来。
(3)查询语言
通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合

\2. Hibernate

JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个。

例如:

(1)实体对象的状态,在Hibernate有自由、持久、游离三种,JPA里有new,managed,detached,removed,而这些状态都是一一对应的。

(2)flush方法,都是对应的,

(3)Query query = manager.createQuery(sql),它在Hibernate里写法上是session,而在JPA中变成了 manager

\3. JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。

那么Hibernate是如何实现与JPA 的这种关系的呢?

Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

(1)hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及 Hibernate自身特殊功能的annotation。

(2)hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。

(3)hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

总的来说,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。

题外的一些思考:如果抛开JPA直接使用Hibernate的注解来定义一个实例,很快发现了几个问题:

  1. jpa中有Entity, Table,hibernate中也有,但是内容不同
  2. jpa中有Column,OneToMany等,Hibernate中没有,也没有替代品

​ hibernate对jpa的支持,不是另提供了一套专用于jpa的注解。一些重要的注解如Column, OneToMany等,hibernate没有提供,这说明jpa的注解已经是hibernate 的核心,hibernate只提供了一些补充,而不是两套注解。要是这样,hibernate对jpa的支持还真够足量,我们要使用hibernate注解就必定要使用jpa。

两个额外的问题:

第一个是问如果想用hibernate注解,是不是一定会用到jpa的。网友的回答:“是。如果hibernate认为jpa的注解够用,就直接用。否则会弄一个自己的出来作为补充”

第二个是问,jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用?网友回答说“Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可”

要是还是不理解 就简单理解 jpa就是hibernate 就OK了

spring整合jap(hibernate)

jap是封装hibernate

一 创建项目导入jar包

1.1 新建Maven项目(01-spring-data-hibernate)

1.2 修改pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>

	<groupId>com.bjsxt</groupId>



	<artifactId>01-spring-data-hibernate</artifactId>



	<version>0.0.1-SNAPSHOT</version>



 



	<properties>



		<spring.version>4.3.23.RELEASE</spring.version>



		<hibernate.version>5.1.17.Final</hibernate.version>



		<mysql.version>5.1.47</mysql.version>



		<c3p0.version>0.9.2.1</c3p0.version>



		<junit.version>4.12</junit.version>



		<lombok.version>1.18.6</lombok.version>



	</properties>



 



	<dependencies>



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-core</artifactId>



			<version>${spring.version}</version>



		</dependency>



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-context</artifactId>



			<version>${spring.version}</version>



		</dependency>



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-aspects</artifactId>



			<version>${spring.version}</version>



		</dependency>



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-aop</artifactId>



			<version>${spring.version}</version>



		</dependency>



 



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-jdbc</artifactId>



			<version>${spring.version}</version>



		</dependency>



 



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-orm</artifactId>



			<version>${spring.version}</version>



		</dependency>



 



		<dependency>



			<groupId>org.springframework</groupId>



			<artifactId>spring-test</artifactId>



			<version>${spring.version}</version>



		</dependency>



 



		<dependency>



			<groupId>org.hibernate</groupId>



			<artifactId>hibernate-core</artifactId>



			<version>${hibernate.version}</version>



		</dependency>



 



		<dependency>



			<groupId>mysql</groupId>



			<artifactId>mysql-connector-java</artifactId>



			<version>${mysql.version}</version>



		</dependency>



 



		<dependency>



			<groupId>com.mchange</groupId>



			<artifactId>c3p0</artifactId>



			<version>${c3p0.version}</version>



		</dependency>



 



		<dependency>



			<groupId>junit</groupId>



			<artifactId>junit</artifactId>



			<version>${junit.version}</version>



			<scope>test</scope>



		</dependency>



 



		<dependency>



			<groupId>org.projectlombok</groupId>



			<artifactId>lombok</artifactId>



			<version>${lombok.version}</version>



			<scope>provided</scope>



		</dependency>



 



	</dependencies>



</project>

二 定义Spring整合Hibernate的配置文件

2.1 添加jdbc.properties文件

jdbc.url=jdbc:mysql://localhost:3306/spring-data-test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT



#jdbc.url=jdbc:mysql://localhost:3306/spring-data-test 这个保存到数据库中会导致乱码



jdbc.driver.class=com.mysql.jdbc.Driver



jdbc.username=root



jdbc.password=123456

2.2 添加applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>



<beans xmlns="http://www.springframework.org/schema/beans"



	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"



	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"



	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd



		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd



		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd



		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">



 



	<!-- 配置读取properties文件的工具类 -->



	<context:property-placeholder location="classpath:jdbc.properties" />



 



	<!-- 配置c3p0数据库连接池 -->



	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">



		<property name="jdbcUrl" value="${jdbc.url}" />



		<property name="driverClass" value="${jdbc.driver.class}" />



		<property name="user" value="${jdbc.username}" />



		<property name="password" value="${jdbc.password}" />



	</bean>



 



	<!-- 配置hibernate的sessionFactory -->



	<bean id="sessionFactory"



		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">



		<property name="dataSource" ref="dataSource" />



		<!-- hibernateProperties属性:配置与hibernate相关内容,如显示sql语句,开启正向工程 -->



		<property name="hibernateProperties">



			<value>



				<!-- hibernate.dialect=org.hibernate.dialect.HSQLDialect -->



				<!-- 显示当前执行的sql -->



				hibernate.show_sql=true



				<!-- 开启正向工程 -->



				hibernate.hbm2ddl.auto=update



			</value>



		</property>



		<!-- 扫描实体所在的包 -->



		<property name="packagesToScan">



			<list>



				<value>com.bjsxt.pojo</value>



			</list>



		</property>



	</bean>



 



	<!-- 配置hibernate的事务管理器 -->



	<bean id="transactionManager"



		class="org.springframework.orm.hibernate5.HibernateTransactionManager">



		<property name="sessionFactory" ref="sessionFactory" />



	</bean>



 



	<!-- 配置开启注解事务处理 -->



	<tx:annotation-driven transaction-manager="transactionManager"/>



 



	<!-- 配置springIOC的注解扫描 -->



	<context:component-scan base-package="com.bjsxt"></context:component-scan>



</beans>

三 通过Hibernate完成CRUD操作

3.1 创建数据库(spring-data-test)

CREATE DATABASE `spring-data-test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

3.2 创建Users实体类

package com.bjsxt.pojo;



 



import java.io.Serializable;



 



import javax.persistence.Column;



import javax.persistence.Entity;



import javax.persistence.GeneratedValue;



import javax.persistence.GenerationType;



import javax.persistence.Id;



import javax.persistence.Table;



 



import lombok.Data;



 



@Entity



@Table(name="ts_users")



@Data



public class Users implements Serializable{



	/**



	 * 



	 */



	private static final long serialVersionUID = 1L;



	@Id//主键id



	@GeneratedValue(strategy=GenerationType.IDENTITY)//自增主键//表和实体类名字



	@Column(name="id") //表和实体类名字



	private Long id;



	



	@Column(name="user_name")//



	private String userName;



	



	@Column(name="age")



	private Integer age;



}

3.3 编写UsersDao接及其实现类

3.3.1 修改applicationContext.xml配置文件,添加HibernateTemplate的配置

	<!-- 配置HibernateTemplate对象 -->



	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">



		<property name="sessionFactory" ref="sessionFactory" />



	</bean>

3.3.2 编写UsersDao接口

package com.bjsxt.dao;



 



import com.bjsxt.pojo.Users;



 



public interface UsersDao {



	void insertUsers(Users users);



	



	void updateUsers(Users users);



	



	void deleteUsers(Users users);



	



	Users selectUserById(Long id);



}

3.3.3 编写实现类

package com.bjsxt.dao.impl;



 



import org.springframework.beans.factory.annotation.Autowired;



import org.springframework.orm.hibernate5.HibernateTemplate;



import org.springframework.stereotype.Repository;



 



import com.bjsxt.dao.UsersDao;



import com.bjsxt.pojo.Users;



 



@Repository



public class UsersDaoImpl implements UsersDao {



	



	@Autowired



	private HibernateTemplate hibernateTemplate;



 



	public void insertUsers(Users users) {



		this.hibernateTemplate.save(users);



	}



 



	public void updateUsers(Users users) {



		this.hibernateTemplate.update(users);



	}



 



	public void deleteUsers(Users users) {



		this.hibernateTemplate.delete(users);



	}



 



	public Users selectUserById(Long id) {



		return this.hibernateTemplate.get(Users.class, id);



	}



 



}

3.4 编写测试类

package com.bjsxt.dao.impl;



 



import org.junit.Test;



import org.junit.runner.RunWith;



import org.springframework.beans.factory.annotation.Autowired;



import org.springframework.test.annotation.Rollback;



import org.springframework.test.context.ContextConfiguration;



import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;



import org.springframework.transaction.annotation.Transactional;



 



import com.bjsxt.dao.UsersDao;



import com.bjsxt.pojo.Users;



 



@RunWith(SpringJUnit4ClassRunner.class)



@ContextConfiguration("classpath:applicationContext.xml")



public class UsersDaoImplTest {



	



	@Autowired



	private UsersDao userDao;



 



	/**



	 * 执行结果:



	 	Hibernate: create table ts_users (id bigint not null auto_increment, age integer, user_name varchar(255), primary key (id))



		四月 28, 2019 10:12:33 上午 org.springframework.orm.hibernate5.HibernateTransactionManager afterPropertiesSet



		信息: Using DataSource [com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge0z0a2r41tzootyzcc|61862a7f, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge0z0a2r41tzootyzcc|61862a7f, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/spring-data-test, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]] of Hibernate SessionFactory for HibernateTransactionManager



		四月 28, 2019 10:12:33 上午 org.springframework.test.context.transaction.TransactionContext startTransaction



		信息: Began transaction (1) for test context [DefaultTestContext@4aeaadc1 testClass = UsersDaoImplTest, testInstance = com.bjsxt.dao.impl.UsersDaoImplTest@263558c9, testMethod = testInsertUsers@UsersDaoImplTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@3c8bdd5b testClass = UsersDaoImplTest, locations = '{classpath:applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.hibernate5.HibernateTransactionManager@52eacb4b]; rollback [true]



		Hibernate: insert into ts_users (age, user_name) values (?, ?)



		但是虽然有insert 语句但是表里并没有对应的记录生成,原因是在测试类中对于事务提交方式默认的是回滚的



		解决办法(注意:只有在测试类中):



		在添加@Rollback(false)注解



		但是会乱码,解决办法如下:



		在jdbc.properties中修改jdbc.url配置为jdbc.url=jdbc:mysql://localhost:3306/spring-data-test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT



	 */



	@Test



	@Transactional



	@Rollback(false)



	public void testInsertUsers() {



		Users users = new Users();



		users.setAge(18);



		users.setUserName("路飞");



		this.userDao.insertUsers(users);



	}



 



	/**



	 * 执行结果:



		信息: Began transaction (1) for test context [DefaultTestContext@7de4a01f testClass = UsersDaoImplTest, testInstance = com.bjsxt.dao.impl.UsersDaoImplTest@2bfeb1ef, testMethod = testUpdateUsers@UsersDaoImplTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@5167268 testClass = UsersDaoImplTest, locations = '{classpath:applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.hibernate5.HibernateTransactionManager@d816dde]; rollback [false]



		Hibernate: update ts_users set age=?, user_name=? where id=?



		四月 28, 2019 10:25:42 上午 org.springframework.test.context.transaction.TransactionContext endTransaction



	 */



	@Test



	@Transactional



	@Rollback(false)



	public void testUpdateUsers() {



		Users users = new Users();



		users.setId(5l);



		users.setAge(28);



		users.setUserName("路飞-海贼王");



		this.userDao.updateUsers(users);



	}



	



	/**



	 * 执行结果:



	 	信息: Began transaction (1) for test context [DefaultTestContext@2bfeb1ef testClass = UsersDaoImplTest, testInstance = com.bjsxt.dao.impl.UsersDaoImplTest@778ca8ef, testMethod = testDeleteUsers@UsersDaoImplTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@1cfd1875 testClass = UsersDaoImplTest, locations = '{classpath:applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.hibernate5.HibernateTransactionManager@6e33c391]; rollback [false]



		Hibernate: delete from ts_users where id=?



		四月 28, 2019 10:28:55 上午 org.springframework.test.context.transaction.TransactionContext endTransaction



	 */



	@Test



	@Transactional



	@Rollback(false)



	public void testDeleteUsers() {



		Users users = new Users();



		users.setId(2l);



		this.userDao.deleteUsers(users);



	}



 



	/**



	 * 执行结果:



		Hibernate: select users0_.id as id1_0_0_, users0_.age as age2_0_0_, users0_.user_name as user_nam3_0_0_ from ts_users users0_ where users0_.id=?



		Users(id=5, userName=路飞-海贼王, age=28)



	 */



	@Test



	public void testSelectUserById() {



		Users users = this.userDao.selectUserById(5l);



		System.out.println(users);



	}



 



}

yml配置

sring
jpa:
hibernate :
更新或者创建数据表结构
ddl-auto: update
控制台显示SQL
show-sql: true

spring整合hibernate

先创建项目

到依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.bjsxt</groupId>
	<artifactId>01-spring-data-hibernate</artifactId>
	<version>0.0.1-SNAPSHOT</version>
 
	<properties>
		<spring.version>4.3.23.RELEASE</spring.version>
		<hibernate.version>5.1.17.Final</hibernate.version>
		<mysql.version>5.1.47</mysql.version>
		<c3p0.version>0.9.2.1</c3p0.version>
		<junit.version>4.12</junit.version>
		<lombok.version>1.18.6</lombok.version>
	</properties>
 
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
 
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
 
		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>${c3p0.version}</version>
		</dependency>
 
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
 
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>${lombok.version}</version>
			<scope>provided</scope>
		</dependency>
 
	</dependencies>
</project>

定义Spring整合Hibernate的配置文件

添加jdbc.properties文件

jdbc.url=jdbc:mysql://localhost:3306/spring-data-test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
#jdbc.url=jdbc:mysql://localhost:3306/spring-data-test 这个保存到数据库中会导致乱码
jdbc.driver.class=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

添加applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
	<!-- 配置读取properties文件的工具类 -->
	<context:property-placeholder location="classpath:jdbc.properties" />
 
	<!-- 配置c3p0数据库连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="driverClass" value="${jdbc.driver.class}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
 
	<!-- 配置hibernate的sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- hibernateProperties属性:配置与hibernate相关内容,如显示sql语句,开启正向工程 -->
		<property name="hibernateProperties">
			<value>
				<!-- hibernate.dialect=org.hibernate.dialect.HSQLDialect -->
				<!-- 显示当前执行的sql -->
				<!-- <prop key="hibernate.dialect">${hibernate.dialect}</prop>   执行的sql语句的样子-->
				 <!--<prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 格式化sql语句-->
				hibernate.show_sql=true
				<!-- 开启正向工程  创建表格-->
				hibernate.hbm2ddl.auto=update
			</value>
		</property>
		<!-- 扫描实体所在的包 -->
		<property name="packagesToScan">
			<list>
				<value>com.bjsxt.pojo</value>
			</list>
		</property>
	</bean>
 
	<!-- 配置hibernate的事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
 
	<!-- 配置开启注解事务处理 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
 
	<!-- 配置springIOC的注解扫描 -->
	<context:component-scan base-package="com.bjsxt"></context:component-scan>
</beans>

修改applicationContext.xml配置文件,添加HibernateTemplate的配置

	<!-- 配置HibernateTemplate对象 -->



	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">



		<property name="sessionFactory" ref="sessionFactory" />



	</bean>

HQL查询语句

HQL:Hibernate Query Language
HQL的语法:就是将原来的sql,语句中的表与字段名称换成对象与属性的名称就可以了|

Override
public List<Users>selectUs.erByName(String username) {
l/get.CunrentSession:当前session必须要有事务边界,且只能处理唯一
的一个事务。当事务提交或者回滚后session自动失效
ll openSes.sion:每次都会打开一个新的 session.加入每次使用多次。则获
得的是不同session对象。使用完毕后我们需要手动的调用colse.方法关闭session
Session session =
this.hibernateTemplate -getSessionFactory()-getCurrentSes.sion( );
//sal.;select * from t_users where username =
Query query = session.createQueny( "from Users where username:abc" );
Query queryTemp = query - setS.tring("abs" ,username);
return gueryTemp.list();
@Test
@Transactional
public void testselectUserByName(){
List<Users> list = this.usersDao.selectUserByName( "张三");for (Users users : list) {
System.out.println(users);
}

sql查询语言

@Override
public List<Users> selec.tUserBxNameUs.eSQL.(String username) {
Session session =
this.hibecnateTemplate-getSessionEactocy()-getCunnentSes.sion();
Query query = session . cneateSQL.Query( "select * from t_users
where username = ?" ) . addEntity(Users.class). setString(0,username);
return query . list();
}
**
* SQL测试*/
@Test
@Inan.sastional.
public void testSelectUserBxNameUs.esQL(){
List<Users> list = this. usersDao. selectUserByNameUseSQL("张三
');
for (Users users : list) {
System.out. pnintln(users );
}
}

qbc查询

qbc:Query By Criteria

hibernate和Mybatis区别

Hibernate的优点:

1、hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。

2、功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。

3、有更好的二级缓存机制,可以使用第三方缓存。

4、数据库移植性良好。

5、hibernate拥有完整的日志系统,hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等

Hibernate的缺点:

1、学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行

2、hibernate的sql很多都是自动生成的,无法直接维护sql;虽然有hql查询,但功能还是不及sql强大,见到报表等变态需求时,hql查询要虚,也就是说hql查询是有局限的;hibernate虽然也支持原生sql查询,但开发模式上却与orm不同,需要转换思维,因此使用上有些不方便。总之写sql的灵活度上hibernate不及mybatis。

Mybatis的优点:

1、易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

2、sql写在xml里,便于统一管理和优化, 解除sql与程序代码的耦合。

3、提供映射标签,支持对象与数据库的orm字段关系映射

4、 提供对象关系映射标签,支持对象关系组建维护

5、提供xml标签,支持编写动态sql。

6、速度相对于Hibernate的速度较快

Mybatis的缺点:

1、关联表多时,字段多的时候,sql工作量很大。

2、sql依赖于数据库,导致数据库移植性差。

3、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

4、对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。

5、DAO层过于简单,对象组装的工作量较大。

6、不支持级联更新、级联删除。

7、Mybatis的日志除了基本记录功能外,其它功能薄弱很多。

8、编写动态sql时,不方便调试,尤其逻辑复杂时。

9、提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值