【Spring】学习笔记009--Spring整合Mybatis


  学习完了Mybatis和Spring,一定要将它们串联起来才能够发挥最大的作用,下面我们来看看如何将Spring和Mybatis整合起来

前期准备

  首先导入我们需要的maven依赖

    
        
            org.mybatis
            mybatis
            3.5.5
        
        
            mysql
            mysql-connector-java
            5.1.6
            runtime
        
        
            junit
            junit
            4.13.1
        
        
        
            org.springframework
            spring-webmvc
            5.3.3
        
        
        
            org.springframework
            spring-jdbc
            5.3.3
        
        
            org.aspectj
            aspectjweaver
            1.9.4
        
        
            org.mybatis
            mybatis-spring
            2.0.6
        
    

1.方式一

  方式一比较繁琐,需要利用到SqlSession,有点绕,需要我们多去理解一下,我们来看一下

  mybatis配置(mybatis-config.xml、spring-dao.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>

    <typeAliases>
        <package name="com.aircl.domain"/>
    typeAliases>
configuration>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/testdatabase001"/>
        <property name="username" value="root"/>
        <property name="password" value="mySQL12138"/>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>

        
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        
        <property name="mapperLocations" value="classpath:com/aircl/dao/*.xml"/>
    bean>

    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    bean>
beans>

  Spring配置(applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="spring-dao.xml"/>

    <bean id="user" class="com.aircl.domain.User"/>
    <bean id="userDao" class="com.aircl.dao.UserDaoImpl">
        <property name="sqlSession" ref="sqlSession"/>
    bean>
    <bean id="userService" class="com.aircl.service.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    bean>

beans>

  domain层

@Alias("user")
public class User implements Serializable {
    private int id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  dao层

  在这种方式中需要使用到DaoImpl来通过注入SqlSession拿到Mapper.xml

public interface UserDao {
    public List selectUser();
}
public class UserDaoImpl implements UserDao {
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    public List selectUser() {
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        return userDao.selectUser();
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aircl.dao.UserDao">
    <select id="selectUser" resultType="com.aircl.domain.User">
        select * from user
    select>
mapper>

  service层

public interface UserService {
    public List selectUser();
}
public class UserServiceImpl implements UserService {
    private UserDaoImpl userDao;

    public void setUserDao(UserDaoImpl userDao) {
        this.userDao = userDao;
    }

    public List selectUser() {
        return userDao.selectUser();
    }
}

  测试

  测试时我们直接拿到applicationContext.xml就可以跑起来

public class MyTest {
    @Test
    public void testUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        for (User user : userService.selectUser()) {
            System.out.println(user.toString());
        }
    }
}

2.方式二

  第二种方式很简单,是我常用的方式,我们不需要使用SqlSession去拿Mapper.xml,我们使用MapperScanner去扫描我们的dao包,自动将mapper注册到spring中,简单快捷,下边我们来看一看

  mybatis配置

<?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>

    <typeAliases>
        <package name="com.aircl.domain"/>
    typeAliases>
configuration>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/testdatabase001"/>
        <property name="username" value="root"/>
        <property name="password" value="mySQL12138"/>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>

        
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        
        <property name="mapperLocations" value="classpath:com/aircl/dao/*.xml"/>
    bean>

    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.aircl.dao"/>
    bean>
beans>

  spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="spring-dao.xml"/>

    <bean id="user" class="com.aircl.domain.User"/>
    <bean id="userService" class="com.aircl.service.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    bean>

beans>

  domain层

package com.aircl.domain;

import org.apache.ibatis.type.Alias;

import java.io.Serializable;
import java.util.Date;

/**
 * Description :
 *
 * @author : AirCL
 * Date : 2021/2/6
 * Time : 14:11
 */
@Alias("user")
public class User implements Serializable {
    private int id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  dao层

  这种方式的dao层不需要DaoImpl去拿SqlSession取Mapper.xml,直接一个dao接口+Mapper.xml即可

public interface UserDao {
    public List selectUser();
}
<?xml version="1.0" encoding="UTF-8" ?>
DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aircl.dao.UserDao">
    <select id="selectUser" resultType="com.aircl.domain.User">
        select * from user
    select>
mapper>

  service层

  service层也不需要使用DaoImpl对象,直接使用Dao接口对象即可,mapperscanner会将dao接口注册到spring中,以供我们使用

public interface UserService {
    public List selectUser();
}
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public List selectUser() {
        return userDao.selectUser();
    }
}

  测试

public class MyTest {
    @Test
    public void testUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        for (User user : userService.selectUser()) {
            System.out.println(user.toString());
        }
    }
}