Полное объяснение процесса интеграции SSM framework (IDEA + Maven)

Java

Открыто каждый день

2020-05-21: Временно обновите исходники интеграции с SSM, в этот раз рановато, не помню, позже перепишу более полный, и добавлю ссылку

GitHub.com/ideal-20/SS…

В предыдущих статьях я написал несколько статей о технологии, связанной с внедрением Mybatis, Spring и Spring MVC.

Интеграция этих трех фреймворков — это то, что мы часто называем SSM.Есть еще много проектов, использующих SSM для разработки.Сегодня мы собираемся представить, как интегрировать и использовать SSM.

Если у вас есть нуждающиеся друзья, вы также можете обратиться к некоторым статьям начального уровня, которые я написал в Nuggets для этих фреймворков некоторое время назад.Все они подходят для друзей начального уровня, и техническое содержание может быть невысоким.


① [длинный текст 4D] пружинные рамки, простой введение слоя по слою (IOC и DI)nuggets.capable/post/684490…

② Spring знает двух братьев, которые настраивают IOC через одну таблицу CURD (XML и аннотацию)nuggets.capable/post/684490…

③ [длинный текст из 4 слов] Spring AOP легко начать шаг за шагом!nuggets.capable/post/684490…

④[Длинный текст 4D] Spring MVC легко начать работу слой за слоем!nuggets.capable/post/684490…

⑤ MyBatis от распознавания к созданию средыnuggets.capable/post/684490…

⑥ Вход MyBatis в пользовательскую структуру MyBatisnuggets.capable/post/684490…

⑦ MyBatis быстро начинает добавлять, удалять, изменять и проверятьnuggets.capable/post/684490…

⑧ Конфигурация MyBatis на основе динамических операторов SQLnuggets.capable/post/684490…

⑨ ⑨字 文文 Возьмите вас - многотабличный запрос MYBATInuggets.capable/post/684490…

⑩ Введение в технологию кэширования MyBatisnuggets.capable/post/684490…


(1) Создайте базовую среду

Соответственно объясните мибати, весна, весна MVC в предыдущее время, есть несколько разных конфигураций

① Чистый XML ② Аннотации + XML ③ Чистые аннотации

Мой самый распространенный метод - второй, то есть аннотация + XML, Конечно, этот метод также является более популярным методом настройки, поэтому мы представим его ниже.

(1) Создать базу данных и таблицу

Базы и таблицы не фиксированы и могут быть созданы сами.Следующее создание - это простейшая библиотека и таблица, но на самом деле она не очень стандартизирована, просто чтобы всем было понятно как можно больше, всего три номера полей, название, баланс

Несколько фрагментов данных приведены ниже, удобно подождать некоторое время для тестирования

-- 创建数据库
CREATE DATABASE ssm;

-- 使用数据库
USE ssm;

/*==============================================================*/
/* Table: account                                            	*/
/*==============================================================*/
CREATE TABLE account(
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(32),
	balance DOUBLE
);

-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES (1, '张三', 1000);
INSERT INTO `account` VALUES (2, '李四', 1000);
INSERT INTO `account` VALUES (3, '王五', 1000);
INSERT INTO `account` VALUES (4, '汤姆', 2000);

(2) Создайте проект Maven

Если вы друг, который учился здесь шаг за шагом, все они должны были быть в контакте с Maven, но могут быть некоторые друзья, которые не были знакомы с этим и все же решили поместить пакет jar в папку lib. метод, безусловно, осуществим, но найти соответствующий пакет jar на самом деле относительно громоздко, и если он предназначен для разработки несколькими людьми, версия пакета jar может отличаться, что может привести к изменению версии других зависимых пакетов jar, а внесение ошибок может привести к вызванной некоторыми версиями проблеме совместимости, поэтому пользоваться Maven все равно очень нужно.Тем, кто не был с ними в контакте, я все же рекомендую о них узнать.

① Сначала создайте проект Maven.

Выберите использование скелета maven-archetype-webapp , это наиболее часто используемый нами скелет для создания веб-сайта.

② Затем выберите Далее

GroupID – это уникальный идентификатор проектной организации. Вообще говоря, его можно настроить так, чтобы он соответствовал структуре пакета, то есть структуре каталогов java в основном каталоге. Его можно установить в порядке, обратном доменному имени. .Конечно, это не обязательно.Я, например, поставил cn.ideal

ArtifactID — это уникальный идентификатор проекта, обычно равный названию проекта.

Именно через эти два значения формируется «координата», которая может обеспечить уникальность предмета.

③ Перейдите к следующему шагу

Ниже показана некоторая информация из репозитория Maven.

Однако из-за создания архетипа maven во время создания будет выполняться команда mvn archetype:generate, поэтому необходимо указать файл archetype-catalog.xml.В команде есть три значения параметра -DarchetypeCatalog

  • удаленный: получить archetypeCatalog из удаленного центрального репозитория Maven (по умолчанию)
  • внутренний: получен из встроенного файла archetypeCatalog maven-archetype-plugin
  • local: локальный файл archetypeCatalog

Все, что нам нужно сделать, это добавить такой набор пар ключ-значение, который может ускорить создание проектов.

  • DarchetypeCatalog
  • internal

④ Перейдите к следующему шагу, говорить нечего, просто Готово

(3) Измените pom.xml, чтобы ввести зависимость от координат

Сначала измените версию с 1.7 --> 1.8

Также см., что мы дали некоторые выше<xxx.version>几点几</xxx.version>Это называется блокировкой версии. Версией управляют здесь единым образом. Например, если вам нужно изменить зависимую версию в будущем, вам не нужно менять ее одну за другой. Вы можете просто изменить ее здесь один раз .

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <spring.version>5.0.2.RELEASE</spring.version>
  <slf4j.version>1.6.6</slf4j.version>
  <log4j.version>1.2.12</log4j.version>
  <mysql.version>5.1.6</mysql.version>
  <mybatis.version>3.4.5</mybatis.version>
</properties>

Ниже приведены конкретные зависимости, которые использует версия${xxx.version}цитаты, такие как${spring.version}

<dependencies>
  <!-- spring -->
  <!-- aop相关的技术 -->
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.8</version>
  </dependency>

  <!-- aop -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- context容器 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- web -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- webmvc -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- spring测试 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- 事务 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- jdbc模板技术 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
  </dependency>

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

  <!-- mysql连接 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
  </dependency>

  <!-- servlet -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>

  <!-- jsp -->
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>

  <!-- EL JL TL表达式 -->
  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>

  <!-- log start -->
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
  </dependency>

  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
  </dependency>

  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
  </dependency>
  <!-- log end -->

  <!-- mybatis相关 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
  </dependency>

  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
  </dependency>

  <!-- druid 连接池 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
  </dependency>
</dependencies>

(4) Улучшить структуру каталогов

Используя описанный выше метод, структура каталогов только что созданного проекта является неполной и нуждается в дополнении.Создайте две папки, java и resources, в основной папке, затем щелкните их правой кнопкой мыши, найдите Отметить каталог как и выберите Sources Root и корень ресурсов

Конечно можно и дальше создавать базовую структуру пакета под папкой java.Конечно это сейчас не обязательно.Можно поставить потом.Схему структуры я скину в своей статье ниже.

(5) Создайте несколько базовых классов и методов (как хотите)

После создания структуры пакета и для следующей демонстрации создайте классы сущностей на основе баз данных и таблиц, которые мы создали в начале, а затем дайте несколько основных методов в разделе Сервис и Дао.

Класс объекта учетной записи

Создание объектов из полей в базе данных

package cn.ideal.domain;

import java.io.Serializable;

public class Account implements Serializable {
    private Integer id;
    private String name;
    private Double balance;

    ......省略 get set 以及 toString 方法 自行补充即可
}

AccountService и AccountServiceImpl

public interface AccountService {

   /**
    * \查询所有
    * @return
    */
   List<Account> findAll();

   /**
    * 添加账户
    * @param account
    */
   void addAccount(Account account);
}

На данный момент дается только определение и простая реализация метода, для реализации добавляется оператор вывода, и тест может быть более интуитивным.

public class AccountServiceImpl implements AccountService {

    public List<Account> findAll() {
        System.out.println("这是业务层——查询所有账户方法");
        return null;
    }

    public void addAccount(Account account) {
        System.out.println("这是业务层——添加账户方法");     
    }
}

AccountDao

Примечание. Здесь Dao не нужно реализовывать классы, сегодня мы собираемся использовать технологию Mybatis для уровня сохраняемости.

public interface AccountDao {
    /**
     * \查询所有
     * @return
     */
    public List<Account> findAll();

    /**
     * 添加账户
     * @param account
     */
    public void addAccount(Account account);
}

AccountController

public class AccountController {
}

На этом этапе базовая среда и структура настроены.Теперь мы можем приступить к написанию кода наших трех фреймворков.Мы выбираем способ: писать один за другим, правильно его тестировать, а затем интегрировать.

(2) Написание кода Spring Framework

Во-первых, давайте создадим основы, связанные со Spring.

(1) Создайте файл конфигурации

Сначала создайте файл конфигурации applicationContext.xml.

Введите некоторые ограничения конфигурации XML и других ссылок на заголовки.Чтобы одновременно использовать IOC и включить сканирование аннотаций, мы передаем Service и Dao в Spring для управления, но нам нужно использовать Spring MVC для управления контроллером, поэтому нам нужно настроить сканирование для пропуска контроллера

<?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: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.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">

    <!-- 开启注解扫描,处理service和dao,但是不需要处理 controller -->
    <context:component-scan base-package="cn.ideal">
        <!-- 配置哪些注解不扫描 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

</beans>

(2) Добавить аннотации

Добавьте аннотации бизнес-уровня в ServiceImpl.

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    public List<Account> findAll() {
        System.out.println("这是业务层——查询所有账户方法");
        return null;
    }
    
    public void addAccount(Account account) {
    	System.out.println("这是业务层——添加账户方法");
    }
}

(3) Тест

Испытательная пружина

Это все еще простая тестовая программа, написанная под старым пакетом тестирования процессов.Здесь используется непосредственно Junit.Конечно, его также можно комбинировать с модульным тестированием Spring для упрощения.Это также упоминается в моей предыдущей статье в Spring.

public class TestSpring {
    @Test
    public void testFindAll(){
        //加载配置
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        AccountService as = (AccountService) ac.getBean("accountService");
        as.findAll();
    }
}

Если вы можете распечатать слова, это означает, что базовая конфигурация Spring выполнена успешно.

(3) Написание кода фреймворка Spring MVC

(1) Настройка Web.xml

A: Настройте передний контроллер

Сначала измените webapp --> web.xml в файле WEB-INF.

существует<web-app></web-app>Общий смысл настройки заключается в том, чтобы при старте сервера загрузить front-end контроллер, а затем загрузить конфигурационный файл springmvc.xml (еще нет, он будет создан ниже), и установить, чтобы все запросы проходили здесь

<!--配置前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载springmvc.xml配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--启动服务器,创建该servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Б: настроить фильтры

Это ни о чем не говорит, просто для того, чтобы решить проблему искажения китайских иероглифов единообразно.

<!--配置过滤器,解决中文乱码-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Вот небольшая подсказка, если после написания,<web-app></web-app>Метка сообщается как красная, но это не влияет на использование. Проблема заключается в порядке настройки. Порядок может быть размещен в соответствии со следующими требованиями. Например, фильтр должен быть размещен перед интерфейсом контроллер.

"(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)"

##(2) Создайте файл springmvc.xml

Spring MVC здесь считается основной конфигурацией, а открытое сканирование, аннотации, а также аналитические виды, а также для предотвращения фильтрации CSS js и других статических файлов (газета Red означает, что вы не создали эти папки, запись просто отлично ), Конечно, некоторые (такие как не фильтрующие статические ресурсы) могут проверить, когда у вас есть меньше, но в сочетании с хорошей идеей об этом сохранить наши неприятности

Примечание: Путь парсера представления нужно прописать согласно его собственному, например, я создал папку под названием Pages в WEB-INF./WEB-INF/pages/

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

    <!--开启只对controller的扫描-->
    <context:component-scan base-package="cn.ideal">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置视图解析器-->
    <bean id="org" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--JSP 目录-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!--文件后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--不过滤静态资源-->
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/images/**" location="/images/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>

    <!--开启注解支持-->
    <mvc:annotation-driven/>
</beans>

(3) Выполните тест

A: Создайте контрольный слой

Дайте базовый метод тестирования, распечатайте оператор и перейдите на страницу list_account через анализатор представления.

@Controller
@RequestMapping("/account")
public class AccountController {

    @RequestMapping("/findAll")
    public String findAll(){
        System.out.println("这是控制层——查询所有账户的方法");
        return "list_account";
    }
}

B: Написать страницу

① Создайте страницу index.jsp в папке webapp.

Примечание. По умолчанию используется index.jsp, но он неполный. Лучше удалить стандартный JSP, иначе возникнут некоторые проблемы, такие как искажение.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
<h2>主页</h2>
<a href="account/findAll">查询所有</a>
</body>
</html>

② Создайте папку с именем страницы под webapp -> web-inf, а затем создать list_account.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>查询所有</title>
</head>
<body>
<h3>恭喜跳转成功,这是查询所有账户页面</h3>
</body>
</html>

при доступе в браузереhttp://localhost:8080/ssm(ssm настроен для развертывания tomcat) Когда вы можете перейти по ссылке, это означает, что среда Spring MVC в основном успешно построена

(4) Spring интегрирует Spring MVC

Из текущего теста можно получить доступ и вызвать службу через Spring, а конфигурация, связанная с контроллером, также была выполнена через Spring MVC, В этой части интегрированы две существующие части, то есть используется контроллер для доступа и вызова службы в методе service.

(1) Настройте прослушиватель и путь к файлу

Начиная с кода MVC Spring, мы знаем, что когда начнется сервер, вернитесь, чтобы загрузить SpringMvc.xml эту конфигурацию. Теперь нам нужно продолжать настроить его в Web.xml, чтобы при запуске проекта загрузите ApplicationContext. XML профиль

Таким образом, мы можем в Web.xml, чтобы настроить слушателей ядра пружины, он будет по умолчанию файл конфигурации AS /Web-inf/applicationContext.xml

<!--配置 Spring 的监听器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!--设置配置文件路径-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

Примечание: Если метка веб-приложения красного цвета, вам все равно нужно обратить внимание на порядок, как сказано выше.

(2) Уровень управления вызывает метод бизнес-уровня

@Controller
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @RequestMapping("/findAll")
    public String findAll(Model model){
        System.out.println("控制层:查询所有账户");
        accountService.findAll();
        return "list_account";
    }
}

Если доступ выполнен успешно, переход может быть выполнен успешно, и консоль выводит два предложения, одно выражение вывода с уровня управления и одно выражение вывода с бизнес-уровня, даже если эти две части успешно интегрированы.

(5) Написание кода фреймворка MyBatis

##(1) Создайте SqlMapConfig.xml

Создайте конфигурационный файл SqlMapConfig.xml, который является основным конфигурационным файлом MyBatis (конечно, он не нужен после интеграции)

Это все основные, и они ничем не отличаются от оригинала.То, что мы выбираем здесь, это конфигурация sql аннотаций.Конечно, вы также можете выбрать xml для настройки sql

<?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>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="root99"/>
            </dataSource>
        </environment>
    </environments>

    <!--使用注解-->
    <mappers>
        <package name="cn.ideal"/>
    </mappers>
</configuration>

(2) Написание кода слоя Дао

Здесь настраивается sql через аннотации, потому что демонстрация относительно проста.Помимо того, чтобы все опрашивать, здесь добавлен дополнительный метод.Читать и писать самому вполне можно.Можно написать любой функциональный тест.

@Repository
public interface AccountDao {

    /**
     * \查询所有
     * @return
     */
    @Select("SELECT * FROM account")
    public List<Account> findAll();

    /**
     * 添加账户
     * @param account
     */
    @Select("INSERT INTO account (name,balance) VALUES (#{name},#{balance})")
    public void addAccount(Account account);
}

(3) Протестируйте MyBatis

public class TestMybatis {

    private InputStream inputStream;
    private SqlSession sqlSession;
    private AccountDao accountDao;

    /*
        单独测试Mybatis时所用,整合后 SqlMapConfig.xml文件就不再使用了
        配置到 applicationContext.xml
     */

    @Before
    public void init() throws Exception{
        //加载配置文件
        inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 创建 SqlSessionFactory 对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //创建 SqlSession 对象
        sqlSession = factory.openSession();
        accountDao = sqlSession.getMapper(AccountDao.class);
    }

    @After
    public void destroy() throws Exception {
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }


    @Test
    public void TestFindAll(){
        List<Account> accounts = accountDao.findAll();
        for (Account account : accounts){
            System.out.println("----------------------");
            System.out.println(account);
        }
    }

    @Test
    public void TestAddAccount(){
        Account account = new Account();
        account.setName("测试");
        account.setBalance(800d);

        accountDao.addAccount(account);


    }
}

(6) Spring интегрирует MyBatis

(1) Изменить ApplicationCONTEXT.XML

Этот шаг состоит в том, чтобы настроить содержимое в файле конфигурации SQLMAPCONFIG.XML к файлу конфигурации ApplicationContext.xml, MyBatis больше не зависит от независимой и интегрирован в весну

Одно отличие в том, что мы создали папку config под папкой ресурсов, а затем создали файл druid.properties, то есть в свойства настроили БД типа логин и пароль, а в последующем обслуживание удобнее, конечно, использовать Перед вам нужно начать сканирование файла свойств следующим образом

<!--扫描Resources中的相关properties文件-->
<context:property-placeholder location="classpath:config/*.properties" ignore-unresolvable="true"/>

<!--Spring 整合 MyBatis-->
<!--配置数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <!-- 数据库基本信息配置 -->
    <property name="url" value="${druid.jdbc.url}" />
    <property name="username" value="${druid.jdbc.username}" />
    <property name="password" value="${druid.jdbc.password}" />
    <property name="driverClassName" value="${druid.jdbc.driver}" />
</bean>

<!--配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--配置AccountDao接口所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.ideal.dao"/>
</bean>

druid.properties

druid.jdbc.url=jdbc:mysql://localhost:3306/ssm
druid.jdbc.driver=com.mysql.jdbc.Driver
druid.jdbc.username=root
druid.jdbc.password=root99

(2) Выполните тест

① Перед испытанием

Нужно подтвердить, была ли добавлена ​​аннотация @Repository в AccountDao, я добавлял ее раньше, если нет, добавьте сейчас

② Затем внедрить Дао в Сервис

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public List<Account> findAll() {
        System.out.println("这是业务层——查询所有账户方法");
        return accountDao.findAll();
    }

    public void addAccount(Account account) {

        System.out.println("这是业务层——添加账户方法");
        accountDao.addAccount(account);
    }
}

③ Тест уровня управления

На уровне управления, бизнес-уровне для вызова, а затем выполнить Dao в sql, вы должны найти это хлопотным, это всего лишь тестовый запрос и для всех

Запросите все, добавьте параметр модели, а затем напишите запрошенный список.

@Controller
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @RequestMapping("/findAll")
    public String findAll(Model model){
        System.out.println("这是控制层——查询所有账户的方法");
        List<Account> list = accountService.findAll();
        model.addAttribute("accounts",list);
        return "list_account";
    }

    @RequestMapping("/add")
    public void add(Account account, HttpServletRequest request, HttpServletResponse response) throws IOException {
        accountService.addAccount(account);
        response.sendRedirect(request.getContextPath()+"/account/findAll");
        return;
    }
}

④ Написание страницы

Для того, чтобы протестировать метод добавления, добавьте форму для ввода информации

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>主页</h2>
<a href="account/findAll">查询所有</a>
    
<form action="account/add" method="post">
    姓名:<input type="text" name="name" /><br/>
    余额:<input type="text" name="balance" /><br/>
    <input type="submit" value="添加"/><br/>
</form>
</body>
</html>

list_account.jsp

Просто напишите обход здесь, чтобы узнать информацию об имени в базе данных

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>查询所有账户</h3>

<c:forEach items="${accounts}" var="account">
    ${account.name}
</c:forEach>

</body>
</html>

(3) Добавить управление транзакциями

Добавьте дела в конфигурацию, связанную с applicationContext.xm, в этих статьях до того, как Spring AOP был подробно объяснен, транзакция даст управлению Spring

<!--配置Spring框架声明式事务管理-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="*" isolation="DEFAULT"/>
    </tx:attributes>
</tx:advice>

<!--配置AOP增强-->
<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.ideal.service.impl.*ServiceImpl.*(..))"/>
</aop:config>

Напоследок всем прикрепил структурную схему, если нуждающийся друг может сослаться на Казахстан

(7) Резюме

На этом интеграция трех фреймворков Mybatis, Spring и Spring MVC завершена.Пока вы понимаете и изучаете использование и настройку этих трех фреймворков, их интеграция практически не представляет технических трудностей.Когда мы получаем вместе это может показаться немного сложным и запутанным. Просто больше практикуйтесь. Это может помочь всем. Это не очень сложно, и исходный код не был загружен. Если вам нужны друзья, вы можете оставить сообщение ниже, и я загрузить его позже.

Спасибо за поддержку! ! ! Спасибо вам всем! ! !

(8) Конец

Если в статье есть какие-либо недостатки, пожалуйста, оставьте сообщение для обмена, спасибо за вашу поддержку!

Если это может вам помочь, то следуйте за мной! Если вы предпочитаете читать статьи WeChat, вы можете подписаться на мой публичный аккаунт.

Мы здесь незнакомцы, но мы все усердно работаем для своей мечты ❤

Публичный аккаунт, настаивающий на размещении оригинальных технических статей о разработке: в идеале — более двух дней.