记录笔者学习spring框架的一些收获,其中加了些自己的理解,希望能给刚学spring框架的朋友带去一点帮助。这是个可持续发展贴,目标是让看见这个帖子的人从新手小白到能够熟练进行java开发,当然,笔者现在就是个新手小白,这个帖子也用来记录自己的成长过程。
咳咳,返回主题,我们今天是要手写mybaties实现查询整个数据库的数据列表
首先,用spring生成器创建一个spring项目。pom文件引入mybaties的设置如下
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
然后你就可以跟着我一起操作了!
笔者的通俗理解,mybaties就是用来连接数据库和java的。将筛选出的数据放进容器,封装成接口供前端访问,操作数据,这就是我们要做的事。
第一步,数据从哪来,当然是从数据库来了。打开Navicat,创建一个数据库,建一个test表,随便插入两条数据
第二步,将本地数据库与java项目建立连接,用户名密码改一下,url中?前写自己的数据库名,如下笔者的数据库名就是book。(笔者是在本地创建的数据库,如果是远程服务器,那么url中的127.0.0.1:3306也要发生改变)
#配置数据库连接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/book?characterEncoding=UTF8&autoReconnect=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
spring.datasource.username=admin
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
第三步,写一个类和数据库表是一一映射关系,也就是将数据库的所有字段写成类的属性,即私有成员变量并生成get和set方法
如下新建了domain包位置与启动类平级,创建的Test类
public class Test {
//与数据库表是一一映射关系
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
第四步,创建一个mapper目录位置与启动类平级,存放映射接口
public interface TestMapper {
public List<Test> list();
}
第五步在resource下创建一个mapper目录位置,存放xml映射文件
这一步承上启下尤为重要,这个xml文件就是数据库与Test类之间的桥梁,select里书写SQL语句,resultType表明返回值类型,我们引入类一定要写完整的包名,如下就是说运行sql语句返回一个个Test实例对象,id表明映射接口存在这样一个方法list。而与之对应的映射接口就写在namespace里。okk,是不是有点糊涂了,正着捋一下,就是说TestMapper中有一个list方法,能够返回Test对象的集合,每一个Test对象对应一条select出来的数据。个人认为xml的三要素就是namespace,id,rsultType。namespace对应映射接口
<?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="com.zhy.ebook.demos.mapper.TestMapper">
<!-- 书写SQL语句-->
<select id="list" resultType="com.zhy.ebook.demos.domain.Test">
select `id`,`name`,`age` from `test`
</select>
</mapper>
这样一说,你是不是很容易就能猜出来,我们这个List<Test>究竟是个什么东西呢?答案其实就是我们一开始插入的两条数据形成的两个test对象的集合罢了
对了,启动类需要扫描mapper,所以千万别忘了在启动类前加上注解哦
@MapperScan("com.zhy.ebook.demos.mapper")
第六步,新建一个service包位置与启动类平级,我们需要创建一个service类调用映射接口。
service服务层,是mapper与controller之间的桥梁。
Service层也需要提前声明,在类前加入@Service注解
在service层我们使用mapper需要先进行注入,resource和autowired注解都可以实现注入,我们创建了一个testMapper对象,写一个list函数调用testMapper的list方法并返回
@Service
public class TestService {
@Resource
//Resource和Autowired都可以将mapper注入
private TestMapper testMapper;
public List<Test> list(){
return testMapper.list();
}
}
第七步,新建controller包位置与启动类平级,我们需要创建一个controller类,在其中写一个路由函数调用service类,封装成一个api接口供前端访问获取数据
controller层也需提前声明,在类前加入@RestController注解,至于RestController和Controller的区别就是前者返回json格式字符串,后者返回是一个页面,通常采用RestController
我们在controller层使用service也需要进行注入。
GetMapping表示是一个get接口,PostMapping表示是一个post接口,RequestMapping则是get请求和post请求均可访问的接口
@RestController
public class TestController {
@Resource
private TestService testService;
@GetMapping("/test/list")
public List<Test> testList(){
return testService.list();
}
}
细看返回值是不是有一种将数据层层抛出的感觉,就比如我点了一杯少糖少冰的果茶,放果茶的杯子就是domain里的实体类,mapper店员负责把这个少糖少冰的果茶制作出来放进杯子,Service店员负责将果茶封口,Controller店员则是提供了一个吸管。(hhh,笔者正在喝果茶)
最后别忘了启动类也需扫描Controller
@ComponentScan("com.zhy")
到此就大功告成,我们来测试一下,偶豁,你看返回的数据是不是和我们猜想的一模一样
我们发出请求,整个数据的传输过程如下图
关注作者不迷路,下一篇如何实现增删改,你的点赞是作者更新的动力!!!