SpringBoot框架基础知识(2)

7. 连接数据库


SpringBoot项目默认并没有集成数据库和数据库编程的框架所依赖的jar包,需要在创建项目时就勾选相关的依赖,或在创建项目之后再在pom.xml中添加相关的代码:


<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>


有许多依赖的使用中,SpringBoot框架都会自动的选取较高版本的依赖,并不需要在pom.xml中指定所使用的版本,例如以上mysql-connector-java就没有指定版本号!当然,如果一定要使用某个特定的版本,自行添加<version>节点进行配置也是可以的,则会使用所指定的版本!


一旦添加以上依赖后,当启动项目时,就会自动加载连接数据库的配置信息,如果尚且没有配置,则会启动失败!所以,必须在application.properties中添加配置:


spring.datasource.url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root


当添加以上配置后,再次启动SpringBoot就不会报错了,即使以上配置信息是错误的,也不会报错!因为启动项目时只会“加载信息”,并不会“直接数据库”,所以,以上配置中,只要基本格式是正确的即可!


可以在src/test/java下编写单元测试,通过单元测试尝试连接数据库,以检查以上配置信息是否正确!则在cn.tedu.sample包下的SampleApplicationTests测试类中,添加以下代码进行测试:


@Autowired
public DataSource dataSource;
@Test
public void getConnection() throws SQLException {
    Connection conn = dataSource.getConnection();
    System.err.println(conn); // 使用err只是为了输出红色的日志,便于观察。
}


在使用SpringBoot框架编程时,凡在传统的SSM系列框架中通过getBean()可以获取的对象,都可以通过添加自动装配的注解来装配值!

8. 使用MyBatis实现数据库编程


【目标】向用户数据表中插入用户数据。


在cn.tedu.sample包下创建entity子包,专门用于存放实体类,并在这个包中创建User类:


public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String phone;
    private String email;
}


在cn.tedu.sample包下创建mapper子包,专门用于存放使用MyBatis编程时创建的接口,并在这个包中创建UserMapper接口,并在接口中添加抽象方法:


Integer addnew(User user);

1

然后,需要在启动类SampleApplication的声明之前补充@MapperScan注解,以指定接口的位置!


在src/main/resources下创建mappers文件夹,专门用于存放配置SQL语句的XML文件,并在这个文件夹,粘贴得到UserMapper.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="cn.tedu.sample.mapper.UserMapper">
    <insert id="addnew">
  INSERT INTO t_user (
    username, password, age, phone, email
  ) VALUES (
    #{username}, #{password}, #{age}, #{phone}, #{email}
  )
    </insert>
</mapper>


然后,还需要在application.properties中添加配置,以指定XML文件的位置:


mybatis.mapper-locations=classpath:mappers/*.xml


全部完成后,可以通过单元测试来检验以上代码是否可以正确执行,可以在src/test/java下的cn.tedu.sample包下创建子级的mapper包,并在这个包下创建UserMapperTests测试类,并参考原有的SampleApplicationTests类添加注解:


package cn.tedu.sample.mapper;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTests {
}


然后,在测试类中编写并执行单元测试方法:


package cn.tedu.sample.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import cn.tedu.sample.entity.User;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTests {
    @Autowired
    public UserMapper userMapper;
    @Test
    public void addnew() {
  User user = new User();
  user.setUsername("SpringBoot");
  user.setPassword("1234");
  user.setAge(28);
  user.setPhone("13900139008");
  user.setEmail("springboot@baidu.com");
  Integer rows = userMapper.addnew(user);
  System.err.println("rows=" + rows);
    }
}


【目标】根据用户名查询用户数据


需要执行的SQL语句大致是:


select * from t_user where username=?


则在UserMapper接口中添加抽象方法:


User findByUsername(String username);


并在UserMapper.xml中配置映射:


<select id="findByUsername" resultType="cn.tedu.sample.entity.User">

SELECT * FROM t_user WHERE username=#{username}

</select>


完成后,在UserMapperTests中编写并执行单元测试:


@Test

public void findByUsername() {
    String username = "test";
    User user = userMapper.findByUsername(username);
    System.err.println(user);
}


9. 完成用户注册功能


当用户尝试注册时,会先在页面中填写注册信息,然后点击按钮提交请求!请求会被服务器端的控制器所接收,但是,控制器并不负责处理增删改查,所以,会将数据交给UserMapper来执行!


接下来,需要开发控制器的功能,先在cn.tedu.sample下创建util子包,并在这个包中创建通常的响应JSON结果的类型:


public class JsonResult<T> {
    private Integer state;
    private String message;
    private T data;
}


在cn.tedu.sample.controller包中创建UserController控制器类,在类的声明之前添加@RestController和@RequestMapping("user")注解,并声明持久层对象:


@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserMapper userMapper;
}


然后,在类中添加处理“注册”请求的方法:


// http://localhost/user/reg?username=jsd2020&password=5678&age=19&phone=13700137777&email=jsd@baidu.com
@RequestMapping("reg")
public JsonResult<Void> reg(User user) {
    // 准备返回值对象
    JsonResult<Void> jsonResult = new JsonResult<Void>();
    // 根据参数user中的username查询数据库
    User result = userMapper.findByUsername(user.getUsername());
    // 判断查询结果是否为null
    if (result == null) {
        // 是:没有找到匹配的数据,则用户名没有被占用,允许注册,则执行注册,并返回注册成功
        userMapper.addnew(user);
        jsonResult.setState(1);
    } else {
        // 否:找到了匹配的数据,则用户名已经被占用,不允许注册,则返回注册失败
        jsonResult.setState(2);
        jsonResult.setMessage("注册失败!尝试注册的用户名已经被占用!");
    }
    // 返回
    return jsonResult;
}



完成后,重新启动项目,并打开浏览器,输入网址进行测试。


最后,再完成页面部分,先在static下创建注册页面,在页面中,通过ajax向服务器提交异步请求,并处理返回的结果


上一篇:几种CPU架构


下一篇:先行发生原则Happens-before