Spring整合Mybatis的原理(IOC) 思路 及演示示例

文章目录

    • 一、Spring整合Mybatis的原理
    • 二、回顾mybatis使用步骤
    • 三、Spring整合Mybatis
    • 依赖
    • 目录及普通类
    • 四个配置文件
    • 数据库
    • 测试

一、Spring整合Mybatis的原理

1、目的:把mybatis框架和spring框架集成在一起, 像一个框架一样使用。

2、用的技术是:spring中ioc的思想

3、为什么要用ioc?
能把mybatis和spring集成在一起, 像一个框架,是因为ioc能创建对象
可以把mybatis框架中的对象交给spring统一创建, 开发人员从spring容器中获取对象。开发人员就不用同时面对两个或多个框架了,就面对一个spring即可

二、回顾mybatis使用步骤

1、大体思路:
(1)定义dao接口,如:studentDao;
(2)定义mapper文件studentDao . xml;
(3)定义mybatis的主配置文件mybatis.xml;
(4)创建dao的代理对象

studentDao dao = Sq1Session . getMapper (studentDao.class) ;
List students = dao. selectstudents() ;

2、要使用dao对象,需要使用getMapper ()方法,怎么能使用getMapper()方法,需要哪些条件呢?

(1)获取sqlSession对象,需要使用sqlSessionfactory的opensession()方法;
(2)创建SqlSessionFactory对象。通过读取mybatis的主配置文件,能创建sq1SessionFactory对象;
(3)需要sqlSessionFactory对象,使用Factory能 获取sqlSession,有了sqlSession就能有dao,目的就是获取dao对象Factory创建需要读取主配置文件。

小结:想获得dao对象 --> sqlSession对象 --> sqlSessionFactory对象调用opensession()方法 --> 读取mybatis的主配置文件

3、主配置文件:
(1)数据库信息
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第1张图片
(2)mapper文件的位置
在这里插入图片描述
4、通过以上的说明,我们需要让spring创建以下对象
(1)独立的连接池类的对象,使用阿里的druid连接池
(2)SqlSessionFactory对象
(3)创建出dao对象

在这里插入图片描述

三、Spring整合Mybatis

依赖

1、引入依赖

       <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--spring-test(对JUnit的封装)-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.8.RELEASE</version>
            <scope>test</scope>
        </dependency>

       <!--ioc核心-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

       <!--德鲁伊连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>

       <!--驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

       <!--事务-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

       <!--事务相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

       <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

       <!--mybatis与spring集成的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

2、在pom.xml中加入以下插件和扫描properties、xml(这一点很重要)

     <build>
        <!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中-->
        <resources>
            <resource>
                <directory>src/main/java</directory><!--所在的目录 -->
                <includes>
                    <!--包括目录下的.properties、.xml文件都会扫描-->
                    <include>**/*.properties
                    **/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <!--指定jdk版本-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
    </build>

目录及普通类

1、目录结构(dao层、service层、三个配置文件(mapper、mybatis配置文件、spring配置文件)):
配置文件关系:spring配置文件中包含mybatis配置文件,mybatis配置文件中包含mapper配置文件

Spring整合Mybatis的原理(IOC) 思路 及演示示例_第2张图片
2、BookDao接口(充当持久层,里面有操作数据库的方法,供BookService调用)

package com.mybatis.dao;
import com.mybatis.domain.Book;
import java.util.List;
public interface BookDao {
    //添加书籍的方法
    int addBook(Book book);  // 演示
    //查询所有书籍的方法
    List<Book> findAllBook();  // 演示
}

3、BookService接口(充当业务层)

package com.mybatis.service;
import com.mybatis.domain.Book;
import java.util.List;
public interface BookService {
    List<Book> findAllBook();
    int addBook(Book book);
}

4、BookServiceImpl实现类(创建了一个BookDao,并调用了BookDao中的方法)

package com.mybatis.service;
import com.mybatis.dao.BookDao;
import com.mybatis.domain.Book;
import java.util.List;
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    @Override
    public List<Book> findAllBook() {
        List<Book> allBook = bookDao.findAllBook();
        return allBook;
    }
    @Override
    public int addBook(Book book) {
        int nums = bookDao.addBook(book);
        return nums;
    }
}

5、Book实体类与数据库表字段一一对应

package com.mybatis.domain;
public class Book {
    private int book_id;
    private String name;
    private double price;
    public Book() {
    }
    public Book(int book_id, String name, double price) {
        this.book_id = book_id;
        this.name = name;
        this.price = price;
    }
    public int getBook_id() {  return book_id;}
    public void setBook_id(int book_id) {this.book_id = book_id; }
    public String getName() {return name;}
    public void setName(String name) { this.name = name;}
    public double getPrice() { return price;}
    public void setPrice(double price) {this.price = price; }
    @Override
    public String toString() {
        return "Book1{" +
                "book_id=" + book_id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

四个配置文件

1、mapper配置文件(与BookDao接口名要一致)

<?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.mybatis.dao.BookDao">

    <insert id="addBook">
        insert into book values (#{book_id},#{name},#{price})
    </insert>

    <select id="findAllBook" resultType="com.mybatis.domain.Book">
        select * from `book`
    </select>

</mapper>

2、mybatis配置文件(连接mapper文件)

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

    <!--settings:控制mybatis全局行为-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--设置别名-->
    <typeAliases>
        <!--name:实体类所在的包名-->
        <package name="com.mybatis.domain.Book"/>
    </typeAliases>

    <!--sql mapper(sql映射文件的位置 -->
    <mappers>
        <!--name:是包名,这个包中的所有mapper.xml一次都能加载-->
        <package name="com.mybatis.dao"/>
    </mappers>
</configuration>

3、spring配置文件(连接mybatis文件)

<?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:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util.xsd
                           http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--     开启组件扫描(全包扫描的方式)-->
    <context:component-scan base-package="com.mybatis"></context:component-scan>

    <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--声明数据源,配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <!-- driverClassName可以不要(官方明确说明)-->
        <!--    <property name="driverClassName" value="${prop.driverClass}"></property>-->
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
        <property name="maxActive" value="${prop.maxActive}"></property>
    </bean>

    <!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--set注入,把数据库连接池赋给dataSource属性-->
        <property name="dataSource" ref="dataSource"/>
        <!--mybatis主配置文件的位置
            configLocation属性是Resource类型,读取配置文件
            它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置-->
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

    <!--创建dao对象,使用sqlSession的getMapper (StudentDao.class )
        MapperScannerConfigurer:在内部调用getMapper()生成每个dao接口的代理对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定SqlSess ionFactory对象的-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--指定包名,包名是dao接口所在的包名。
         MapperScannerConfigurer会扫描这个包中的所有接口, 把每个接口都执行
        一次getMapper()方法,得到每个接口的dao对象。
        创建好的dao对象放入到spring的容器中的。-->
    <property name="basePackage" value="com.mybatis.dao"/>
        </bean>

    <!--声明Service-->
    <bean id="bookServiceImpl" class="com.mybatis.service.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

</beans>

4、jdbc配置文件(修改为你的数据库名和密码以及数据库名称)

prop.url=jdbc:mysql://localhost:3306/day17
prop.userName=root
prop.password=123456
prop.maxActive=10

这些配置文件可以设置为模板文件,下次可以直接简单修改使用,作法见下链接:
另外:新版IDEA创建各种模板文件(下次new新建时直接使用)包括修改自带的文件模板

数据库

1、结构
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第3张图片

2、sql

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book`  (
  `book_id` int(255) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `price` double(10, 2) NOT NULL,
  PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 53 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, 'Java基础', 55.55);
INSERT INTO `book` VALUES (2, '深入理解JVM', 69.85);
INSERT INTO `book` VALUES (3, '数结构与算法', 47.31);
INSERT INTO `book` VALUES (4, 'Redis进阶', 78.92);
INSERT INTO `book` VALUES (5, 'sql优化++', 82.31);

SET FOREIGN_KEY_CHECKS = 1;

3、复制 > 新建文本文档 > 粘贴 > 另存为sql类型
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第4张图片
4、运行刚刚另存的sql文件
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第5张图片

测试

测试类(我全部使用的是注解)

package mybatis;

import com.mybatis.domain.Book;
import com.mybatis.service.BookServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)  //单元测试框架
@ContextConfiguration("classpath:applicationContext.xml")   //加载配置文件
public class BookTest {
    @Autowired  //注入
    private BookServiceImpl bookService;
    @Test   //查询所有数据
    public void findAll() {
        List<Book> list = bookService.findAllBook();
        for (Book book : list) {
            System.out.println(book);
        }
    }
    @Test  //添加一条数据
    public void addBook() {
        Book book = new Book();

        book.setBook_id(6);
        book.setName("spring全家桶");
        book.setPrice(109.73);
        int num = bookService.addBook(book);
        System.out.println(num);//返回影响的行数
    }
}

连接数据库开始测试查询所有数据方法:
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第6张图片
测试添加数据方法:
Spring整合Mybatis的原理(IOC) 思路 及演示示例_第7张图片
其中有些注意事项:你要报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)请看这篇文章

有问题请留言哦

有用点个关注,手留余香!

你可能感兴趣的:(Spring)