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