Spring全家桶学习笔记 04 | 轻松整合Mybatis

本节利用Mybatis实现数据库相关操作,数据库选择mysql

Mybatis的配置分为两个版本,注解版与XML版,两种版本使用场景有些许不同。

注解版

  • 配置依赖

mybatis-spring-boot-starter 是mybatis针对spring推出的框架,简单易用。在pom.xml中最好指定一下它的版本。而Mysql模块与Web模块不用多说。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>
     <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>
  • applicaiton.properties

mybatis.type-aliases-package 用于配置类型别名的包名,在映射时只需要写类名就足够了

spring.datasource.urlusernamepassword 不用多说,注意所用数据库的名称及参数

spring.datasource.driver-class-name 用于配置mysql驱动

mybatis.type-aliases-package=com.example.datasource-demo.model 

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

这些配置会被Spring Boot自动加载从而将数据源注入进 SqlSessionFactory 中。同时SqlSessionFactory也会自动注入到 Mapper 中。

  • 表结构

user表结构

  • 实体类

此处我使用了 Lombok 插件,引入了 @Data 注解,可以免去 get / set

user实体

  • Mapper

注解版最大的特点就是Sql语句可以直接以注解的形式写在mapper接口中

userMapper

那么如何让SpringBoot识别到这个mapper呢?添加 @Mapper 注解是一个方式,但需要在每一个Mapper上都添加一个注解,更简便的方式是在启动类中添加注解,自动扫描mapper包。

MapperScan

  • Controller

为了测试方便,简单写了一个delete接口,别忘了为Controller加上@RestController注解

    @RequestMapping(value = "/delete/{id}")
    public void delete(@PathVariable("id") Long id) {
        userMapper.delete(id);
    }
  • 测试结果

    1. user表中数据

    user表

    1. 测试delete接口
      delete接口
    2. id为1的字段被删除
      此时表中数据

XML版

application.yml

yml文件与properties文件同是配置文件,区别在于前者通过树形结构分层,使得层次更加分明,后者则相对比较直接,当工程中同时存在application.properties文件和 application.yml文件时,yml文件中的配置优先级会更高,所以保险起见,工程中只用一种类型即可。

application.yml配置内容:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.example.datasource-demo.model

可以见到,相比于注解版,配置文件中新增了mybatis的内容,config-location 指定了配置文件的路径,mapper-locations 指定了映射xml文件的路径,type-aliases-package 在上文解释过。

mybatis-config.xml

在applicaiton.yml中我们配置了config-location ,这个配置文件需要我们自行创建,特别注意头文件不能遗漏

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>

UserMapper

xml版与注解版最大的不同就是sql语句是存放在独立的映射xml文件中的,根据我们在配置文件中的路径创建UserMapper.xml文件

<?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.example.datasourcedemo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.datasourcedemo.model.User">
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="username" property="username" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" />
        <result column="nick_name" property="nickName" jdbcType="VARCHAR" />

    </resultMap>

    <sql id="Base_Column_List" >
        id, username, password, nick_name
    </sql>

    <select id="getAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM user
    </select>

    <select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM user
        WHERE id = #{id}
    </select>
</mapper>

而UserMapper接口只需要定义接口方法即可,无需注解

public interface UserMapper {
    
    List<User> getAll();
 
    User getOne(Long id);

}

运行项目,结果与注解版并无二致

// http://localhost:8080/getUser?id=2

{
  "code": 200,
  "message": "查询用户成功",
  "data": {
    "id": 2,
    "username": "jerry",
    "password": "123123",
    "nickName": "Jerry"
  }
}

如何选择

两种模式各有特点与适用场景,注解版适合简单快速的模式,适合无需大量多表连接查询的情况,而xml模式则更适合传统中大型项目,灵活地生成Sql。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值