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向伺服器送出異步請求,并處理傳回的結果