现在的位置: 首页 > 综合 > 正文

Spring3整合Hibernate3.6之一:简单CRUD

2013年08月28日 ⁄ 综合 ⁄ 共 7704字 ⁄ 字号 评论关闭

本来是想拿Spring整合Hibernate4的,事实证明我道行尚浅 未遂……

看到这个异常,且在用Hibernate4的同学就要考虑Hibernate的版本问题了

(解决完这个问题发现4里边把HibernateTemplate取消掉了,所以就没再死扣)。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ' XXXXX ': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateTemplate'
defined in class path resource [applicationContext-common.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

原来弄过spring+ibatis的整合,其实道理差不多

都是spring帮忙注入,OR框架去数据库中CRUD,仅有的一点区别就是ibatis的SQL是手动的,Hibernate的HQL是自动的,所以Hibernate要实体Student用Annotation声明一下

一:model

用Hibernate的方式,声明实体、表名、主键等。

工程里不再需要 hibernate.cfg.xml 了,在spring配置文件的:hibernateProperties标签里配置就行了

@Entity//测试程序里唯一一个实体
@Table(name="t_student")//指定表名t_student
public class Student 
{
	private int studentid;
	private String name;
	private int age;
	
	public String toString()
	{
		return " id=>"+studentid+" name=>"+name+" age=>"+age;
	}
	
	//setter&getter
	@Id//主键
	@GeneratedValue//自增长
	public int getStudentid() {
		return studentid;
	}

二:具体service

业务调用具体service时候,就需要其中聚合的DaoImpl,通过setter靠spring注入

@Resource(name="StudentDAOImpl01")指定注入的名字

@Component("StudentService")//组件
public class StudentService {
	
	//下边的setter定义了将要注入的实例
	private IStudentDAO studentDAO;  
	
	public void add(Student stu) {//test调用这个add方法
		studentDAO.addStudent(stu);
	}
	public List<Student> getAll() {
		return studentDAO.selectAll();
	}

	public void delById(int id) {
		studentDAO.delStudentById(id);
	}
	
	public void updateStudent(Student stu) {
		studentDAO.updateStudent(stu);
	}
	
	public List<Student> selectByName(String name) {
		return studentDAO.selectStudentByName(name);
	}
	
	
	
	//setter&getter
	public IStudentDAO getStudentDAO() {
		return studentDAO;
	}
	@Resource(name="StudentDAOImpl01")//等StudentDAOImpl的注入
	public void setStudentDAO(IStudentDAO studentDAO) {
		this.studentDAO = studentDAO;
	}
	/*其他注入方式*/	
}

三:DaoImpl

(IDao就几个接口就不说了)

要把自己通过@Component("StudentDAOImpl01")准备好,等spring注入到上边的具体service里,靠名字识别

ibatis这里还要找到实体的配置文件,这里直接用HQL就行了,Hibernate会帮忙生成SQL语句

这用到:

hibernateTemplate.save(stu);

hibernateTemplate.delete(stu);

hibernateTemplate.update(stu);

(Student)hibernateTemplate.get(Student.class,new Integer(id)); 

hibernateTemplate.find(hql,name);

其中find里边直接写HQL就行了,需要传参的话可以第一参数是带占位符的String,后一个传值

@Component("StudentDAOImpl01")//会作为组件,注入到servise里
public class StudentDAOImpl implements IStudentDAO
{	
	private HibernateTemplate hibernateTemplate;
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}
	@Resource//等待spring配置文件里配的hibernateTemplate注入
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	//下边是HQL的具体实现
	@Override
	public void addStudent(Student stu) {//不指定id就能自动BySequence
		hibernateTemplate.save(stu);
		System.out.println("插入时返回的对象=》"+stu.getStudentid());//打印返回的值	
	}

	@Override
	public void delStudentById(int id) {
		//应该先select检查一下
		Student stu = hibernateTemplate.load(Student.class,new Integer(id));  
		hibernateTemplate.delete(stu);
	}

	@Override
	public void updateStudent(Student stu) {
		hibernateTemplate.update(stu);
	}

	@Override
	public Student selectStudentById(int id) {
		Student stu = new Student();
		stu = (Student)hibernateTemplate.get(Student.class,new Integer(id)); 
		return stu;
	}

	@Override
	public List<Student> selectStudentByName(String name) {
		String hql = "from Student t where t.name IN ?";
		List<Student> stus = new ArrayList<Student>();
		stus = (List<Student>)hibernateTemplate.find(hql,name); 
		return stus;
	}

	@Override
	public List<Student> selectAll() {
		List<Student> stus = new ArrayList<Student>();
		stus = (List<Student>)hibernateTemplate.find("from Student");
		return stus;
	}

	
}

四:spring的配置文件

1.JDBC配置

2.sessionFactory ,这里边要配上Hibernate.cfg.xml的内容

3.hibernateTemplate

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd


http://www.springframework.org/schema/tx


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


http://www.springframework.org/schema/aop


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


http://www.springframework.org/schema/context

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

	<context:annotation-config />
	<context:component-scan base-package="com.rt" />
  
  
  <!-- 1.JDBC配置:dataSource -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>
	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

<!-- 2.sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<!-- hibernate具体配置,分项写在下边 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 注入dataSource对象 -->
		<property name="dataSource" ref="dataSource" />

		<!-- 搜索带Annotation的实体 -->
		<property name="packagesToScan">
			<list>
				<value>com.rt.sidemo.model</value>
				<!--<value>com.rt.sidemo....</value> -->
			</list>
		</property>

	</bean>
<!-- Template -->
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

 

</beans>

JDBC的配置

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username=scott
jdbc.password=890307

五:test

public class StudentServiceTest 
{
	@Test
	public void testAdd() throws Exception {
		
		//Spring读取spring配置信息
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");
		//相当于从代理类得到具体实例,由xml决定怎么选择类实例化	
		StudentService service01 = (StudentService)ctx.getBean("StudentService");
			
		Student stu = new Student();//手动组装User实例 u
		//stu.setStudentid(???); 用自动增长序列
		stu.setName("Spring+Hibernate");
		stu.setAge(777);
		service01.add(stu);//把组装好的u传给xml实例化的service
			
		ctx.destroy();
	}
	
	@Test
	public void testDelById() throws Exception {	
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");
		StudentService service01 = (StudentService)ctx.getBean("StudentService");
			
		service01.delById(23);//只需要把id传给实例化的service
		
		ctx.destroy();
	}
	
	@Test
	public void testGetAll() throws Exception {	
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");
		StudentService service01 = (StudentService)ctx.getBean("StudentService");
			
		System.out.println("查询全部:");
		List<Student> stusAll = (List<Student>)service01.getAll();
		for(int i=0;i<stusAll.size();i++)
		{
			System.out.println(stusAll.get(i));
		}
		ctx.destroy();
	}
	
	@Test
	public void testUpdateStudent() throws Exception {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");	
		StudentService service01 = (StudentService)ctx.getBean("StudentService");
			
		Student stu = new Student();//手动组装User实例 u
		stu.setStudentid(25);
		stu.setName("SH");
		stu.setAge(777);
		service01.updateStudent(stu);//把组装好的u传给spring实例化的service
			
		ctx.destroy();
	}
	
	@Test
	public void testSelectByName() throws Exception {	
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");
		StudentService service01 = (StudentService)ctx.getBean("StudentService");
			
		System.out.println("查询全部:");
		String name = "SH";
		List<Student> stusAll = (List<Student>)service01.selectByName(name);
		for(int i=0;i<stusAll.size();i++)
		{
			System.out.println(stusAll.get(i));
		}
		ctx.destroy();
	}
	
}

抱歉!评论已关闭.