SSM框架开发web项目类别(五) Spring集成MyBatis

  前言

  在前头的MyBatis部分情节中,我们曾经足以独立的基于MyBatis构建一个数据库访问层应用,但是在其实的品种开支中,我们的次第不会这么简单,层次也愈发扑朔迷离,除了这里说到的持久层,还有工作逻辑层、视图层等等,随着代码量和要求复杂度渐渐增强,对象的开创、管理以及层与层之间的耦合度等等问题随之而来。Spring是眼下相比较流行的框架,它解决了成千上万诸如层次之间松耦合、辅助管理对象等题材。假设是有准备上学MyBatis的人,应该或多或少都学习过仍旧打听过Spring了,本篇要通过Spring集成MyBatis,首先要对Spring要旨的概念IOC和AOP有个为主认识。

  首先回顾下IOC,控制反转(Inversion of
Control,英文缩写为IOC),前边讲到的层与层之间的耦合问题在Spring中,即由此操纵反转解决的,那么控制具体是决定什么,反转是怎么样反转?大家在学习初期,成立对象用到最多的再三就是new语句,假设需要一个Person类的实例对象,大家就足以由此 Person p = new
Person();
获取大家想要的,进一步引申,在我们的开支中,假使事情逻辑Service层需要一个持久层Dao的实例,那么我们也可以在这些Service(Service)中一贯new一个Dao实例,这样就一定于是我们协调在控制那些目的的创导和管理等等,但实则品种中引入Spring后,我们无需协调去制造对象,而是交由Spring创制和治本,控制反转具体来看,应该是决定目的的创设、管理等等,这个任务的反转,原来是大家的天职,现在反转到了Spring容器这边管理。另外说道IOC,往往还伴随着一个DI(Dependency
Injection)依赖注入的定义,前边为何要在一个层的类中成立(获取)另一个类对象,是因为类与类之间的依赖性,如果由我们积极在类中创造对象,会使得项目高耦合,灵活度大大降低。而通过倚重注入可以让大家轻松获取由容器创制和管理的目标,而不需要在程序中硬编码成立对象,从而达成解耦程序。看重注入,基于Java反射,是决定反转的一种具体实现模式。

  AOP(Aspect Oriented
Programming)面向切面编程,使用到Java中代理形式,是对面向对象编程的一种补偿,而不是竞争或争论,例如大家看待一段web项目访问过程,首先访问模块A,随之系统会记录走访日志,然后访问模块B,系统也会跟着记录走访日志,以面向对象的考虑来看,此前到后,这是两段完整的经过,每段过程中又包括我们的造访和系统的日记记录两种操作。但是换来那里的断面思维,大家每访问一个模块,系统都会随之有记录走访日志,把这么些记录日志的动作以切面抽取并封装起来,可以减掉系统的重复代码,降低模块之间的耦合度,提升系统的可操作性和可维护性。常见应用有例如事务管理、日志管理、安全控制等等。

  Spring集成MyBatis

  既然Spring容器能协助大家制造和管理对象,那么在那边,不同于前边的独立MyBatis程序,大家得以把这一个拿到对象的经过依据Spring的章程做些修改。首先来回顾上边前我们做MyBatis单独测试的艺术代码,示例如下:

@Test
    public void testCore() throws IOException {
        //直接实例SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //MyBatis配置文件路径
        String path = "mybatis-config.xml";
        //通过路径获取输入流
        Reader reader = Resources.getResourceAsReader(path);
        //通过reader构建sessionFactory
        SqlSessionFactory sessionFactory = builder.build(reader);
        //获取SqlSession对象
        SqlSession sqlSession = sessionFactory.openSession();
        //获取Mapper实例
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);

        Dept dept = mapper.selectById(10001);
        Company company = dept.getCompany();        //所属公司
        List<Emp> empList = dept.getEmpList();        //员工集合
        System.out.println(dept);
    }

  这里的SqlSessionFactory、SqlSession、Mapper实例等对象都是由大家手动去自己创设,下面正文开始通过Spring集成模式,大家可以撤消这个创制对象的代码。

  数据库环境MySql,工具Navicat for
MySQL,创造一张Person表如下所示,并填入几条测试数据

图片 1

  新建Maven项目,可以是司空眼惯Jar项目,简单选quickstart这些,工程社团如下所示:

图片 2

POM依赖可参看SSM框架开发web项目体系(一)
环境搭建篇

  实体类Person

package com.mmm.pojo;

public class Person {
    private Integer id;            //主键
    private String name;        //姓名
    private String gender;        //性别
    private Integer age;        //年龄
    private String ifIT;        //是否从事IT行业

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getIfIT() {
        return ifIT;
    }
    public void setIfIT(String ifIT) {
        this.ifIT = ifIT;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", gender=" + gender
                + ", age=" + age + ", ifIT=" + ifIT + "]";
    }

}

  mybatis-config.xml

<?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>
    <!-- 这里可以定义类的别名,在mapper.xml文件中应用会方便很多 -->
    <typeAliases>
        <typeAlias alias="psn" type="com.mmm.pojo.Person" />
    </typeAliases>
    <!-- 这里的环境配置中事务管理器和数据源分别在Spring配置文件中去配置,所以原本这里的部分就可以不写了 -->
    <!-- <environments default="envir">
        <environment id="envir">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.0.100:3306/ssm?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments> -->
    <!-- 通过在Spring集成MyBatis配置文件中SqlSessionFactoryBean中的mapperLocations属性配置实现sql映射xml文件的扫描,所以下面的mappers在这里也可以不写了-->
    <!-- <mappers>
        <mapper resource="com/mmm/mapper/personMapper.xml"/>
    </mappers> -->
</configuration>

  application-root.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:p="http://www.springframework.org/schema/p"  
    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-4.0.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/aop    
                        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                        http://www.springframework.org/schema/tx    
                        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  

    <!-- 引入jdbc参数配置 --> 
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- Spring会自动扫描base-package指定包下面添加了@Component @Service等注解的类并将其实例化 -->
    <context:component-scan base-package="com.mmm" />

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- spring和MyBatis整合 -->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- 自动扫描mapping.xml文件 -->  
        <property name="mapperLocations" value="classpath:com/mmm/mapper/*.xml"></property>  
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>  

    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.mmm.mapper" />  
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>

     <!-- <bean id="personMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
         <property name="mapperInterface" value="com.mmm.mapper.PersonMapper" />
         <property name="sqlSessionFactory" ref="sqlSessionFactory" />
     </bean> -->
</beans>

  jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm
jdbc.username=root
jdbc.password=123456

  PersonMapper.java

package com.mmm.mapper;

import java.util.List;

import com.mmm.pojo.Person;

public interface PersonMapper {

    //查找所有Person对象
    List<Person> selectAll();

}

  personMapper.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">

<mapper namespace="com.mmm.mapper.PersonMapper">
    <resultMap type="psn" id="personResultMap">
        <id column="ID" property="id" />
        <result column="NAME" property="name" />
        <result column="GENDER" property="gender" />
        <result column="AGE" property="age" />
        <result column="IF_IT" property="ifIT" />
    </resultMap>

    <select id="selectAll" resultMap="personResultMap">
        select * from person
    </select>

</mapper>

   最终我们的测试方法就绝不像从前那么制造一体系的对象,可以透过如下格局:

package com.mmm.test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mmm.mapper.PersonMapper;
import com.mmm.pojo.Person;

public class TestSpringMbs {

    @SuppressWarnings("resource")
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("application-root.xml");
        PersonMapper personMapper = (PersonMapper) context.getBean("personMapper");
        List<Person> list = personMapper.selectAll();
        for(Person p:list) {
            System.out.println(p);
        }

    }

}

  最后运行一下测试方法,可以看到如下结果,获取到数据库Person表全部笔录,即成功运行

图片 3

  小结

  这里通过Spring集成MyBatis的一个很基础的演示,我们能对Spring集成ORM框架的大体过程有个核心认识,不仅仅是MyBatis,类似Hibernate、JPA那块在Spring集成过程中基本步骤大致也包涵了本文中的部分。框架会变,但是有些系统的硬性要求不会变,就好比这里的持久层,你要访问数据库,无论你用MyBatis,仍旧Hibernate,甚至是原生的JDBC,数据库的造访账号密码,只可是一步步封装到了框架中的数据源;我们的换代提交回退等等,在框架中演化成事务管理。理清这一个硬性要求并跟随者去学习,往往能更顺畅的一遍遍地思念和清楚。而不是说你学了半天MyBatis,觉得数据库操作什么都没问题了,然后猛地换个Hibernate,感觉一片迷茫,认清这一个基本的定义,往往能帮助大家迅速的类比学习新知识。

网站地图xml地图