spring+mybatis+struts2整合

基於spring的web項目,配置mybatis持久框架很簡單,在spring+hibernate+struts2整合的項目的基礎上,稍做修改即可

1、導入mybatis所需的jar包,這裏出現一些小問題,spring+hibernate+struts2整合的項目適用的spring版本是2.5,與mybatis3.1,mybatis3.0會衝突,包create bean sqlSessionFactory錯誤java.lang.reflect.MalformedParameterizedTypeException;所有這裏我直接導入spring3.0版本的jar來兼容。


2、bean.xml添加配置

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

		<property name="dataSource" ref="dataSource"></property>

	</bean>
	
	<!-- 通過掃描的模式,掃描目錄在com/myssh2/*目錄下,所有的DAO都繼承com.myssh2.dao.BaseDAO接口的接口 -->

	<bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

		<property name="basePackage" value="com.myssh2" />

		<property name="sqlSessionFactory" ref="sqlSessionFactory" />

		<property name="markerInterface" value="com.myssh2.dao.BaseDAO" />

	</bean>
3、添加dao層

BaseDao.java

package com.myssh2.dao;


/**
 * 
 * 該類爲mybatis提供統一的映射,以後創建的所有DAO都繼承該接口
 * 
 */
public interface BaseDAO {


}
UserDao.java

package com.myssh2.dao;

import java.util.List;
import com.myssh2.bean.User;

public interface UserDAO extends BaseDAO {
	public List<User> getAllUsers();
	public void addUser(User user );
}
UserDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"          
	"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="com.myssh2.dao.UserDAO">
	<resultMap type="com.myssh2.bean.User" id="User">
		<id property="id" column="id" />
		<result property="name" column="name" />
	</resultMap>

	<!-- 獲取所有用戶 -->
	<select id="getAllUsers" resultMap="User">
		select * from user
	</select>
	
	<!-- 添加用戶 -->
	<insert id="addUser" parameterType="com.myssh2.bean.User">
		insert into
		user(name)
		values(#{name,jdbcType=VARCHAR})
	</insert>
</mapper>
UserService.java

package com.myssh2.service;

import java.util.List;

import com.myssh2.bean.User;

//兼容hibernate和mybatis兩個持久層
public interface UserService {
	/**
	 * 以下爲新添加基於mybatis的業務方法
	 */
	public List<User> getAllUsers();
	public void addUser(User user);
	/**
	 * 以下爲源框架基於hibernate的業務方法
	 */
	public void save(User user);
	public void update(User user);
	public User find(int id);
	public void delete(int... id);
	public List<User> list();
}
UserServiceImpl.java

package com.myssh2.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.myssh2.bean.User;
import com.myssh2.dao.UserDAO;
import com.myssh2.service.UserService;

@Service @Transactional
public class UserServiceImpl implements UserService{
	
	@Autowired
	private UserDAO userDAO;
	
	public List<User> getAllUsers(){
		return userDAO.getAllUsers();
	}
	public void addUser(User user){
		userDAO.addUser(user);
	}
	@Resource SessionFactory factory;
	public void delete(int... ids) {
		for(int id : ids){
			factory.getCurrentSession().delete(factory.getCurrentSession().load(User.class, id));
		}
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public User find(int id) {
		return (User)factory.getCurrentSession().get(User.class, id);
	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public List<User> list() {		
		return factory.getCurrentSession().createQuery("from User").list();
	}
    
	public void save(User user) {
		factory.getCurrentSession().persist(user);
	}

	public void update(User user) {
		factory.getCurrentSession().merge(user);
	}

}
UserAction.java稍做修改
@Controller // 
public class UserAction {
    @Resource UserService userService;
    
	public String execute(){
		ActionContext.getContext().put("users", userService.getAllUsers());
		return "list";
	}
}
UserManageAction.java稍作修改

package com.myssh2.action;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.myssh2.bean.User;
import com.myssh2.service.UserService;
import com.opensymphony.xwork2.ActionContext;


@Controller @Scope("prototype")
public class UserManageAction {
	@Resource UserService userService;
	private User user;	
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String addUI(){
		return "add";
	}
	
	public String add(){
		userService.addUser(user);
		ActionContext.getContext().put("message", "保存成功");
		return "message";
	}
}
效果


在保存成功那裏沒有跳轉到其他頁面,刷新頁面會造成重複提交表單,可以在對於的action裏添加設置處理該問題

            <interceptor-ref name="defaultStack" />
            <interceptor-ref name="token" />或 <interceptor-ref name="tokenSession" />
            <!-- 如果重複提交,跳轉到xxx.jsp頁面 -->
            <result name="invalid.token">/WEB-INF/page/xxx.jsp</result> 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章