新手入门spring之手写mybaties框架实现查询

记录笔者学习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")

到此就大功告成,我们来测试一下,偶豁,你看返回的数据是不是和我们猜想的一模一样

我们发出请求,整个数据的传输过程如下图

关注作者不迷路,下一篇如何实现增删改,你的点赞是作者更新的动力!!!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值