天天看點

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("[email protected]");
  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 protected]
@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向伺服器送出異步請求,并處理傳回的結果