1. 程式人生 > >hibernate常用介面的使用(sessionFactory,session,query,transation,query,criteria的使用)

hibernate常用介面的使用(sessionFactory,session,query,transation,query,criteria的使用)

說明:sessionFactory spring 提供了連線池我們直接從spring 容器中獲取 sessionFactory

程式碼如下:

<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<!-- 資料庫的連線資訊,使用的是資料來源的方式jdbc/dbcp/c3p0 -->
	<!-- 配置資料來源,將資料來源交給spring容器管理 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433; DatabaseName=cjda" />
		<property name="user" value="sa" />
		<property name="password" value="root" />
		<!--初始化時獲取的連線數,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
		<property name="initialPoolSize" value="1" />
		<!--連線池中保留的最小連線數。 -->
		<property name="minPoolSize" value="1" />
		<!--連線池中保留的最大連線數。Default: 15 -->
		<property name="maxPoolSize" value="300" />
		<!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0 -->
		<property name="maxIdleTime" value="60" />
		<!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。Default: 3 -->
		<property name="acquireIncrement" value="5" />
		<!--每60秒檢查所有連線池中的空閒連線。Default: 0 -->
		<property name="idleConnectionTestPeriod" value="60" />
	</bean>
	
	<!-- 註解掃描包 -->
	<context:component-scan base-package="com.mstf" />
	
	<!-- 配置sessionFactory 工廠 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 引入hibernate的主配置檔案 -->
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>
	
	<!-- 配置事物 -->
	<!-- 定義一個事物管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 定義一個切面來進行事物管理 -->
	<tx:advice id="personTransaction" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut expression="execution(* com.mstf.service..*.*(..))"
			id="personPontCut" />
		<aop:advisor advice-ref="personTransaction" pointcut-ref="personPontCut" />
	</aop:config>
	
	<!-- 將業務層交給spring容器來管理 -->
 	<bean id="infoServiceImpl" class="com.mstf.service.impl.InfoServiceImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!--將action交給spring容器來管理 -->
	<bean id="infoAction" class="com.mstf.action.InfoAction">
		<property name="infoService" ref="infoServiceImpl" />
	</bean>
	
	<!-- 將業務層交給spring容器來管理 -->
 	<bean id="userServiceImpl" class="com.mstf.service.impl.UserServiceImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!--將action交給spring容器來管理 -->
	<bean id="userAction" class="com.mstf.action.UserAction">
		<property name="userService" ref="userServiceImpl" />
	</bean>
	
	<bean id="resultTypeAction" class="com.mstf.action.ResultTypeAction">
		<property name="infoService" ref="infoServiceImpl" />
	</bean>
	
	
<!-- 	<bean id="testJob" class="">
	
		<property name=""></property>
	</bean>
	
	<bean id="testTriggers" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="testJob"></property>
	</bean>
	
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
			<property name="triggers">
				<list>
				  	<ref bean="testTriggers"/>
				</list>
			</property>
	</bean> -->
</beans>

獲取sessionFactory例項:

    ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
	SessionFactory sessionFactory = (SessionFactory) ac.getBean("sessionFactory");;
	Session session = sessionFactory.openSession();
	Transaction transaction = session.beginTransaction();

現在使用 Query 介面進行常見的查詢

查詢資料庫語句:

USE [cjda]
GO

/****** Object:  Table [dbo].[t_user]    Script Date: 10/08/2018 21:47:08 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[t_user](
	[user_id] [int] IDENTITY(1,1) NOT NULL,
	[username] [varchar](50) NOT NULL,
	[password] [varchar](50) NOT NULL,
	[age] [int] NOT NULL,
	[priority] [int] NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[t_user] ADD  DEFAULT ('0') FOR [priority]
GO



查詢方法:

@Test
	public void queryTest(){
		
		// 臨時狀態 指的是 物件剛建立 還未放大 session 中去
		
		// save() ,saveOrupdate()
		
		User user = new User();
		transaction.begin();
		user.setAge(12);
		user.setUsername("jiang");
		user.setPassword("11111");
	//	session.save(user);
		// 查詢列表
		
		
		// 1.使用sql語句進行查詢
		String sql ="select u.* from t_user  u";
		
		Query sqlquery = session.createSQLQuery(sql).addEntity(User.class);
		
		List<User> sqlList = sqlquery.list();
		
		System.out.println("原生sql:查詢出的資料"+sqlList.toString());
		
		// 2. 使用hql語句進行查詢
		
		//String hql = "FORM User";
		
		String hql = "select new User(username,password,age,priority) FROM User";
		
		List<User> listhql = session.createQuery(hql).list();
		
		System.out.println("通過hql查詢出的值:"+listhql.toString());
		
		
		// 分頁查詢 setFirstResult(start) setMaxResult(end)
		List<User> listpage  = session.createQuery(hql).setFirstResult(2).setMaxResults(4).list();
		
		System.out.println(listpage.toString());
		
		
		// 模糊查詢方式 和條件查詢一樣 條件查詢直接將引數放入即可
		
		String hqlmm = "from User where username like :username";
		
		Query query1  = session.createQuery(hqlmm).setString("username", "%"+"jian"+"%");
		
		List<User> list1 =  query1.list();
		
		transaction.commit();
		session.close();
		
		}