springMVC+mybatis 之借助SqlSessionTemplate 实现Dao层通用写法

在springMVC+mybatis框架开发时,通常我们会写多的dao,如userDao,roleDao,departDao等等,这样开发效果就很慢,不是很好,所以编写个通用dao.

SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。

当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的。此外,它管理session的生命周期,包含必要的关闭,提交或回滚操作。

SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。

SqlSessionTemplate通常是被用来替代默认的MyBatis实现的DefaultSqlSession,因为它不能参与到Spring的事务中也不能被注入,因为它是线程不安全的。相同应用程序中两个类之间的转换可能会引起数据一致性的问题。

SqlSessionTemplate对象可以使用SqlSessionFactory作为构造方法的参数来创建。
例如:


 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
  p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis-config.xml"
  p:mapperLocations="classpath:com/mf/*/entity/mapper/*.xml"
  p:plugins-ref="pagePlugin" />

 
 <bean class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactory" />
 bean>

编写步骤:

1.编写dao接口

public interface DAO {  
      
    /** 
     * 保存对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object save(String str, Object obj) throws Exception;  
      
    /** 
     * 修改对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object update(String str, Object obj) throws Exception;  
      
    /** 
     * 删除对象  
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object delete(String str, Object obj) throws Exception;  
  
    /** 
     * 查找对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object findForObject(String str, Object obj) throws Exception;  
  
    /** 
     * 查找对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object findForList(String str, Object obj) throws Exception;  
      
    /** 
     * 查找对象封装成Map 
     * @param s 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object findForMap(String sql, Object obj, String key , String value) throws Exception;  
      
}  

2.编写dao 实现类

public class DaoSupport implements DAO {  
  
    @Resource(name = "sqlSessionTemplate")  
    private SqlSessionTemplate sqlSessionTemplate;  
      
    /** 
     * 保存对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object save(String str, Object obj) throws Exception {  
        return sqlSessionTemplate.insert(str, obj);  
    }  
      
    /** 
     * 批量更新 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object batchSave(String str, List objs )throws Exception{  
        return sqlSessionTemplate.insert(str, objs);  
    }  
      
    /** 
     * 修改对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object update(String str, Object obj) throws Exception {  
        return sqlSessionTemplate.update(str, obj);  
    }  
  
    /** 
     * 批量更新 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public void batchUpdate(String str, List objs )throws Exception{  
        SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();  
        //批量执行器  
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);  
        try{  
            if(objs!=null){  
                for(int i=0,size=objs.size();i<size;i++){  
                    sqlSession.update(str, objs.get(i));  
                }  
                sqlSession.flushStatements();  
                sqlSession.commit();  
                sqlSession.clearCache();  
            }  
        }finally{  
            sqlSession.close();  
        }  
    }  
      
    /** 
     * 批量更新 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object batchDelete(String str, List objs )throws Exception{  
        return sqlSessionTemplate.delete(str, objs);  
    }  
      
    /** 
     * 删除对象  
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object delete(String str, Object obj) throws Exception {  
        return sqlSessionTemplate.delete(str, obj);  
    }  
       
    /** 
     * 查找对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object findForObject(String str, Object obj) throws Exception {  
        return sqlSessionTemplate.selectOne(str, obj);  
    }  
  
    /** 
     * 查找对象 
     * @param str 
     * @param obj 
     * @return 
     * @throws Exception 
     */  
    public Object findForList(String str, Object obj) throws Exception {  
        return sqlSessionTemplate.selectList(str, obj);  
    }  
      
    public Object findForMap(String str, Object obj, String key, String value) throws Exception {  
        return sqlSessionTemplate.selectMap(str, obj, key);  
    }  
      
}  

3.那么怎么使用呢?

public class UserService {  
  
    @Resource(name = "daoSupport")  
    private DaoSupport dao;  
  
    /* 
    *通过id获取数据 
    */  
    public User getUserAndRoleById(String userid) throws Exception {  
        return (User) dao.findForObject("UserMapper.getUserAndRoleById", <span style="font-family: Arial, Helvetica, sans-serif;">userid</span>);  
    }   
}  

4. UserMapper.xml中的配置

  
  
<mapper namespace="UserMapper">  
<select id="getUserById" parameterType="String" resultType="User">  
    select  * from SYS_USER where userId=#{userId}  
select>  
lt;/mapper>  

namespqce:是随意起的 不是规定必须叫 userNamespace

5.mybatis配置文件

  
  
<mapper namespace="Test">  
  
    <select id="queryDataCount"  
        parameterType="com.mybatis.Test"  
        resultType="int">  
        SELECT COUNT(1) FROM INF_CONSUMER T WHERE T.UUID = #{uuid}  
    select>  
      
mapper>  

6.具体DAO配置

package com.dwr;  
  
import org.springframework.stereotype.Repository;  
  
import com.mybatis.Test;  
  
@Repository  
public class TestDAO extends MyBatisDAO {  
  
    public int getCount(Test test) {  
        return (Integer) this.getObject("Test.queryDataCount", test);  
    }  
}  

这样一个通用的Dao解决了。

转载:https://blog.csdn.net/hellolovelife/article/details/78476099

你可能感兴趣的:(springMVC+mybatis 之借助SqlSessionTemplate 实现Dao层通用写法)