基于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>