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> 







 

posted @ 2016-10-01 15:18  海的心  阅读(238)  评论(0编辑  收藏  举报