SSM整合——持久层的整合(spring和mybatis的整合)

学完ssm后,需要把三大框架整合起来,下面我们就来看一下。
第一步:搭建环境:
将所需要的jar包导入,jar包包括:
1.Mybatis核心和Mybatis依赖包
2.Mybatis和spring整合包
3.Spring的jar(包括springmvc的jar包)
4.数据库驱动包
5.第三方数据库连接池
由于jar包比较多,不一一解释。需要的可以留下你的邮箱,我可以发给你。
第二步:创建配置文件:
按照我的习惯,在和src目录同级的地方创建一个config文件夹,里面存放所有的配置文件,在这个文件夹中,我们基于框架分成,spring的配置和mybatis的配置。
在mybatis中,我们需要创建mybatis全局配置文件——SqlMapCoonfig配置文件:主要为了加载我们的映射文件。
在spring中,我们需要创建applicationContext.xml——spring配置文件(配置公用内容:数据源、事务)
springmvc.xml———-springmvc的全局配置文件
applicationContext- dao.xml—spring和mybatis整合的配置(SqlSessionFactory、mapper配置)
applicationContext-service.xml—配置业务接口
还有db.properties——数据库连接参数
log4j.properties—日志 配置文件
这里写图片描述
第三步:创建我们的工程结构
创建我们的包:
这里写图片描述
com.my.ssm.action:Action层
com.my.ssm.dao.mapper:(此处用不到,是用动态代理方法时候用到的)
com.my.ssm.test:做测试用到
com.my.ssm.dao:里面存放原始的dao和daoImpl。(建议大家讲接口和实现类分开)
com.my.ssm.po:存放bean
com.my.ssm.service:业务层。
第四步:填写配置文件:
首先我们看一下整合步骤:
整合步骤:
1、整合持久层
Mybatis和spring整合
整合目标:mapper创建由spring来管理
SqlSessionFactory由spring管理(设置单例 )

2、整合业务层
Spring管理service
整合目标:Service通过spring调用mapper

3、整合控制层
因为springmvc是spring一个模块,只要加入jar包,配置springmvc.xml和web.xml即可。
整合目标:action中通过spring调用service
先来看整合持久层:
我们整合持久层的目标是什么?就是让spring来管理mapper的创建。
这里我们讲两种方法:
1.通过spring开发原始的dao:
首先在applicastion中配置我们的数据源:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.1.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.1.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
        <!-- 加载配置文件 -->
        <context:property-placeholder location="classpath:db.properties" />
        <!-- 使用第三方的数据库连接池dbcp -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <!-- 开发阶段数据库最大连接数建议设置小一点够用即可,设置为3 -->
            <property name="maxActive" value="${jdbc.maxActive}" />
            <property name="maxIdle" value="${jdbc.maxIdle}" />
        </bean>
</beans>

配置完数据源以后,谁用呢。肯定是操作数据库地方会用到,所以在com.my.ssm.dao.old下创建UserDao和UserDaoImpl。
UserDao:

/**
 * Dao接口
 * @author user
 *
 */
public interface UserDao {
    public User findUserById(int id) throws Exception;
}

UserDaoImpl:

/**
 * UserDaoImpl
 * @author user
 *
 */
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    @Override
    public User findUserById(int id) throws Exception {
        //SqlSession
        SqlSession sqlSession = this.getSqlSession();
        return sqlSession.selectOne("test.findUserById", id);
    }

}

这里为什么要继承SqlSessionDaoSupport 呢,因为我们之前学mybatis中说过,SqlSessionDaoSupport 中可以获取SqlSession。所以我们要继承SqlSessionDaoSupport,这样就可以操作数据库了。
可以获取SqlSession,但是获取SqlSession需要在SqlSessionFactory中获取,所以在我们的applicationContext-dao.xml中需要配置SqlSessionFactory:
还要配置UserDao的sqlSessionFactory属性(从SqlSessionDaoSupport 继承而来):
applicationContext-dao.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.1.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.1.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">

        <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置SqlMapConfig.xml -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
    </bean>
        <!-- 配置userDao -->
     <bean id="userDao" class="com.my.ssm.dao.old.UserDaoImpl">
        <!--注入会话工厂-->
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
    </bean> 
</beans>

再来看UserDaoImpl的返回值,

return sqlSession.selectOne("test.findUserById", id);

test.findUserById是nameSpace+id拼接出来的,id是参数,所以我们还要在mapper中配置sql语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址-->

<mapper namespace="test">
     -->
    <select id="findUserById" parameterType="int" resultType="com.my.ssm.po.User">
        SELECT * FROM user1 WHERE id = #{id}
    </select>
</mapper>

那这个mapper在哪加载呢,肯定实在SqlMapConfig中加载:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <mappers>
        <!-- 加载原始Dao 使用的映射文件-->
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

这样就配置完了,下面我们做一个测试:

/**
 * 测试类
 * @author user
 *
 */
public class DaoTest {
    private ApplicationContext applicationContext;
    public void test() throws Exception {
        applicationContext = new ClassPathXmlApplicationContext(new String[] {
                "spring/applicationContext.xml",
                "spring/applicationContext-dao.xml"
        });
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        User user = userDao.findUserById(1);
        System.out.println(user.toString());
    }
    public static void main(String[] args) throws Exception {
        DaoTest test = new DaoTest();
        test.test();
    }
}

2.动态代理方法
在我们的com.my.ssm.dao.mapper下创建mapper接口和mapper类:
UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址-->
<mapper namespace="com.my.ssm.dao.mapper.UserMapper">

    <!-- 根据用户id查询一条记录(返回单条记录) -->
    <!-- 
    select标签表示sql查询,内容会封装到Mapped Statement中。
    可以将这个select标签称为一个Statement
    id:Statement的id,用于标识select中定义的 sql,id是在同一个命名空间中不允许重复
    #{}:表示一个占位符,避免sql注入
    parameterType:表示输入参数的类型
    resultType:表示输出 结果集单条记录映射的java对象类型,select查询的字段名和resultType中属性名一致,才能映射成功。
    #{value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用#{}占位符,变量名可以使用value或其它的名称 
     -->
<select id="findUserById" parameterType="int" resultType="com.my.ssm.po.User" >
        SELECT * FROM user1 WHERE id = #{id}
</select>

说明:
1.这里注意namespace命名空间的特殊作用:是mapper接口的地址,就是为了mapper接口能够找到mapper.xml。
2.注意select 的id,应该和mapper中的接口方法名字一致,parameterType和接口方法的参数一致,resultType和接口方法的返回值一致。
这样接口方法才会找到并且执行。

然后在我们的applicationContext-dao.xml中配置mapper动态代理

<!-- mapper动态代理 -->
    <!-- 配置userMapper
    MapperFactoryBean:用于生成 代理对象-->

    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
         <!-- 注入会话工厂-->
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
        <!--mapper接口 -->
        <property name="mapperInterface" value="com.my.ssm.dao.mapper.UserMapper"/>
    </bean>

说明:
1.bean的calss是用于用于生成 代理对象,需要配置两个参数:第一个是会话工厂,第二个是mapper接口。
最后在我们的sqlMapConfig.xml中包含该xml即可

<!--批量mapper扫描 遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同 
<package name="com.my.ssm.dao.mapper"/> -->

但是这样配置,如果我们有n个mapper接口,需要配置n次的动态代理,所以我们要把他升级一下。
也就是我们的批量扫描:
在applicationContext.xml中配置如下:

<!-- 使用mapper批量扫描器扫描mapper接口
        规则:mapper.xml和mapper.java在一个目录 且同名即可 
        扫描出来mapper,自动让spring容器注册,bean的id就是mapper类名(首字母小写)
     -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 会话工厂 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
              <!-- 扫描包路径 
              多个包中间用半角逗号分隔
               -->
        <property name="basePackage" value="com.my.ssm.dao.mapper"/>
    </bean>

获取时候bean的id就是mapper类名的小写。
这样配置了,我们也可以把sqlMapConfig的

<!--批量mapper扫描 遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同 
        <package name="com.my.ssm.dao.mapper"/> -->

省略即可。
这样我们的持久层的 spring和mybatis整合就结束了

猜你喜欢

转载自blog.csdn.net/qq_39411208/article/details/81903146