費話不多說......
(1)由於本人最常用的是Oracle,所以本例就採用Oracle爲例,下面是建表語句:
--用戶表
create table t_user
(
user_id number primary key not null,--編號
user_name varchar2(24),--姓名
user_sex varchar2(4),--性別
user_class varchar2(24)--班級
);
create sequence user_seq
start with 1
increment by 1;
insert into t_user values(user_seq.nextval,'張一','男','大班');
insert into t_user values(user_seq.nextval,'張二','男','大班');
insert into t_user values(user_seq.nextval,'張三','男','大班');
insert into t_user values(user_seq.nextval,'張四','男','大班');
insert into t_user values(user_seq.nextval,'張五','男','大班');
insert into t_user values(user_seq.nextval,'李一','女','小班');
insert into t_user values(user_seq.nextval,'李二','女','小班');
insert into t_user values(user_seq.nextval,'李三','女','小班');
insert into t_user values(user_seq.nextval,'李四','女','小班');
insert into t_user values(user_seq.nextval,'李五','女','小班');
select * from t_user;
(2)spring配置文件,個人主要分成兩個,便於管理,放到src目錄下,
首先是數據源配置applicationContext-datasource.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:ORCL</value></property>
<property name="user"><value>scott</value></property>
<property name="password"><value>tiger</value></property>
<property name="minPoolSize"><value>5</value></property>
<property name="maxPoolSize"><value>50</value></property>
<property name="maxIdleTime"><value>1800</value></property>
<property name="acquireIncrement"><value>5</value></property>
<property name="maxStatements"><value>0</value></property>
<property name="maxStatementsPerConnection"><value>100</value></property>
<property name="initialPoolSize"><value>5</value></property>
<property name="acquireRetryAttempts"><value>30</value></property>
<property name="breakAfterAcquireFailure"><value>false</value></property>
<property name="testConnectionOnCheckout"><value>false</value></property>
<property name="idleConnectionTestPeriod"><value>1800</value></property>
</bean>
<!-- 注入jdbcTemplate,查詢數據時使用 -->
<bean id="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
<context:annotation-config></context:annotation-config>
-->
<!-- 如果配置了自動掃描,則上面的可以註釋掉 -->
<context:component-scan base-package="com.test"></context:component-scan>
</beans>
然後是sessionFactory以及事務相關配置 applicationContext-hibernate.xml,將實體bean以及事務交給spring來管理:
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/test/model/</value>
</list>
</property>
</bean>
<bean name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean name="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager"></property>
<property name="proxyTargetClass" value="true"></property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="copy*">PROPAGATION_REQUIRED</prop>
<prop key="sync*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean>
</beans>
(3)接下來就是struts的配置文件了,同樣放到src目錄下,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.0.dtd" >
<struts>
<constant name="struts.ui.theme" value="simple" />
<constant name="struts.ui.templateDir" value="template" />
<constant name="struts.ui.templateSuffix" value="ftl" />
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.configuration.xml.reload" value="true"></constant>
<package name="default" extends="struts-default">
<action name="userAction" class="com.test.user.action.UserAction">
<result name="all">/all.jsp</result><!-- 此處代碼配置forward跳轉,可不必理會 -->
<result name="all_group">/all_group.jsp</result>
</action>
</package>
</struts>
(4)接下來就是最核心的web.xml配置了,代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
相關配置做好了,接下來就開始以用戶添加和查詢爲例......
(5)User.java,實體Bean
package com.test.model;
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.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="t_user",catalog="scott")
public class User implements Serializable{
private int user_id;
private String user_name;
private String user_sex;
private String user_class;
public User(){
}
public User(String user_name,String user_sex,String user_class){
this.user_name = user_name;
this.user_sex=user_sex;
this.user_class=user_class;
}
@Id
@Column(name="user_id")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="user_seq")
@SequenceGenerator(sequenceName="user_seq",name="user_seq")
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
@Column(name="user_name",length=24)
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
@Column(name="user_sex",length=4)
public String getUser_sex() {
return user_sex;
}
public void setUser_sex(String user_sex) {
this.user_sex = user_sex;
}
@Column(name="user_class",length=24)
public String getUser_class() {
return user_class;
}
public void setUser_class(String user_class) {
this.user_class = user_class;
}
}
(6)新建接口類:UserService.java
package com.test.user.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.test.model.User;
@Service
public interface UserService {
/*************
* 創建用戶
*
* @param user
* @throws Exception
*/
public void createUser(User user) throws Exception;
/************
* 獲取用戶列表
*
* @return
* @throws Exception
*/
public List<User> getAllUser() throws Exception;
}
(6)新建UserDao,實現增加和查詢的功能,繼承HibernateDaoSupport ,代碼如下:
package com.test.user.dao;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import com.test.model.User;
@Repository
public class UserDao extends HibernateDaoSupport {
private JdbcTemplate jdbcTemplate;
@Resource
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Resource
public void setSessionFactoryOverride(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
public void createUser(User user) throws Exception {
this.getHibernateTemplate().save(user);
}
@SuppressWarnings("unchecked")
public List<User> getAllUser() throws Exception {
// return this.getHibernateTemplate().find("from User");
// 用jdbcTemplate查詢
List<User> list = new ArrayList<User>();
SqlRowSet rs = this.jdbcTemplate
.queryForRowSet("select user_id,user_name,user_sex,user_class from t_user");
while (rs.next()) {
User user = new User();
user.setUser_id(rs.getInt("user_id"));
user.setUser_name(rs.getString("user_name"));
user.setUser_sex(rs.getString("user_sex"));
user.setUser_class(rs.getString("user_class"));
list.add(user);
}
return list;
}
}
(7)新建UserServiceImpl.java,注入UserDao,調用UserDao裏的方法,實現UserServie接口,代碼如下:
package com.test.user.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.test.model.User;
import com.test.user.dao.UserDao;
import com.test.user.service.UserService;
@Component
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public void createUser(User user) throws Exception {
this.userDao.createUser(user);
}
@Override
public List<User> getAllUser() throws Exception {
return this.userDao.getAllUser();
}
}
(8)接下來理所應當就是我們的控制器UserAction.java類了
package com.test.user.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import com.test.model.User;
import com.test.user.service.UserService;
@Controller
public class UserAction extends ActionSupport {
@Resource
private UserService userService;
private List<User> userList = new ArrayList<User>();
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public String getAllUser() {
try {
// this.userList = this.userService.getAllUser();//全查詢
this.userList = new ArrayList<User>();
System.out.println(this.userList.size());
} catch (Exception e) {
e.printStackTrace();
}
return "all";
}
}
(10)爲了避免麻煩就不用jsp頁面進行演示,直接用Junit進行測試,添加jar包junit-4.8.2.jar,測試代碼如下:
package com.test.test;
import java.util.List;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.user.service.UserService;
public class UserTest {
private static UserService userService;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("JUnit start......");
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext-*.xml");
userService=(UserService) app.getBean("userServiceImpl");
}
@AfterClass
public static void afterClass() throws Exception {
System.out.println("JUnit end......");
}
@Test
public void getAllUser(){
try {
System.out.println("用戶數:"+this.userService.getAllUser().size());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// @Test
// public void addUser(){
// System.out.println("添加用戶......");
// User user=new User("劉星","男","小班");
// try {
// this.userService.createUser(user);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
(注:本例已測試通過)