您的位置:首页 > 编程语言 > Java开发

spring 和 mybatis 的整合

2015-07-28 21:01 525 查看

1      spring和mybatis整合

1.1  整合思路

 

需要spring通过单例方式管理SqlSessionFactory。

spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)

持久层的mapper都需要由spring进行管理。

1.2  整合环境

创建一个新的java工程(接近实际开发的工程结构)

jar包:

mybatis3.2.7的jar包

spring3.2.0的jar包

mybatis和spring的整合包:早期ibatis和spring整合是由spring官方提供,mybatis和spring整合由mybatis提供。

全部jar包

jar包在附属文件里

目录环境;



db.Properties 数据库的连接池;

SqlMapConfig.xml   mybatis 的配置环境

 

1.3  Mybatis配置文件

在classpath下创建mybatis/SqlMapConfig.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局配置参数,需要时再设置 -->
    <settings>
       <!--
打开延迟加载的开关系统默认为false-->
       <settingname="lazyLoadingEnabled"value="true"/>
       <!--
将积极加载改为消极加载即按需要加载  系统默认为true
-->
       <settingname="aggressiveLazyLoading"value="false"/>
       <!--
开启二级缓存 默认值为true -->
    <settingname="cacheEnabled"value="true"/>
    </settings>
    <!-- 别名定义 -->
    <typeAliases>
    <!-- 批量别名定义
       指定报名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
       -->
    <packagename="cn.hpu.ssm.po"></package>
    <!-- 可多包扫描<packagename="cn.hpu.mybatis.po"></package> -->
    </typeAliases>
    <!-- 加载映射文件 -->
    <mappers>
    <!-- 通过resource一次加载一个,单个映射文件的加载
-->
       <mapperresource="sqlmap/User.xml"></mapper>
    <!-- <mapperclass="cn.hpu.mybatis.mapper.OrdersMapperCustom"/> -->
    <!-- 批量加载mapper 推荐
       指定mapper接口的报名,mybatis自动扫描包下的所有的mapper接口进行加载
       遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名车个保持一致,且在同一个目录中
       上边的规范是前提:使用mapper代理的方法
     
     和spring整合后,使用mapper扫描器,这里不需要配置
     
     -->
    <!--<package name="cn.hpu.ssm.mapper"/> -->
    </mappers>
</configuration>
 

 

1.4  Spring配置文件:

         在classpath下创建applicationContext.xml,定义数据库链接池、SqlSessionFactory。

<beansxmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd       http://www.springframework.org/schema/mvc       http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd       http://www.springframework.org/schema/context       http://www.springframework.org/schema/context/spring-context-3.2.xsd       http://www.springframework.org/schema/aop       http://www.springframework.org/schema/aop/spring-aop-3.2.xsd       http://www.springframework.org/schema/tx       http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <!-- 加载配置文件 -->
<context:property-placeholderlocation="classpath:db.properties"/>
<!-- 数据库连接池 -->
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
       <propertyname="driverClassName"value="${jdbc.driver}"/>
      <propertyname="url"value="${jdbc.url}"/>
      <propertyname="username"value="${jdbc.username}"/>
      <propertyname="password"value="${jdbc.password}"/>
      <propertyname="maxActive"value="10"/>
      <propertyname="maxIdle"value="5"/>
</bean>  
<!-- mapper配置 -->
   <!-- 让spring管理sqlsessionfactory使用mybatis和spring整合包中的
-->
   <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
      <!-- 数据库连接池 -->
      <propertyname="dataSource"ref="dataSource"/>
      <!-- 加载mybatis的全局配置文件 -->
      <propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"/>
   </bean>
 
</beans>
 
 

注意:在定义sqlSessionFactory时指定数据源dataSource和mybatis的配置文件。

1.5  原始dao开发(和spring整合后)

 

1.5.1    User.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--  namespace命名空间,作用是对sql进行隔离,理解sql隔离
注意:使用mapper戴丽丽方法,namepace有特殊的重要作用
-->
<mappernamespace="test">
    <!--通过select执行数据库查询
-->
    <selectid="findUserById"parameterType="int"resultType="cn.hpu.ssm.po.User">
    SELECT * FROMUSER WHERE id=#{id}
    </select>    
</mapper>

 

在SqlMapconfig.xml中加载User.xml

    <!-- 加载映射文件 -->
    <mappers>
    <!-- 通过resource一次加载一个,单个映射文件的加载 -->
       <mapperresource="sqlmap/User.xml"></mapper>

 

1.5.2    dao(实现类继承SqlSessionDaoSupport)

定义dao接口

/**
 * dao接口用户管理
 * @authoryang
 *
 */
public
interface
UserDao {
    //根据id查询户信息
    public User findUserById(int id)throws Exception;
}
dao接口实现类需要注入SqlSessoinFactory,通过spring进行注入。

这里spring声明配置方式,配置dao的bean:

 

让UserDaoImpl实现类继承SqlSessionDaoSupport

public
class
UserDaoImpl extendsSqlSessionDaoSupportimplements UserDao{
 
    public User findUserById(int id)throws Exception {
       //集成SqlSesstionDaoSupport,通过this.getsqlsession的到sqlsession
       // TODO Auto-generatedmethod stub
       SqlSession sqlSession =this.getSqlSession();
       User user=sqlSession.selectOne("test.findUserById", id);
       //spring 管理释放资源,方法结束自动关闭
       //sqlSession.close();
       return user; 
    }

 

1.5.3    配置dao

在applicationContext.xml中配置dao。

<!-- 原始DAO接口 -->
   <beanid="userDao"class="cn.hpu.ssm.dao.UserDaoImpl">
<propertyname="sqlSessionFactory"ref="sqlSessionFactory"></property>
    </bean>

 

 

1.5.4    测试程序

public
class
UserDaoImplTest {
//在setup中得到spring的容器
    private ApplicationContextapplicationContext;
    @Before
    public
void
setUp() throws Exception {
    applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationcontext.xml");
    }
    @Test
    public
void
test() throws Exception {
       UserDao userDao=(UserDao) applicationContext.getBean("userDao");
       User user= userDao.findUserById(1);
       System.out.println(user.getUsername());
    }
}

1.6  mapper代理开发

1.6.1    第一步mapper.xml和mapper.java 

配置mapper.xml 和mapper.java 和mybatis 配置一样

mapper.java

public
interface
UserMapper {
   
    //根据id查询户信息
    public User findUserById(int id)throws Exception;
   
}

mapper.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="cn.hpu.ssm.mapper.UserMapper">
 
    <!--通过select执行数据库查询 -->
    <selectid="findUserById"parameterType="int"resultType="cn.hpu.ssm.po.User">
    SELECT * FROM USER WHERE id=#{id}
    </select>
</mapper>

1.6.2    第二步通过MapperFactoryBean创建代理对象 

在applicationContext.xml中配置mapper

<!-- mapper 接口
MapperFactoryBean :可以通过mapper接口生成代理对象
-->
<beanid="userMapper"class="org.mybatis.spring.mapper.MapperFactoryBean">
    <!--mapperInterface指定mapper接口 -->
    <propertyname="mapperInterface"value="cn.hpu.ssm.mapper.UserMapper"></property>
    <propertyname="sqlSessionFactory"ref="sqlSessionFactory"></property>   
</bean>

此方法问题:

需要针对每个mapper进行配置,麻烦。

1.6.3    通过MapperScannerConfigurer进行mapper扫描(建议使用)

在applicationContext.xml中配置mapper的批量扫描。

<!-- mapper 的批量扫描,从mapper包中扫除mapper接口,自动创建代理对象并在spring的容器中注册
    规范:需要将mapper接口类名和mapper.xml映射文件名车个保持一致,且在同一个目录中
       上边的规范是前提
 -->
 <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的报名
sqlSessionFactoryBeanName
自动扫描来的mapper的bean的id为mapper(类名)首字母小写
扫描多个包包之间用半角,号隔开
 -->
<propertyname="basePackage"value="cn.hpu.ssm.mapper"></property>
<propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory">
</property>
</bean>

 

1.6.4    第三步测试代码

public
class
UserMapperTest {
    private ApplicationContextapplicationContext;
        @Before
    public
void
setUp() throws Exception {
//得到spring容器
applicationContext= new ClassPathXmlApplicationContext("classpath:spring/applicationcontext.xml");
    }
    @Test
    public
void
testFindUserById() throws Exception{
    UserMapper userMapper=(UserMapper)
applicationContext.getBean("userMapper");
    User user=userMapper.findUserById(1);
    System.out.println(user.getUsername());
    }
}
 

摘自传智博客燕青老师的视频
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis spring