整合Hibernate和spring需要的依赖
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Maven_SSH</groupId> <artifactId>Maven_SSH</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>Maven_SSH Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 改版本用 properties里面的键可以随便写 --> <properties> <spring.version>4.3.10.RELEASE</spring.version> <struts.version>2.3.33</struts.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 引入Servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0-b07</version> <scope>provided</scope> </dependency> <!-- 加入hibernate核心库 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.10.Final</version> </dependency> <!-- 引入MySQL依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.18</version> </dependency> <!-- 加入Spring核心库依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring整合Hibernate依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- spring 的AspectJ依赖,解析事务切点 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- 加入c3p0数据库连接池依赖 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- 引入struts2依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts.version}</version> </dependency> <!-- struts2整合Spring插件的整合包 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts.version}</version> </dependency> <!--json-lib依赖--> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> </dependencies> <build> <finalName>Maven_SSH</finalName> </build> </project> 第一步:把Hibernate写好,先把Hibernate需要的依赖导进来,写一个entity的类package com.zking.entity; public class Person { private int pid; private String pname; private String psex; private int page; public Person() { } public Person(int pid) { this.pid = pid; } public Person(String pname, String psex, int page) { this.pname = pname; this.psex = psex; this.page = page; } public Person(int pid, String pname, String psex, int page) { super(); this.pid = pid; this.pname = pname; this.psex = psex; this.page = page; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public String getPsex() { return psex; } public void setPsex(String psex) { this.psex = psex; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } } 在写一个person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2017-8-29 21:34:37 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.zking.entity.Person" table="PERSON"> <id name="pid" type="int"> <column name="PID" /> <generator class="native" /> </id> <property name="pname" type="java.lang.String"> <column name="PNAME" /> </property> <property name="psex" type="java.lang.String"> <column name="PSEX" /> </property> <property name="page" type="int"> <column name="PAGE" /> </property> </class> </hibernate-mapping> 在把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> <!-- 整合之后就不要了 --> <!-- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- 整合之后就不要了 --><!-- <mapping resource="com/zking/entity/Person.hbm.xml"/> --> </session-factory></hibernate-configuration> 最后把Hibernate测试一下再把spring的依赖导进来
package com.zking.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import com.zking.entity.Person; public class TestHibernate { @Test public void test(){ Configuration configuration=new Configuration().configure(); SessionFactory sessionFactory=configuration.buildSessionFactory(); Session session=sessionFactory.openSession(); Transaction transaction=session.beginTransaction(); session.save(new Person("郁郁", "男", 41)); transaction.commit(); session.close(); sessionFactory.close(); } }
第二步:写一个db.properties,连接数据库用的,不过这一步还没有和数据库连接
uname=root upass=root url=jdbc:mysql://localhost:3306/test driver_class=com.mysql.jdbc.Driver initPoolSize=3 maxPoolSize=20所有我们要写一个applicationContext-public.xml,在这里面引入db.properties
<?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-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 1.引入db.properties --> <context:property-placeholder location="classpath:db.properties"/> <!-- 2.配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${uname}"></property> <property name="password" value="${upass}"></property> <property name="jdbcUrl" value="${url}"></property> <property name="driverClass" value="${driver_class}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSize}"></property> </bean> <!-- 3.配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 01.引入数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 02.加载Hibernate配置文件 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 03.加载Hibernate映射文件 --> <property name="mappingLocations" value="classpath:com/zking/entity/*.hbm.xml"></property> </bean> <!-- 4.配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 5.配置事务的属性 --> <!-- 事务的底层是advice通知 --> <tx:advice id="myAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- propagation="REQUIRED"需要有属性 --> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 6.配置事务的切点 --> <aop:config> <aop:pointcut expression="execution(* com.zking.dao.*.*(..))" id="myCut"/> <aop:advisor advice-ref="myAdvice" pointcut-ref="myCut"/> </aop:config> </beans> spring的applicationContext不只可以写applicationContext-public.xml,还可以有dao、biz、action等名字可以随便写,但是要“applicationContext-”要一致,否则会报错。
applicationContext-dao.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 配置personDaoImp --> <bean id="personDaoImp" class="com.zking.dao.PersonDaoImp"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans> applicationContext-biz.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 配置personBizImp --> <bean id="personBizImp" class="com.zking.biz.PersonBizImp"> <property name="personDao" ref="personDaoImp"></property> </bean> </beans> applicationContext-action.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 配置PersonAction --> <bean id="personAction" class="com.zking.action.PersonAction" scope="prototype"> <property name="personBiz" ref="personBizImp"></property> </bean> </beans> 在这我就只写dao方法了,其他的和以前差不多,只是在里面我们不是用new了,用的是注入举个栗子:在biz里我们要调用dao里的方法:
public PersonDao personDao; public PersonDao getPersonDao() { return personDao; } public void setPersonDao(PersonDao personDao) { this.personDao = personDao; }
//添加 public void addPerson(Person person) { personDao.addPerson(person); }
package com.zking.dao; import java.io.Serializable; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.zking.entity.Person; public class PersonDaoImp implements PersonDao{ //注入一个sessionFactory private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession(){ return sessionFactory.getCurrentSession(); } //添加 public void addPerson(Person person) { Person users=new Person(person.getPname(), person.getPsex(), person.getPage()); Serializable Serializable = getSession().save(users); int a=(Integer) Serializable; System.out.println(a); } //修改 public void updatePerson(Person person) { Person persons=getSession().get(Person.class, person.getPid()); persons.setPname(person.getPname()); persons.setPsex(person.getPsex()); persons.setPage(person.getPage()); getSession().update(persons); } //删除 public void deletePerson(int pid) { Person person=new Person(); person.setPid(pid); getSession().delete(person); } //查询 public List<Person> getAll() { //查询所有 List<Person> list=getSession().createQuery("from Person").list(); return list; } //分页查询 public List<Person> getAll(int pageNo, int pageSize) { //分页 List<Person> list=getSession().createQuery("from Person").setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list(); return list; } public int IntCount() { int n=Integer.parseInt(getSession().createQuery("select count(*) from Person").uniqueResult().toString()); return n; } }
在写一个personAction.java
package com.zking.action; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import com.zking.biz.PersonBiz; import com.zking.entity.Person; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class PersonAction extends ActionSupport{ HttpServletResponse resp=ServletActionContext.getResponse(); HttpServletRequest req=ServletActionContext.getRequest(); private Person person; private PersonBiz personBiz; private int pid; private String pname; private String psex; private int page; //添加 public String add() throws Exception { System.out.println("进来了PersonAction。。。add"); resp.setContentType("text/html; charset=UTF-8"); req.setCharacterEncoding("UTF-8"); personBiz.addPerson(new Person(pname, psex, page)); return null; } //修改 public String update() throws Exception{ System.out.println("进来了PersonAction。。。update"); resp.setContentType("text/html; charset=UTF-8"); req.setCharacterEncoding("UTF-8"); personBiz.updatePerson(new Person(pname, psex, page)); return null; } //删除 public String delete() throws Exception{ System.out.println("进来了PersonAction。。。delete"); resp.setContentType("text/html; charset=UTF-8"); req.setCharacterEncoding("UTF-8"); System.out.println(pid); personBiz.deletePerson(pid); return null; } //分页查询 public String select() throws IOException{ resp.setContentType("text/html; charset=UTF-8"); //设置当前页 int intPage =new Integer(req.getParameter("page")); //设置每页显示的数量 int intPageSize =new Integer(req.getParameter("rows")); List<Person> list=personBiz.getAll(intPage, intPageSize); int n=personBiz.IntCount(); JSONArray jsonarray=JSONArray.fromObject(list); JSONObject js=new JSONObject(); js.put("total", ""+n); js.put("rows", jsonarray); PrintWriter pw=resp.getWriter(); pw.write(js.toString()); pw.close(); return null; } public PersonBiz getPersonBiz() { return personBiz; } public void setPersonBiz(PersonBiz personBiz) { this.personBiz = personBiz; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public String getPsex() { return psex; } public void setPsex(String psex) { this.psex = psex; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } }
写好了spring之后进行springHibernate的测试
package com.zking.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zking.dao.PersonDao; import com.zking.entity.Person; public class TestSpringHibernate { @Test public void test1(){ ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"applicationContext-public.xml","applicationContext-dao.xml"}); PersonDao personDao=(PersonDao) ac.getBean("personDaoImp"); personDao.addPerson(new Person("李里", "男", 30)); } } 第三步:与Struts2整合,写一个struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="mypackage" extends="struts-default"> <action name="personAtion*" class="personAction" method="{1}"></action> </package> </struts>我用easyui写了一个简单的增删改查的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <!-- 引入easyui库 --> <link rel="stylesheet" type="text/css" href="easyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css"> <script type="text/javascript" src="easyui/jquery.min.js"></script> <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script> <script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript"> var DBindex; $(function(){ $('#dg').datagrid({ url:'personAtionselect.action', pagination: true, //显示分页 pageSize: 3, //页大小 pageList: [3, 6, 9, 11], //页大小下拉选项此项各value是pageSize的倍数 fitColumn: true, //列自适应宽度 striped: true, //行背景交换 nowap: true, //列内容多时自动折至第二行 nowrap : false, idField: 'pid', //主键 loadMsg:'正在拼命加载中...', columns:[[ {field:'pid',title:'编号',width:75,align:'center'}, {field:'pname',title:'姓名',width:75,align:'center',"editor":{type:'validatebox'}}, {field:'psex',title:'性别',width:75,align:'center',"editor":{type:'validatebox'}}, {field:'page',title:'年龄',width:75,align:'center',"editor":{type:'validatebox'}}, ]],onDblClickRow:function(index,row){ DBindex=index; $('#dg').datagrid('beginEdit',index); },onClickRow:function(index,row){ DBindex=index; },toolbar: [{ iconCls: 'icon-add', text:"添加", handler: function(){ DBindex=0; $('#dg').datagrid('insertRow',{ index:0, // 索引从0开始 row: {} }); $('#dg').datagrid('beginEdit',0); } },'-',{ iconCls: 'icon-remove', text:"删除", handler: function(){ var row=$('#dg').datagrid("getRows")[DBindex]; if(row!=null){ var pid=row["pid"]; $.post("personAtiondelete.action", {"pid":pid}, function(data){ $('#dg').datagrid('reload'); }); } } },'-',{ iconCls: 'icon-save', text:"保存", handler: function(){ $('#dg').datagrid('endEdit',DBindex); var row=$('#dg').datagrid("getRows")[DBindex]; if(row!=null){ var pname=row["pname"]; var psex=row["psex"]; var page=row["page"]; $.post("personAtionadd.action", {"pname":pname,"psex":psex,"page":page}, function(data){ $('#dg').datagrid('reload'); }); } } },'-',{ iconCls: 'icon-edit', text:"修改", handler: function(){ $('#dg').datagrid('endEdit',DBindex); var row=$('#dg').datagrid("getRows")[DBindex]; if(row!=null){ var pid=row["pid"]; var pname=row["pname"]; var psex=row["psex"]; var page=row["page"]; $.post("personAtionupdate.action", {"pid":pid,"pname":pname,"psex":psex,"page":page}, function(data){ $('#dg').datagrid('reload'); }); } } }] }); }); </script> </head> <body> <div align="center"> <table id="dg" style="width:301px;height:500px"></table> </div> </body> </html>还要配置web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 加载spring alt+\ 必须按照context-param->filter->listener的顺序来--> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-*.xml</param-value> </context-param> <!-- 加载Struts2 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>