1. MVC关键点在于Controller

1.1 Controller通过返回两种类型的数据完成用户端请求的回复:一种是模型(视图),另一种是JSON数据。

1.2 Controller类采用@Controller标签,可以加上RequestMapping,用于适配器解析;

1.3Controller类中用于处理客户请求的方法必须带有@RequestMapping标签,提供前后端参数名称的映射关系(即HTTP参数与方法参数的映射关系);

   每个方法的输入参数需要带有@RequestParam标签,如:@RequestParam(value = "userName", required = false) String userName

   下面是一个完整的方法:

@RequestMapping("/list")
@ResponseBody
public List<User> list( @RequestParam(value = "userName",
required = false) String userName,  @RequestParam(value =
"note", required = false) String note) {
// 访问模型层得到数据
List<User> userList = userService.findUsers(userName, note);
return userList;
}

一种情况可以不带@RequestParam标签,即当输入参数与HTTP本来就一致时。

2. 生成服务

   Controller中可能会有一个或多个服务,如果要采用MyBatis,需要进行封装,即:

  (1)生成一个带有服务所有操作的接口,接口参数需要带有@Mapper标签,建立与mapper.xml中的SQL变量名的映射关系

@Mapper
public interface UserDao {

User getUser(Long id);

List<User> findUsers(@Param("userName") String
userName, @Param("note") String note);
}

  (2)通过XML文件建立方法与SQL的映射关系

<?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.springboot.chapter9.dao.UserDao">

<select id="findUsers"
resultType="user">
select id, user_name as userName, note from t_user
<where>
<if test="userName != null"> and user_name like concat('%',
#{userName}, '%')</if>
<if test="note != null"> and note like concat('%', #{note},
'%')</if>
</where>
</select>
</mapper>

这里id="findUsers",指出了控制器中的函数名,resultType="user"指出了返回的值类型,输入的值类型这里省略了(可省略吗?)

这里的#{userName}对应了@Param("userName"),#{note}对应了@Param("note") ,SQL语句中的user_name as userName将数据库列项与输入参数相关联,保证将来数据读取的正确性。

这里还有一个疑问:findUsers返回的值是List<User>,但在XML文件中对应的返回会师却是:resultType="user"。这里的userUser类的别名,由类前面加@Alias标签确定。

(3)建立一个接口用于定义服务,其内部函数应当与前面的@Mapper接口完全一致,但不再需要@Param标签;

(4)建立一个服务类实现前面的服务接口,必须加入@Service标签,如果是事务的话,

需要加入@Transactional标签。类中要声明一个@Mapper定义的接口类型成员,并用@Autowired标识为自动生成,然后实现其中的方法,方法中调用@Mapper接口的函数:

@Service
@Transactional
public class UserServiceImpl implements UserService {

@Autowired
private UserDao userDao = null;

@Override
public User getUser(Long id) {
return userDao.getUser(id);
}

@Override
public List<User> findUsers(String userName, String note) {
return userDao.findUsers(userName, note);
}
}

3.完成扫描和配置(bean和mapper)

@SpringBootApplication(scanBasePackages =
"com.springboot.chapter9")
@MapperScan(basePackages="com.springboot.chapter9", annotationClass =
Mapper.class)
public class Chapter9Application {
// @Autowired
// SqlSessionFactory sqlSessionFactory = null;
//
// @Bean
// public MapperFactoryBean<UserDao> initMyBatisUserDao() {
// MapperFactoryBean<UserDao> bean = new MapperFactoryBean<>();
// bean.setMapperInterface(UserDao.class);
// bean.setSqlSessionFactory(sqlSessionFactory);
// return bean;
// }
public static void main(String[] args) {
SpringApplication.run(Chapter9Application.class, args);
}
}

在程序主类中加入bean和mapper的扫描范围,这里不再需要加入SqlSessionFactory这一类的操作,添加了mybatis依赖后,spring boot会自动创建事务管理器、Mybatis的sqlSessionFactory和SqlsessionTemplate等模块。

4. 添加相关的依赖项和配置

<?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>springboot</groupId>
<artifactId>chapter9</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>chapter9</name>
<description>chapter9 project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--配置对mybatis的依赖项,这两个必须有,少一个就不能通过 -->

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

(1)原例中使用了:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

删除后没有问题,所以去掉。

(2)生成后运行时,在页面中出现了 <%@ page pageEncoding="UTF-8"%> <%@
taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>,这是JSP文件的上方的两行与JSTS相关的,不知为什么没能解析

(3)运行还是出错,后将mysql-connector-java依赖版本改为8.0.11,数据库操作正确,但仍找不到jsp资源;

(4)由于运行中使用了easyui的前端框架,开始时无法显示结果,但发现不是服务的原因,而是对jsp资源的解析问题。通过查资料,加入thymeleaf依赖;在application.properties文档中加入:

spring.thymeleaf.prefix=classpath:/WEB-INF/jsp/
spring.thymeleaf.suffix=.jsp
spring.thymeleaf.mode=LEGACYHTML5
#spring.thymeleaf.encoding=UTF-8
#spring.thymeleaf.content-type=text/html # ;charset=<encoding> is added

spring.thymeleaf.cache=false

   结果正确,但起始没有数据,然后在相应的jsp中加入了

<script type="text/javascript">
// 定义事件方法
$(document).ready(function() {
// 指定请求路径
var opts = $("#dg").datagrid("options");
opts.url = "./list";
// 获取查询参数
var userName = "user_name";
var note = "note";
// 组织参数
var params = {};
if (userName != null && userName.trim() != '') {
params.userName = userName;
}
if (note != null && note.trim() != '') {
params.note = note;
}
// 重新载入表格数据
$("#dg").datagrid('load', params);
});
</script>

数据显示出来。

(5)其他配置

(5.1)数据库配置

spring.datasource.url=jdbc:mysql://localhost:3306/user
spring.datasource.username=root
spring.datasource.password=123456

#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.tomcat.max-idle=10
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.initial-size=5

  (5.2)Mybatis配置

    #mapper.xml所在目录

     mybatis.mapper-locations=classpath:com/springboot/chapter9/mapper/*.xml

    #POJO类包名

mybatis.type-aliases-package=com.springboot.chapter9.pojo

(5.3)由于有了thymeleaf的配置,下面的配置不再有效:

#有了thymeleaf设置,这里将不再需要
#spring.mvc.view.prefix=/WEB-INF/jsp/
#spring.mvc.view.suffix=.jsp

5. 需要深入了解的问题:

  6.1 easyui是一个基于JQuery创建的客户端框架,它的用法还需要了解。其界面比较好,所以可以学一下;

  6.2 thymeleaf是一个用于解析jsp的框架,现在一无所知,需要了解

STS MVC与MyBatis的结合的更多相关文章

  1. spring MVC、mybatis配置读写分离

    spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ...

  2. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...

  3. 搭建Spring、Spring MVC、Mybatis和Freemarker

    搭建Spring.Spring MVC.Mybatis和Freemarker 1.pom文件 <project xmlns="http://maven.apache.org/POM/4 ...

  4. Spring Mvc和Mybatis的多数据库访问配置过程

    Spring Mvc 加Mybatis的多数据库访问源配置访问过程如下: 在applicationContext.xml进行配置 <?xml version="1.0" en ...

  5. Spring、Spring MVC、MyBatis

    Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...

  6. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  7. IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

    项目创建 本项目使用的是IDEA 2016创建. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId, ...

  8. SSM 即所谓的 Spring MVC + Spring + MyBatis 整合开发。

    SSM 即所谓的 Spring MVC + Spring + MyBatis 整合开发.是目前企业开发比较流行的架构.代替了之前的SSH(Struts + Spring + Hibernate) 计划 ...

  9. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

随机推荐

  1. Java中的数据结构通俗易懂的介绍

    Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. List(接口)List是有 ...

  2. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp(思维)

    链接: https://codeforces.com/contest/1230/problem/D 题意: Marcin is a coach in his university. There are ...

  3. am335x system upgarde ddr3 capacity configuration base on TI DDR3 Software Leveling Tool (二十)

    follow test is  use ti DDR Software Leveling op log. AM335x DDR3 Software Leveling -- Version: Beta ...

  4. [Vue] : vue-resource 实现 get, post, jsonp请求

    vue-resource 实现 get, post, jsonp请求 常见的数据请求类型:get,post,jsonp 除了vue-resource之外,还可以使用axios的第三方包实现实现数据的请 ...

  5. 使用Flask搭建基于unittest的简单用例挑选及执行平台

    在用例组织上,unittest的Test Suite的拥有非常好的灵活性,然而Test Suite一般要提前编制好,添加和组织用例必须使用代码,不方便使用. 本文使用 Flask + unittest ...

  6. 【java设计模式】-04单例模式

    单例模式 定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型: 创建类模式 类图: 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单 ...

  7. How to do Deep Learning on Graphs with Graph Convolutional Networks

    翻译: How to do Deep Learning on Graphs with Graph Convolutional Networks 什么是图卷积网络 图卷积网络是一个在图上进行操作的神经网 ...

  8. 21.栈的压入、弹出序列 Java

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  9. IDEA个人常用配置记录

    原文 一.常用快捷键 编辑 ⇧ + ↩:开始新的一行 ⌘ + ⇧ + ↩:行内任意位置进行换行,并自动补齐“;”.“{}” ⌘ + ⇧ + U:大小写切换 ⌥ + ⌦:删除到单词的末尾(⌦键为Fn+D ...

  10. Qt 互斥量 QMutex

    QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...