Статьи

Создание веб-приложения на Java с использованием MyBatis с помощью Spring

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

1. Создание проекта веб-приложения Java с использованием шаблона Maven

Для начала в IDE создайте проект Java Maven с шаблоном maven-archetype-webapp (отфильтруйте каталог на основе строки «webapp»), указав соответствующие значения для GroupId и Artifact Id для проекта. Пример структуры каталогов веб-приложения показан ниже со стандартным дескриптором развертывания web.xml и Maven pom.xml.

mybatislayout

2. Обновите pom.xml

Чтобы вышеуказанный проект Maven Java Web Application поддерживал инфраструктуру MyBatis, добавьте следующие зависимости в существующий файл pom.xml:

  • mybatis (для поддержки MyBatis)
  • mybatis-spring (для поддержки интеграции MyBatis-Spring)
  • jstl, spring-webmvc, servlet-api и spring-context-support (для поддержки Spring)
  • Spring-Test (может быть необязательным, если требуется поддержка Spring-Test)
  • mysql-connector-java (для поддержки MYSQL)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>3.1.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>3.1.1.RELEASE</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.21</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>3.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>

3. Изменить web.xml

Измените содержимое файла web.xml, включив в него следующее:

  • Сервлет и указать расположение файла конфигурации для того же. В этом примере файл конфигурации с именем springConfig.xml создается в папке WEB-INF / config в макете проекта.
  • Отображение сервлета для сопоставления сервлета, созданного на предыдущем шаге, который должен вызываться, когда клиент указывает URL-адрес, соответствующий шаблону URL-адреса.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 
<servlet>
  <servlet-name>myBatisServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/springConfig.xml</param-value>
  </init-param>
</servlet>
 
<servlet-mapping>
  <servlet-name>myBatisServlet</servlet-name>
  <url-pattern>*.html</url-pattern>
</servlet-mapping>
 
  <display-name>Archetype Created Web Application</display-name>
</web-app>

4. Создайте файл конфигурации Spring

Создайте файл конфигурации Spring Bean в папке WEB-INF / config. Если STS (Spring Tool Suite) является IDE, включите пространство имен context, mvc и tx. SpringConfig.xml будет таким, как показано ниже

После включения необходимых пространств имен добавьте следующее (между тегами <beans> и </ beans>), чтобы указать, что приложение управляется аннотациями и является базовым пакетом для сканирования компонента контекста.

1
2
3
<mvc:annotation-driven />
 
<context:component-scan base-package="com.github.elizabetht" />

Включите bean-компонент InternalResourceViewResolver для Spring, чтобы найти файлы jsp

1
2
3
4
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>

Включите bean-компонент для источника данных, где можно указать свойства базы данных MYSQL, такие как url, имя пользователя и пароль. Замените <include connection url> фактическим URL-адресом соединения для подключения к базе данных MYSQL. Аналогичным образом замените <include username> и <include password> действительными значениями имени пользователя и пароля.

1
2
3
4
5
6
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql//<include connection url>:3306/studentEnrollment?autoReconnect=true&createDatabaseIfNotExist=true&" />
  <property name="username" value="<include username>" />
  <property name="password" value="<include password>" />
</bean>

Включите компонент для диспетчера транзакций для определения объема / управления транзакциями, который принимает источник данных, определенный выше, как справочный (зависимый)

1
2
3
4
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>

Переходя к конкретным конфигурациям MyBatis, включите компонент для sqlSessionFactory, который является центральной конфигурацией в приложении MyBatis. Этот bean-компонент принимает три свойства — dataSource (уже настроенный выше) — typeAliasesPackage (расположение, в котором находятся классы модели этого приложения) — mapperLocations (расположение, в котором находятся XML-файлы mapper для модели — здесь это не нужно, поскольку конфигурации на основе аннотаций используется вместо)

Более подробную информацию об этом можно прочитать на http://mybatis.github.io/mybatis-3/

1
2
3
4
5
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="typeAliasesPackage" value="com.github.elizabetht.model"/>
  <property name="mapperLocations" value="classpath*:com/github/elizabetht/mappers/*.xml" />
</bean>

Включить бин для sqlSession

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

Затем, наконец, включите компонент для MapperScannerConfigurer

1
2
3
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.github.elizabetht.mappers" />
</bean>

5. Создайте файлы JSP для регистрации / входа ученика

Создайте папку с именем «jsp» в WEB-INF (именно здесь будут созданы файлы jsp, как указано в springConfig.xml для bean-компонента InternalResourceViewResolver).

Зарегистрироваться

Создайте файл signup.jsp, чтобы включить форму для получения данных ввода, таких как Имя пользователя, Пароль, Имя, Фамилия, ДатаOfBirth и Адрес электронной почты студента. Снимок страницы регистрации выглядит следующим образом:

Затем создайте файл login.jsp для включения формы с именами пользователей и паролями. Снимок страницы входа в систему выглядит следующим образом:

авторизоваться

Также создайте success.jsp, чтобы указать успешный вход в систему, и fail.jsp, чтобы указать сбой входа в систему (это просто страницы, используемые для отображения содержимого — логика обработки не используется).

Это приложение использует Twitter начальной загрузки http://getbootstrap.com/ и http://bootswatch.com/united/ в качестве таблиц стилей. Он также использует таблицу стилей DatePicker, чтобы открыть календарь для поля DateOfBirth на странице регистрации ученика ( http://www.eyecon.ro/bootstrap-datepicker/ ).

Ссылочную ссылку на файлы в папке webapp этого приложения можно найти по адресу https://github.com/elizabetht/StudentEnrollmentWithMyBatis/tree/master/src/main/webapp.

6. Создайте пакеты для контроллера, модели, сервиса и картографов

Создайте пакеты для классов Spring Controller, Model и Service в папке src / main / java. Также создайте пакет для класса MyBatis Mapper в той же папке src / main / java.

Пример снимка проекта после создания пакета показан ниже:

mybatis-пакет

7. Создайте классы для уровня модели

Создайте класс POJO с именем Student.java внутри пакета com.github.elizabetht.model, чтобы включить детали сущности модели Student во время регистрации. Создайте еще один класс POJO с именем StudentLogin.java внутри того же пакета com.github.elizabetht.model, чтобы включить данные для входа в систему.

Ссылочную ссылку на файлы для классов модели можно найти по адресу https://github.com/elizabetht/StudentEnrollmentWithMyBatis/tree/master/src/main/java/com/github/elizabetht/model.

8. Создайте классы для MyBatis Mapper

Mapper в инфраструктуре MyBatis аналогичен уровню репозитория в среде Spring. Грубые SQL-запросы занимают здесь свое место. Создайте интерфейсный класс с именем StudentMapper.java внутри пакета com.github.elizabetht.mapper для поддержки операций базы данных.

Для целей приложения необходимы два метода интерфейса.

  • Чтобы вставить данные регистрации ученика в базу данных
  • Чтобы проверить регистрационные данные студента из базы данных
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public interface StudentMapper {
  @Insert("INSERT INTO student(userName, password, firstName,"
          + "lastName, dateOfBirth, emailAddress) VALUES"
          + "(#{userName},#{password}, #{firstName}, #{lastName},"
          + "#{dateOfBirth}, #{emailAddress})")
  @Options(useGeneratedKeys=true, keyProperty="id", flushCache=true, keyColumn="id")
  public void insertStudent(Student student);
 
  @Select("SELECT USERNAME as userName, PASSWORD as password, "
          + "FIRSTNAME as firstName, LASTNAME as lastName, "
          + "DATEOFBIRTH as dateOfBirth, EMAILADDRESS as emailAddress "
          + "FROM student WHERE userName = #{userName}")
  public Student getStudentByUserName(String userName);
 
}

9. Создайте классы для уровня обслуживания

Создайте интерфейсный класс с именем StudentService.java внутри пакета com.github.elizabetht.service для поддержки операций уровня обслуживания.

1
2
3
4
5
public interface StudentService {
  void insertStudent(Student student);
  boolean getStudentByLogin(String userName, String password);
  boolean getStudentByUserName(String userName);
}

Создайте класс реализации уровня сервиса (действительно POJO) с именем StudentServiceImpl.java внутри пакета com.github.elizabetht.service. Именно в этом заключается логика приложения — либо для сохранения сведений об ученике в базе данных, либо для проверки (уже сохраненных) сведений об ученике из базы данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Service("studentService")
public class StudentServiceImpl implements StudentService {
 
  @Autowired
  private StudentMapper studentMapper;
 
  @Transactional
  public void insertStudent(Student student) {       
      studentMapper.insertStudent(student);
  }
 
  public boolean getStudentByLogin(String userName, String password) {       
      Student student = studentMapper.getStudentByUserName(userName);
 
      if(student != null && student.getPassword().equals(password)) {
          return true;
      }
 
      return false;
  }
 
  public boolean getStudentByUserName(String userName) {
      Student student = studentMapper.getStudentByUserName(userName);
 
      if(student != null) {
          return true;
      }
 
      return false;
  }
 
}

При использовании MyBatis с Spring, картограф может быть непосредственно введен в уровень сервиса. Это, наверное, самая сильная сторона весенней интеграции MyBatis. Это единственный известный мне инструмент, который позволяет создавать приложение без импорта в него.

@EduardoMacarron twitter.com/EduardoMacarron/…

10. Создайте класс для уровня контроллера

Создайте класс POJO уровня контроллера с именем StudentController.java внутри пакета com.github.elizabetht.controller. Именно здесь идет логика маршрутизации приложения — вызывается ли действие регистрации или входа в систему.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Controller
@SessionAttributes("student")
public class StudentController {
 
  @Autowired
  private StudentService studentService;
 
  @RequestMapping(value="/signup", method=RequestMethod.GET)
  public String signup(Model model) {
      Student student = new Student();
      model.addAttribute("student", student);
      return "signup";
  }
 
  @RequestMapping(value="/signup", method=RequestMethod.POST)
  public String signup(@ModelAttribute("student") Student student, Model model) {
      if(studentService.getStudentByUserName(student.getUserName())) {
          model.addAttribute("message", "User Name exists. Try another user name");
          return "signup";
      } else {
          studentService.insertStudent(student);
          model.addAttribute("message", "Saved student details");
          return "redirect:login.html";
      }
  }
 
  @RequestMapping(value="/login", method=RequestMethod.GET)
  public String login(Model model) {
      StudentLogin studentLogin = new StudentLogin();
      model.addAttribute("studentLogin", studentLogin);
      return "login";
  }
 
  @RequestMapping(value="/login", method=RequestMethod.POST)
  public String login(@ModelAttribute("studentLogin") StudentLogin studentLogin) {
      boolean found = studentService.getStudentByLogin(studentLogin.getUserName(), studentLogin.getPassword());
      if (found) {               
          return "success";
      } else {               
          return "failure";
      }
  }
}

11. Создайте схему БД в базе данных MYSQL.

Подключитесь к базе данных MySQL, которая будет использоваться для этого приложения, и создайте новую схему базы данных с именем studentEnrollment с помощью MySQL Workbench. Это необходимо, поскольку имя схемы БД studentEnrollment указывается в bean-компоненте dataSource в springConfig.xml.

После создания схемы DB studentEnrollment создайте таблицу с именем student внутри схемы DB, используя инструкцию CREATE TABLE следующим образом:

01
02
03
04
05
06
07
08
09
10
CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `dateOfBirth` datetime NOT NULL,
  `emailAddress` varchar(255) NOT NULL,
  `firstName` varchar(255) NOT NULL,
  `lastName` varchar(255) NOT NULL,
  `password` varchar(8) NOT NULL,
  `userName` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1;

12. Развертывание приложения на сервере Tomcat

После выполнения вышеуказанных шагов и успешного создания проекта веб-приложение Java готово к развертыванию на сервере Tomcat 7.

Веб-приложение Java можно развернуть локально, щелкнув правой кнопкой мыши по проекту и выбрав опцию «Запуск от имени -> Запуск на сервере».

То же самое можно развернуть удаленно на любом собственном сервере, который поддерживает Tomcat, скопировав файл WAR (щелкните правой кнопкой мыши по проекту и выберите «Экспортировать как файл WAR») в папку / var / lib / tomcat7 (или соответствующий каталог tomcat) и перезапустите tomcat. сервер.

Это приложение доступно для демонстрации здесь: http://ec2-23-20-137-135.compute-1.amazonaws.com:8080/StudentEnrollmentWithMyBatis/

13. Клонировать или скачать код

Если вы используете git, клонируйте копию этого проекта здесь: https://github.com/elizabetht/StudentEnrollmentWithMyBatis.git

Если вы не используете git, загрузите проект в виде файла ZIP или tar.gz здесь: https://github.com/elizabetht/StudentEnrollmentWithMyBatis/releases/tag/1.7