最近接触了maven,想自己做个小系统练练手,目前只做了一小部分,算是总结下吧。
账务管理系统。
1.先写需求(有些还没想到,边写边改吧。)
1.商品 添加商品,查询商品对应的超市价格明细
2.超市 添加超市,查询超市对应的商品价格明细,并查同时看超市的地址
3.明细 查询一段时间内购买的商品和支出明细,查询一段时间买东西的超市明细
4.购物车 从购物车中移除,添加入购物车,查看购物车中的商品,更改购物车中商品的数量,购物车确认动作确认支付
5.订单 查询一段时间内某一超市的订单明细,查询某一段时间内的某商品的订单明细,查询某一段时间某一超市某一商品的订单明细
6.地址 增加地址,删除地址,更改地址,并查询地址对应的超市
7.用户 添加用户,删除用户,查询用户,更改用户
2.搭架构
总体分为3层,dao+model层,service层,view(action,jsp)层
2.1 maven搭建
下载maven(3.0.4): http://maven.apache.org/download.html
设置maven环境:M2_HOME=安装目录;在path变量中增加%M2_HOME%\bin
设置本地仓库地址:$M2_HOME/conf/setting.xml中更改为:<localRepository>D:\\reign\\mvn\\repo</localRepository>
安装M2Eclipse插件:Help -> InstallNewSoftware -> Work with -> Add
http://m2eclipse.sonatype.org/sites/m2e
统一本地Maven程序:Window->Perferences->Maven->Installations->Add
指定到M2_HOME目录
创建maven项目等详见:http://wenku.baidu.com/view/3fae1ce9102de2bd960588a5.html(作者:张继豪)超级給力
2.2 hibernate+spring搭建,用spring管理hibernate
在建立了maven的web项目后,POM文件如下(额,,年代太过久远找不到了,先把所有的构件贴出来吧):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <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> <packaging>war</packaging> <name>test</name> <groupId>com.medclub</groupId> <artifactId>test</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat6-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8088</port> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.8</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.8</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.23</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>20041127.091804</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j</artifactId> <version>2.0-beta4</version> <type>pom</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.opensymphony.quartz</groupId> <artifactId>quartz</artifactId> <version>1.6.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xerces</artifactId> <version>2.4.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>com.kenai.nbpwr</groupId> <artifactId>org-apache-commons-pool</artifactId> <version>1.4-201002241055</version> <type>nbm</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>20030825.184428</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>poi</groupId> <artifactId>poi-2.5.1-final</artifactId> <version>20040804</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.6</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.0.CR1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-cglib-repack</artifactId> <version>2.1_3</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>com.kenai.nbpwr</groupId> <artifactId>net-sf-cglib</artifactId> <version>2.1.3-201003011305</version> <type>nbm</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc-struts</artifactId> <version>2.5.6.SEC03</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-adapters</artifactId> <version>1.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>20040616</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections-testframework</artifactId> <version>20040102.233541</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>backport-util-concurrent</groupId> <artifactId>backport-util-concurrent</artifactId> <version>3.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.6.5</version> <type>pom</type> <scope>compile</scope> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.6.5</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.2.1.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-el</groupId> <artifactId>commons-el</artifactId> <version>1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.2.2.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-adapters</artifactId> <version>1.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.12</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> </project>
配置hibernate,要写test.hbm.xml和daoContext.xml(先测试,写在maven的test的class下面)有点不明白的是maven提供的TestCase接口的用法,希望知道的大神补充下吧,我在test中是直接用main方法的(只是测试,业务的话后面再说)。
test.hbm.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.medclub.pojo"> <class name="TestPojo" table="test_table"> <id name="id" column="testid"> <generator class="identity"></generator> </id> <property name="name"></property> <property name="age"></property> </class> <class name="UserPojo" table="user_table"> <id name="id" column="id"> <generator class="identity"></generator> </id> <property name="name"></property> <property name="tel_number"></property> <property name="address"></property> <set name="departments" inverse="true" table="user_department_table"> <key column="user_id"/> <many-to-many class="DepartmentPojo" column="department_id"/> </set> </class> <class name="DepartmentPojo" table="department_table"> <id name="id" column="id"> <generator class="identity"></generator> </id> <property name="name"></property> <property name="parent_id"></property> <property name="has_child"></property> <set name="users" table="user_department_table"> <key column="department_id"/> <many-to-many class="UserPojo" column="user_id"/> </set> </class> </hibernate-mapping>
daoContext.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <!-- Spring 配置文件的DTD 定义--> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- Spring 配置文件的根元素是beans--> <beans> <!--定义数据源,该bean 的ID 为dataSource--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 指定数据库驱动--> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value> </property> <!-- 指定连接数据库的URL--> <property name="url"><value>jdbc:mysql://127.0.0.1:3306/test</value> </property> <!-- root 为数据库的用户名--> <property name="username"><value>root</value></property> <!-- pass 为数据库密码--> <property name="password"><value>123456</value></property> </bean> <!-- 定义Hibernate 的SessionFactory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 依赖注入数据源,注入正是上文定义的dataSource--> <property name="dataSource"><ref local="dataSource"/></property> <!-- mapp工ngResouces属性用来列出全部映射文件--> <property name="mappingResources"> <list> <!-- 以下用来列出所有的PO 映射文件--> <!-- <value>lee/MyTest.hbm.xml</value>--> <value>test.hbm.xml</value> </list> </property> <!-- 定义Hibernate 的SessionFactory的属性--> <property name="hibernateProperties"> <props> <!-- 指定Hibernate 的连接方法--> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <!-- 不同数据库连接,启动时选择create , update , create-drop--> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>personDao</value> <value>userDao</value> <value>departmentDao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <bean id="personDao" class="com.medclub.tests.daoimpl.TestHibernateDao"> <constructor-arg index="0"> <ref bean="sessionFactory"/> </constructor-arg> </bean> <bean id="userDao" class="com.medclub.tests.daoimpl.UserHibernateDao"> <constructor-arg index="0"> <ref bean="sessionFactory"/> </constructor-arg> </bean> <bean id="departmentDao" class="com.medclub.tests.daoimpl.DepartmentHibernateDao"> <constructor-arg index="0"> <ref bean="sessionFactory"/> </constructor-arg> </bean> </beans>
关键代码(仿照李刚j2ee那本书,也不知道对不对,但是编译没问题,往大神们不吝赐教啊):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" lazy-init="default" autowire="default" dependency-check="default"> 2 - <property name="beanNames"> 3 - <list> 4 <value>personDao</value> 5 <value>userDao</value> 6 <value>departmentDao</value> 7 </list> 8 </property> 9 - <property name="interceptorNames"> 10 - <list> 11 <value>transactionInterceptor</value> 12 </list> 13 </property> 14 </bean> 15 - <bean id="personDao" class="com.medclub.tests.daoimpl.TestHibernateDao" lazy-init="default" autowire="default" dependency-check="default"> 16 - <constructor-arg index="0"> 17 <ref bean="sessionFactory" /> 18 </constructor-arg> 19 </bean>
Pojo例子:com.medclub.pojo.DepartmentPojo
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.medclub.pojo; import static javax.persistence.GenerationType.IDENTITY; import java.io.Serializable; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.springframework.context.annotation.Primary; //@Entity //@Table(name = "department_table", catalog = "test") public class DepartmentPojo implements Serializable{ private Integer id; private String name; private Integer parent_id; private Boolean has_child; private Set users=new HashSet(); //@Id //@GeneratedValue(strategy = IDENTITY) //@Column(name = "id", unique = true, nullable = false) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } //@Column(name = "name", length = 2000) public String getName() { return name; } public void setName(String name) { this.name = name; } //@Column(name = "parent_id") public Integer getParent_id() { return parent_id; } public void setParent_id(Integer parent_id) { this.parent_id = parent_id; } //@Column(name = "has_child") public Boolean getHas_child() { return has_child; } public void setHas_child(Boolean has_child) { this.has_child = has_child; } //@ManyToMany(cascade=CascadeType.ALL) //@JoinTable(name="department_user",joinColumns={@JoinColumn(name="user_id")},inverseJoinColumns={@JoinColumn(name="department_id")}) public Set<UserPojo> getUsers() { return users; } public void setUsers(Set<UserPojo> users) { this.users = users; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((has_child == null) ? 0 : has_child.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((parent_id == null) ? 0 : parent_id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DepartmentPojo other = (DepartmentPojo) obj; if (has_child == null) { if (other.has_child != null) return false; } else if (!has_child.equals(other.has_child)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (parent_id == null) { if (other.parent_id != null) return false; } else if (!parent_id.equals(other.parent_id)) return false; return true; } @Override public String toString() { return "DepartmentPojo [id=" + id + ", name=" + name + ", parent_id=" + parent_id + ", has_child=" + has_child + "]"; } }
dao例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.medclub.dao; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.engine.spi.SessionFactoryImplementor; 9 import org.springframework.orm.ObjectRetrievalFailureException; 10 import org.springframework.orm.hibernate3.HibernateTemplate; 11 import org.springframework.orm.hibernate4.SpringSessionContext; 12 13 14 public class BaseDao<T extends Serializable,PK extends Serializable> extends SpringSessionContext implements DAO{ 15 public BaseDao(SessionFactoryImplementor sessionFactory) { 16 super(sessionFactory); 17 // TODO Auto-generated constructor stub 18 } 19 20 private HibernateTemplate hiberatetmplate; 21 public Object getObject(Class clazz, Serializable id) { 22 // TODO Auto-generated method stub 23 Object o= getHibernateTemplate().get(clazz, id); 24 if(o==null){ 25 throw new ObjectRetrievalFailureException(clazz,id); 26 } 27 return o; 28 } 29 30 31 protected Session getHibernateTemplate() { 32 // TODO Auto-generated method stub 33 return currentSession(); 34 } 35 36 37 public List getObjectList(Class clazz) { 38 // TODO Auto-generated method stub 39 40 return getHibernateTemplate().createQuery("from "+clazz.getName()).list(); 41 } 42 43 public void saveObject(Object obj) { 44 // TODO Auto-generated method stub 45 getHibernateTemplate().save(obj); 46 } 47 48 public void deleteObject(Class clazz, Serializable id) { 49 // TODO Auto-generated method stub 50 getHibernateTemplate().delete(getObject(clazz, id)); 51 } 52 53 } 54 package com.medclub.dao; 55 56 import java.io.Serializable; 57 import java.util.List; 58 59 public interface DAO{ 60 public Object getObject(Class clazz,Serializable id); 61 public List getObjectList(Class clazz); 62 public void saveObject(Object obj); 63 public void deleteObject(Class clazz,Serializable id); 64 65 } 66 package com.medclub.tests.dao; 67 68 import java.util.List; 69 import java.util.Set; 70 71 import com.medclub.dao.DAO; 72 import com.medclub.pojo.DepartmentPojo; 73 import com.medclub.pojo.UserPojo; 74 75 public interface DepartmentDao extends DAO{ 76 public void save(DepartmentPojo pojo); 77 public List<DepartmentPojo> getAll(); 78 public List<DepartmentPojo> getDepartmentByExample(DepartmentPojo pojo); 79 } 80 package com.medclub.tests.daoimpl; 81 82 import org.hibernate.engine.spi.SessionFactoryImplementor; 83 84 import com.medclub.dao.BaseDao; 85 import com.medclub.pojo.DepartmentPojo; 86 import com.medclub.tests.dao.DepartmentDao; 87 88 public class DepartmentHibernateDao extends BaseDao<DepartmentPojo,Integer> implements DepartmentDao{ 89 90 public DepartmentHibernateDao(SessionFactoryImplementor sessionFactory) { 91 super(sessionFactory); 92 // TODO Auto-generated constructor stub 93 } 94 95 public void save(DepartmentPojo pojo) { 96 // TODO Auto-generated method stub 97 saveObject(pojo); 98 } 99 100 }
test例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.medclub.test; 2 3 import java.util.HashSet; 4 import java.util.List; 5 import java.util.Set; 6 7 import org.springframework.context.ApplicationContext; 8 import org.springframework.context.support.ClassPathXmlApplicationContext; 9 10 import com.medclub.pojo.DepartmentPojo; 11 import com.medclub.pojo.UserPojo; 12 import com.medclub.tests.dao.DepartmentDao; 13 import com.medclub.tests.dao.UserDao; 14 15 public class DepartmentTest { 16 17 /** 18 * @param args 19 */ 20 public static void main(String[] args) { 21 // TODO Auto-generated method stub 22 ApplicationContext act=new ClassPathXmlApplicationContext("daoContext.xml"); 23 UserDao daouser=(UserDao) act.getBean("userDao"); 24 List users=daouser.getUsers(); 25 Set<UserPojo> userset=new HashSet<UserPojo>(); 26 for(Object user:users){ 27 userset.add((UserPojo) user); 28 } 29 DepartmentPojo depart=new DepartmentPojo(); 30 depart.setHas_child(true); 31 depart.setParent_id(0); 32 depart.setId(0); 33 depart.setName("xx公司"); 34 depart.setUsers(userset); 35 DepartmentDao depdao=(DepartmentDao) act.getBean("departmentDao"); 36 depdao.save(depart); 37 } 38 39 }
好了,运行测试,可以添加查询或者直接去数据库看,hibernate+spring架构完成,今天太晚啦,后面再看struts+spring的架构啦。