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>