spring 和 mybatis 的整合

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使用mybatisspring整合包中的 -->

   <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">

      <!-- 数据库连接池 -->

      <propertyname="dataSource"ref="dataSource"/>

      <!-- 加载mybatis的全局配置文件 -->

      <propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"/>

   </bean>

 

</beans>

 

 

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

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

自动扫描来的mapperbeanidmapper(类名)首字母小写

扫描多个包包之间用半角,号隔开

 -->

<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());

    }

}

 

摘自传智博客燕青老师的视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值