Spring Boot快速入门之实现简单的登录注册功能

我们将以实现简单的登录注册功能来完成Spring Boot的快速入门(IDEA版)

1.在数据库建enjoy_user表

CREATE TABLE `enjoy_user` (
	`id`  int NOT NULL AUTO_INCREMENT ,
	`passwd`  varchar(255) NULL ,
	`username`  varchar(255) NULL ,
	PRIMARY KEY (`id`)
);

2.搭建SpringBoot环境

pom.xml

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>
	  <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>
    </properties>
	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

APP.java

@SpringBootApplication
public class App {
    
    
    public static void main(String[] args) throws Exception {
    
    
    	SpringApplication.run(App.class, args);
    }
}

3.新建Controller

package com.zyc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    
    

    @RequestMapping("/hello")
    public Object sayHello() {
    
    
        return "hello";
    }
}

运行App,在浏览器输入:localhost:8080/hello,发现“hello”说明第一步部署成功!

4.集成Mybatis

pom.xml

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

<dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
  </dependency>

5.通过逆向工程生成mapper

在resources目录,新建application.properties文件,增加内容如下:

application.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456789a

mybatis.mapperLocations=classpath:mapping/*.xml

注意配置时区,否则会报错(serverTimezone=GMT%2B8)

准备mybatis的生成文件generatorConfig.xml

generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
<!-- 
targetRuntime:MyBatis3Simple   只生产简单的增删改查
MyBatis3:还包括了支持高级查询(豪华版)
 -->
  <context id="DB2Tables" targetRuntime="MyBatis3">
  <!-- 序列化实体类 -->
   <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
  <!-- 自动生产toString  -->
   <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
   <!-- 自动生成 equals()   hashcode()   -->
    <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
  
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://127.0.0.1:3306/j5?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=GMT%2B8"
        userId="root"
        password="123456789a">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
    
    <!-- 1、根据表生成实体类: -->
    <javaModelGenerator targetPackage="com.zyc.model" targetProject="src/main/java">
        <!-- 不要创建子包 -->
      <property name="enableSubPackages" value="true" />
      <!-- 去空格 -->
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
   <!-- 2、根据表生成mapper映射: -->
    <sqlMapGenerator targetPackage="mapping"  targetProject="src/main/resources">
    <!-- 不要创建子包 -->
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
    <!-- 3、根据表生成mapper接口: -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.zyc.dao"  targetProject="src/main/java">
     <!-- 不要创建子包 -->
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table  tableName="enjoy_user"  domainObjectName="Users"  />
     <!--  <generatedKey column="ID" sqlStatement="mysql" identity="true" /> -->
  </context>
</generatorConfiguration>

创建GeneratorTest

扫描二维码关注公众号,回复: 12435629 查看本文章
package com.zyc;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

public class GeneratorTest {
    
    
    @Test
    public void testMBG() throws Exception{
    
    
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
    
}

执行测试方法,生成model,dao,mapping文件夹
结构图如下:
在这里插入图片描述

注意:记得在App启动类上增加@MapperScan扫描注解!

@SpringBootApplication
@MapperScan("com.zyc.dao")
public class App {
    
    
    public static void main(String[] args) throws Exception {
    
    
        SpringApplication.run(App.class, args);
    }
}

6. 新增mapper登陆方法

com.zyc.dao.UsersMapper

Users findByUsernameAndPasswd(@Param("username") String username, @Param("passwd") String passwd);

对应的XML配置:
UsersMapper.xml

<select id="findByUsernameAndPasswd" resultType="cn.enjoy.model.Users" parameterType="map">
    select
    <include refid="Base_Column_List" />
    from enjoy_user where 1=1
    <if test="passwd != null" >
      and passwd = #{passwd,jdbcType=VARCHAR}
    </if>
    <if test="username != null" >
      and username = #{username,jdbcType=VARCHAR}
</if>
limit 1
  </select>

7.编写Spring Boot单元测试

要测试刚才新增的Mapper方法是否成功,这里需要单元测试,在springboot中是有专门的组件来做单元测试的,在pom文件中新增依赖

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

新建UserTest放置在test目录下
UserTest

package com.zyc.test;
import cn.zyc.App;

import cn.zyc.dao.UsersMapper;
import cn.zyc.model.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;


@SpringBootTest(classes = {
    
    App.class})
@RunWith(SpringRunner.class)
public class UserTest {
    
    

    @Resource
    private UsersMapper usersMapper;

    @Test
    public void testAdd() {
    
    
        Users user = new Users() ;
        user.setPasswd("123");
        user.setUsername("enjoy");
        usersMapper.insertSelective(user);
    }

    @Test
    public void testFindUser() {
    
    
        Users enjoy = usersMapper.findByUsernameAndPasswd("enjoy", "123");
        System.out.println(enjoy);
    }

}

这样SpringBoot集成单元测试成功!!!

8. 新建service

新建接口IUserService

public interface IUserService {
    
    
     boolean login(String username,String passwd);//登录的方法
     boolean register(String username,String passwd);//注册的方法
}

创建实现类UserServiceImpl

package cn.zyc.service.impl;
import cn.zyc.dao.UsersMapper;
import cn.zyc.model.Users;
import cn.zyc.service.IUserService;
import javax.annotation.Resource;
@Service
public class UserServiceImpl implements IUserService {
    
    

    @Resource
    private UsersMapper usersMapper;

    @Override
    public boolean login(String username, String passwd) {
    
    
        Users users = usersMapper.findByUsernameAndPasswd(username, passwd);
        return users != null;
    }

    @Override
    public boolean register(String username, String passwd) {
    
    
        Users users = new Users();
        users.setUsername(username);
        users.setPasswd(passwd);
        int cnt = usersMapper.insertSelective(users);
        return cnt > 0;
    }
}

9. 修改controller

修改UserController,增加login和register方法

package com.zyc.controller;

import com.zyc.service.IUserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class UserController {
    
    

    @Resource
    private IUserService iUserService;


    @RequestMapping("/hello")
    public Object sayHello() {
    
    
        return "hello";
    }

    @RequestMapping("/login")
    public String login(String username,String passwd) {
    
    
        boolean login = iUserService.login(username, passwd);
        if(login) {
    
    
            return "登陆成功";
        }else {
    
    
            return  "登陆失败";
        }
    }

    @RequestMapping("/register")
    public String register(String username,String passwd) {
    
    
        boolean login = iUserService.register(username, passwd);
        if(login) {
    
    
            return "注册成功";
        }else {
    
    
            return  "注册失败";
        }
    }
}

在浏览器上输入:localhost:8080/register?username=deer&passwd=123,显示“注册成功”

在浏览器上输入:localhost:8080/login?username=deer&passwd=123,显示“登陆成功”

10.事务支持

修改IUserService接口,增加一个新增batchAdd方法,在UserServiceImpl增加相应实现类,在实现类中故意产生一个被0整除的异常。

IUserService

package com.zyc.service;
public interface IUserService {
    
    
     boolean login(String username,String passwd);

     boolean register(String username,String passwd);

     void batchAdd(String username,String passwd);
}

UserServiceImpl

package com.zyc.service.impl;
import com.zyc.dao.UsersMapper;
import com.zyc.model.Users;
import com.zyc.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class UserServiceImpl implements IUserService {
    
    

    @Resource
    private UsersMapper usersMapper;

    @Override
    public boolean login(String username, String passwd) {
    
    
        Users users = usersMapper.findByUsernameAndPasswd(username, passwd);
        return users != null;
    }

    @Override
    public boolean register(String username, String passwd) {
    
    
        Users users = new Users();
        users.setUsername(username);
        users.setPasswd(passwd);
        int cnt = usersMapper.insertSelective(users);
        return cnt > 0;
    }
    @Override
    public void batchAdd(String username, String passwd) {
    
    
        Users users = new Users();
        users.setUsername(username);
        users.setPasswd(passwd);
        usersMapper.insertSelective(users);
         int i = 10 /0;
         users = new Users();
        users.setUsername(username+"2");
        users.setPasswd(passwd);
        usersMapper.insertSelective(users);
    }
}

修改UserContoller,增加batchAdd方法

@RequestMapping("/batchAdd")
    public String batchAdd(String username,String passwd) {
    
    
        iUserService.batchAdd(username, passwd);
      return "成功";
    }

重新运行,在浏览器上输入:localhost:8080/batchAdd?username=enjoy&passwd=123

可以发现在浏览器上出现:

检查数据库,发现表里面已经产生了一个错误的数据,产生了事务问题。

这个时候需要用到事务支持
在batchAdd方法上增加@Transactional注解,重启服务后,在浏览器上输入
localhost:8080/batchAdd?username=enjoy&passwd=123

浏览器还继续报错,但检查数据库,事务问题已经得到了解决。

这样一个基本的注册登录功能业已实现!!

猜你喜欢

转载自blog.csdn.net/weixin_47723535/article/details/109228150