我们将以实现简单的登录注册功能来完成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&characterEncoding=utf8&useSSL=true&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
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
浏览器还继续报错,但检查数据库,事务问题已经得到了解决。
这样一个基本的注册登录功能业已实现!!