spring-mybatis 之SqlSessionFactoryBean

 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候你可以关闭 session 

Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。


使用 MyBatis-Spring 之后, 会使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory,然后可以使用下面两种方式使用sqlSession。

1、SqlSessionTemplate:

Mybatis-Spring提供了一种直接使用SqlSession的方式(一个实现了SqlSession接口的SqlSessionTemplate实现类)

  1. 它是线程安全的,可以被多个Dao同时使用;
  2. 它跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的,而且它还可以自己管理Session的提交和关闭。

1)spring.xml


     
     
     
     
     
     
     
         
         
         
         
    
   
    
     
         
        
        
    
   
    
      
         

mybatis配置文件:

    











 
         
 

2)dao层实现:

packagecn.edu.nuc.dao;
importorg.apache.ibatis.session.SqlSession;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importcn.edu.nuc.bean.User;
 
@Component
public classUserDaoImpl implements UserDao {
@Autowired
private SqlSession sqlSession;
 
publicvoid insertUsers(User user) {
sqlSession.insert("cn.edu.nuc.map.UserMapper1.insertUser",user);
}
}
3)mapper文件:




       
     
            insert into user (name)values (#{name});
     

4)测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-sqlSessionTemplate.xml"})
public classUserServiceSqlSesionTemplateTest {
           @Autowired
      private UserDao userDao; 
 
@Test
publicvoid testFindUserById() throws Exception {
Useruser = new User();
user.setName("lanxiaoli");
userDao.insertUsers(user);
}
}

补充:在dao层sqlSession.insert("cn.edu.nuc.map.UserMapper1.insertUser",user);第一个参数前半部分是mapper文件的namespace,最后一个是sql的id;这两部分都是随意写的。

 

2、SqlSessionDaoSupport:

SqlSessionDaoSupport 是一个抽象的支持类, 用来为你提供 SqlSession。调用 getSqlSession()方法你会得到一个SqlSessionTemplate,之后可以用于执行 SQL 方法。

SqlSessionDaoSupport 需要一个 sqlSessionFactory 或sqlSessionTemplate 属性来设置 。 这 些要被 被 明 确地 设 置 或 者由 Spring 来 自 动 装 配 。 如 果 两 者 都 被 设 置 了 , 那 么 SqlSessionFactory 是被忽略的。(其实可以使用下面的MapperScannerConfigurer来自动装配)

1)spring.xml


 
     
     
     
     
     
     
     
         
         
         
         
    
   
    
     
         
        
        
    
    
    
      

   
     
    
     
   
    
2)dao层实现类:

packagecn.edu.nuc.dao;
importorg.mybatis.spring.support.SqlSessionDaoSupport;
importcn.edu.nuc.bean.User;
 
public classUserDaoImpl1 extends SqlSessionDaoSupport implements UserDao {
publicvoid insertUsers(User user) {
getSqlSession().update("cn.edu.nuc.map.UserMapper1.updateUser",user);
}
}
3)mapper文件:




       

            update user setname=#{name} where id=#{id}
     

4)测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-sqlSessiondaosupport.xml"})
public classUserServiceSqlSessionDaoSupportTest {
@Autowired
      private UserDaouserDao;
 
@Test
publicvoid testFindUserById() throws Exception {
Useruser = new User();
user.setId(2L);
user.setName("12323");
userDao.insertUsers(user);
}
}


分析:

上面做法没问题,但就是在spring.xml中需要配置所有的dao层实现,把sqlSession或者sqlSessionFactory注入进去。下面,可以使用MapperScannerConfigurer来解决这个问题。(通常使用这种方法作为dao层基础架构

1)spring.xml配置文件:


 
     
     
     
     
     
     
     
         
         
         
         
         
         
         
         
    
   
    
     
         
        
        
    

        
        
    

2)dao层实现类:

packagecn.edu.nuc.dao;
importjavax.annotation.Resource;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.mybatis.spring.support.SqlSessionDaoSupport;
importorg.springframework.stereotype.Component;
importcn.edu.nuc.bean.User;
 
@Component
public classUserDaoImpl1 extends SqlSessionDaoSupport implements UserDao {
@Resource(name="sqlSessionFactory")
public void setSqlSessionFactory(SqlSessionFactorysqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
publicvoid insertUsers(User user) {
getSqlSession().update("cn.edu.nuc.map.UserMapper1.updateUser",user);
}
}

3)测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-sqlSessiondaosupport.xml"})
public classUserServiceSqlSessionDaoSupportTest {
@Autowired
    private UserDao userDaoImpl1; 
 
@Test
publicvoid testFindUserById() throws Exception {
Useruser = new User();
user.setId(2L);
user.setName("4321");
userDaoImpl1.insertUsers(user);
}
}


:在dao层的实现里,必须指定public void setSqlSessionFactory(SqlSessionFactorysqlSessionFactory);一般的做法是写一个baseDao,然后把所有常见的CRUD方法实现,每个业务模块的dao去继承该baseDao

 

MapperScannerConfigurer具有下面两个重要特性:

1)不需要指定SqlSessionFactory 或SqlSessionTemplate,MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配

2)MapperScannerConfigurer 其实和MapperFactoryBean类似,都是创建代理然后注入到spring中;区别是前者是自动扫描数据映射器接口,生成代理类、并注入到Spring的容器中

 

我们这里不需要用MapperScannerConfigurer来创建MapperFactoryBean,以及生成代理类注入到spring中(后面的使用中会用到),我们需要:

1)需要MapperScannerConfigurer帮我们自动装配SqlSessionFactory 或 SqlSessionTemplate(因为SqlSessionDaoSupport 需要一个 sqlSessionFactory 或 sqlSessionTemplate属性来设置);

2)我们需要自己显示的在dao层加上@Component注解(否则依赖的时候会拿到注入到spring中的MapperScannerConfigurer生成的代理类)

3dao层我们继承了SqlSessionDaoSupport,所以可以直接使用getSqlSession() 方法获取sqlSessionTemplate,然后操作数据映射文件(mapper文件)里的sql了;


你可能感兴趣的:(java)