成为技术大神我爱编程Springboot

SpringBoot+Mybatis+Thymeleaf一个完整

2018-05-28  本文已影响665人  迷糊银儿

今天实现了一个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才会按类型装配。

上一篇下一篇

猜你喜欢

热点阅读