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向服务器提交异步请求,并处理返回的结果