基于Spring+SpringMVC+MyBatis开发书评网Spring和MyBatis的整合

Posted 被雨遗忘的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring+SpringMVC+MyBatis开发书评网Spring和MyBatis的整合相关的知识,希望对你有一定的参考价值。

前提概要以及项目结构

本节讲述Spring和MyBatis的整合,但是还有一部分其他组件需要配置,所以整合在了一起,代码有标明第三部分。

 

项目结构图:

以下代码可以参考此图

 

 

一、 引入依赖 

<!-- 二、 spring和mybatis的整合-->
        <!-- 2.1 引入依赖:核心依赖 mybatis-spring -->
        <!-- MyBatis 底层也是要用jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- MyBatis与Spring整合组件 -->
        <!-- 问题:整合包该如何使用?-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>
        <!-- 数据库jdbc驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!-- 阿里巴巴druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.14</version>
        </dependency>

 

二、 整合配置:数据源与连接池 

<!-- 2.2 MyBatis与Spring的整合配置 -->
    <!-- 配置数据源与连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- JDBC驱动指向,MySQL8要加cj -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <!-- URL &符号需要转义-->
        <property name="url" value="jdbc:mysql://localhost:3306/imooc_reader?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>
        <!-- 用户名 -->
        <property name="username" value="root"/>
        <!-- 密码 -->
        <property name="password" value="629629"/>
        <!-- 初始化创建数据库连接数 -->
        <property name="initialSize" value="5"/>
        <!-- 最大允许数据库连接 -->
        <property name="maxActive" value="20"/>
    </bean>

 

三、 配置SqlSessionFactory 

<!-- 2.3 配置SqlSessionFactory -->
    <!-- SqlSessionFactoryBean用于根据配置信息创建SqlSessionFactory,不再需要我们自己编码创建 -->
    <!-- 原生Mybaits与Spring整合 -->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 设置数据源 指向前面创建的dataSource -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 存储sql语句的文件 -->
        <property name="mapperLocations" value="classpath:mappers/*.xml"/>
        <!-- 2.5 MyBatis配置文件地址 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

 

四、 配置Mapper扫描器  

<!-- 2.4 配置Mapper扫描器 -->
    <!-- spring初始化mybatis的过程中, 区分系统接口和mapper接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定包名 -->
        <property name="basePackage" value="com.imooc.reader.mapper"/>
    </bean>

 

五、 创建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>
    <settings>
        <!-- 属性名与字段名之间的驼峰命名转换 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

 

六、 JUnit单元测试  

<!-- 三、 整合其他组件 -->
        <!-- 3.1 单元测试依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!-- 测试开发阶段还未配置tomct,所以需要引入,tomcat自带-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- 声明,打包时会忽略这个依赖 -->
            <scope>provided</scope>
        </dependency>

 

七、 logback日志输出配置

7.1 pom.xml

<!-- 3.2 logback日志组件 精简版 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

7.2 logback配置文件  logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!-- logback自动加载此文件-->
<configuration>
    <!-- 追加器配置 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 编码器配置 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{HH:mm:ss} %-5level [%thread] %logger{30} - %msg%n</pattern>
            <!-- 解决中文乱码问题 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- level: 日志的最低输出级别-->
    <root level="debug">
        <appender-ref ref="console"/>
    </root>
</configuration>

 

八、 声明式事务配置  

<!-- 3.3 声明式事务配置-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 依赖到之前配置好的数据源 dataSource-->
        <!-- 作用: 控制事务的打开、提交、回滚 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 基于注解的事务配置模式 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

 

九、 测试

9.1 TestMapper 接口

package com.imooc.reader.mapper;

/**
 * @ClassName TestMapper
 * @Description TODO
 * @date 2021/5/7 17:07
 * @Param
 * @return
 */
public interface TestMapper {
    public void insert();
}

 

9.2 test.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.imooc.reader.mapper.TestMapper">
    <insert id="insert">
        insert into test(content) values('测试内容')
    </insert>
</mapper>

 

9.3 TestService 测试类

package com.imooc.reader.service;

import com.imooc.reader.mapper.TestMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @ClassName TestService
 * @Description 测试类
 * @date 2021/5/7 17:11
 * @Param
 * @return
 */

@Service
public class TestService {
    @Resource
    private TestMapper testMapper;

    // 事务控制注解:运行成功则进行全局提交,失败则全局回滚
    // 要么全部要么什么都不做
    // 这让我想起了初中充值饭卡的经历: 一百元分两次五十充值,可是系统只记录了一次五十,找学校多次都无果
    @Transactional
    public void batchImport() {
        for (int i = 0; i < 5; i++) {
            // 事务提交测试
//            if (i == 3) {
//                throw new RuntimeException("预期外异常");
//            }
            testMapper.insert();
        }
    }
}

 

9.4 TestServiceTest 测试用例

package com.imooc.reader.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

import static org.junit.Assert.*;


// 自动初始化IOC容器
@RunWith(SpringJUnit4ClassRunner.class)
// 声明配置文件在什么地方
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestServiceTest {

    // 注入TestService
    @Resource
    private TestService testService;

    @Test
    public void batchImport() {
        testService.batchImport();
        System.out.println("批量导入成功");
    }
}

 

 

十、 完整代码块

10.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>imooc-reader</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 引入阿里云镜像,加速 -->
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- 一、 spring与springMVC的整合-->
        <!-- 1.1 配置Maven依赖: 核心依赖:spring-webmvc -->
        <!-- 注意: maven的依赖需要引入到lab中 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- Freemarker模板引擎 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>

        <!-- Freemaker整合支持包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- Jackson 序列化工具包-->
        <!-- 核心 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- 实体类注解包,用于序列化与反序列化-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- 数据绑定包 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- 二、 spring和mybatis的整合-->
        <!-- 2.1 引入依赖:核心依赖 mybatis-spring -->
        <!-- MyBatis 底层也是要用jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- MyBatis与Spring整合组件 -->
        <!-- 问题:整合包该如何使用?-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>
        <!-- 数据库jdbc驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!-- 阿里巴巴druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.14</version>
        </dependency>

        <!-- 三、 整合其他组件 -->
        <!-- 3.1 单元测试依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!-- 测试开发阶段还未配置tomct,所以需要引入,tomcat自带-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- 声明,打包时会忽略这个依赖 -->
            <scope>provided</scope>
        </dependency>

        <!-- 3.2 logback日志组件 精简版 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>

</project>

 

10.2 applicationContext.xml

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

    <!--1.3 开启SpringMVC注解模式-->
    <context:component-scan base-package="com.imooc"/>
    <mvc:annotation-driven>
        <!-- 设置响应的字符集,解决响应时的中文乱码问题 -->
        <!-- 作用场景: 未使用freemaker的情况下,直接通过响应向客户端输出-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=utf-8</value>
                        <!-- 1.6 JSON(Jackson)序列化输出配置 -->
                        <!-- 解决JSON字符串输出时中文乱码的问题-->
                        <value>application/json;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- 将css、js排除在外,进而提高springMVC对URL的处理效率-->
    <mvc:default-servlet-handler/>

    <!-- 1.5 配置Freemarker模板引擎 -->
    <!-- Freemarker配置对象,通知springMVC在ftl文件下加载Freemarker脚本 -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!-- Freemarker脚本存放地址 -->
        <property name="templateLoaderPath" value="/WEB-INF/ftl"/>
        <!-- 针对于Freemarker本身需要配置哪些参数 -->
        <property name="freemarkerSettings">
            <!-- 核心属性: defaultEncoding , 默认的编码类型 -->
            <!-- 这里的编码设置和请求响应处的utf-8是没有关系的,此处解决的是读取ftl脚本时,脚本内的中文乱码问题-->
            <props>
                <prop key="defaultEncoding">UTF-8</prop>
            </props>
        </property>
    </bean>
    <!-- ViewResolver视图解析器 , 决定了选择哪种模板引擎来对数据进行解析 -->
    <bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!-- contentType响应类型 -->
        <!-- 使用视图解析器将模板引擎和数据结合,产生新的html片段,向响应输出时设置为utf-8 -->
        <!-- 作用场景: springMVC加载freemaker产生html片段时-->
        <property name="contentType" value="text/html;charset=utf-8"/>
        <!-- 模板引擎拓展名 -->
        <property name="suffix" value=".ftl"/>
    </bean>

    <!-- 2.2 MyBatis与Spring的整合配置 -->
    <!-- 配置数据源与连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!-- JDBC驱动指向,MySQL8要加cj -->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <!-- URL &符号需要转义-->
        <property name="url" value="jdbc:mysql://localhost:3306/imooc_reader?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>
        <!-- 用户名 -->
        <property name="username" value="root"/>
        <!-- 密码 -->
        <property name="password" value="629629"/>
        <!-- 初始化创建数据库连接数 -->
        <property name="initialSize" value="5"/>
        <!-- 最大允许数据库连接 -->
        <property name="maxActive" value="20"/>
    </bean>

    <!-- 2.3 配置SqlSessionFactory -->
    <!-- SqlSessionFactoryBean用于根据配置信息创建SqlSessionFactory,不再需要我们自己编码创建 -->
    <!-- 原生Mybaits与Spring整合 -->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 设置数据源 指向前面创建的dataSource -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 存储sql语句的文件 -->
        <property name="mapperLocations" value="classpath:mappers/*.xml"/>
        <!-- 2.5 MyBatis配置文件地址 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

    <!-- 2.4 配置Mapper扫描器 -->
    <!-- spring初始化mybatis的过程中, 区分系统接口和mapper接口 -->
    <!-- 自动生成mapper接口的实现类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定包名 -->
        <property name="basePackage" value="com.imooc.reader.mapper"/>
    </bean>

    <!-- 3.3 声明式事务配置-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 依赖到之前配置好的数据源 dataSource-->
        <!-- 作用: 控制事务的打开、提交、回滚 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 基于注解的事务配置模式 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

 

10.3 logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!-- logback自动加载此文件-->
<configuration>
    <!-- 追加器配置 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 编码器配置 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{HH:mm:ss} %-5level [%thread] %logger{30} - %msg%n</pattern>
            <!-- 解决中文乱码问题 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- level: 日志的最低输出级别-->
    <root level="debug">
        <appender-ref ref="console"/>
    </root>
</configuration>

 

10.4 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>
    <settings>
        <!-- 属性名与字段名之间的驼峰命名转换 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

 

10.5 test.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.imooc.reader.mapper.TestMapper">
    <insert id="insert">
        insert into test(content) values('测试内容')
    </insert>
</mapper>

yBatis配置文件

以上是关于基于Spring+SpringMVC+MyBatis开发书评网Spring和MyBatis的整合的主要内容,如果未能解决你的问题,请参考以下文章

spring与mybati整合方法

自己开发的音乐视频网站

Spring Boot整合Mybati之逆向工程

抽奖活动啦!5本SpringMVC+MyBatis相关3本Android Studio相关6本Kafka相关

spring+mybati java config配置引起的bean相互引用日志报警告问题

Spring基于注解及SpringMVC