SpringBoot+Mybatis+Thymeleaf一个完整demo

今天实现了一个SpringBoot+Mybatis+Thymeleaf 的小demo,虽然比较简单,但是作为一个新手我来说还是碰到了很多因为不专业而造成的稀奇古怪的问题,我尽量把遇到的问题陈述出来,希望大家能够明白和避免这种问题。这是存放代码的地址 https://gitee.com/neimenggudaxue/SPtest3

1.首先搭建SpringBoot+Mybatis+Thymeleaf 环境,参考(都是笔者亲自试验的结果):

https://www.jianshu.com/p/66ca10f213b5
https://www.jianshu.com/p/85824b992af2

项目目录结构图

2.本项目实现用户登录

1.提供一个页面,供用户输入用户名、密码

2.校验用户名、密码是否对应,如果密码正确,则返回字符串"登录成功",否则返回"登录失败"
登录页面
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>index page</title>
</head>
<body>

    <form action="" th:action="@{/loginResult}" method="post">
        用户名<input type="text" name="name">
        密码<input type="password" name="passwd">
        <input type="submit" value="确定">
    </form>
</body>
</html>

路由controller文件,注意:

1.注解@Controller @RestController 不可同时使用。这就导致了我只能返回一些restAPI或者json数据,实际上可以配合@ResponseBody,既可以返回"login"这种页面,也可以返回"登录成功"这种文案
2.使用了自动装入注解@AutoWired


@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
  2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
@Controller
public class LoginController {

    @Autowired
    ImpleLoginService impleLoginService;
    @Autowired
    User user;

    @RequestMapping("/login")
    public String  login(){
        return "login";
    }

    @RequestMapping("/loginResult")
    @ResponseBody
    public String home(HttpServletRequest request){
        String name=request.getParameter("name");
        String passwd=request.getParameter("passwd");
        user=impleLoginService.loginResult(name,passwd);
        if(passwd.equals(user.getPasswd()))
            return "登录成功";
        else
            return "登录失败";
    }
}

service层代码,设计为面向对象的接口与实现分离
--@Autowired 装载mapper
--@service 注解service层

@Service
public class ImpleLoginService implements InterLoginService {

    @Autowired
    UserMapper userMapper;
    public User loginResult(String name,String passwd){
        return userMapper.findByUsernameAndPassword(name,passwd);
    }
}

mapper层即Dao 层代码,
--该层类也是接口interface的形式,但是在其方法上使用了注解,编码人员便可以不用手动去实现其接口方法。
--最后一个方法是手动写的,非mybatis-generator实现的。注意该方法的参数传递形式,我在此便犯了错,我写的是:
User findByUsernameAndPassword( String name, String passwd) 报错了。
--使用注解@Repository

@Repository
public interface UserMapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    int insert(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    int insertSelective(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    User selectByPrimaryKey(Integer id);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user
     *
     * @mbg.generated Mon May 28 13:07:09 CST 2018
     */
    int updateByPrimaryKey(User record);

    @Select("select * from user where name=#{name}")
    User findByUsernameAndPassword(@Param("name") String name, @Param("passwd") String passwd);
}

启动类的编写
--我当时写的时候并未使用注解@MapperScan,报错找不到mapper文件;
通过使用@MapperScan可以指定要扫描的Mapper类的包的路径

@SpringBootApplication
@ComponentScan(basePackages ={"com.example.demo"})
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

   public static void main(String[] args) {
       SpringApplication.run(DemoApplication.class, args);
   }
}

实体类文件,记得使用注解,否则也报错

@Component
public class User {
  XXXXXXXX
}

通过本次实践,我深深的认识到自己对Spring的常用注解几乎一无所知,或者说只知皮毛,悲催。提供以下简洁的说明;

参考:https://www.cnblogs.com/xiaoxi/p/5935009.html
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

启动类上的注解
@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。例如,如果你有个类用@Controller注解标识了,那么,如果不加上@ComponentScan,自动扫描该controller,那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。
@MapperScan可以指定要扫描的Mapper类的包的路径
@Configuration 是最新的用注解配置spring,也就是说这是个配置文件,和原来xml配置是等效的,只不过现在用java代码进行配置了 加上一个@Configuration注解就行了,是不是很方便,不需要那么繁琐的xml配置了,这样基于注解的配置,可读性也大大增高了。

@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,707评论 2 22
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,796评论 6 342
  • 前言:由于在第一次面试中吃了暗亏,考到了SpringMVC的@RequestMapping和@ResponseBo...
    天谴残魂阅读 4,134评论 3 17
  • Python和很多其他语言一样,支持异常处理。我们可以使用try-catch类似的形式捕获异常,处理异常,或者抛出...
    乐百川阅读 601评论 0 1