一篇学会SpringBoot集成MyBatis的两种方式

SpringBoot集成MyBatis
MyBatis的介绍
  • MyBatis 是一个开源的持久层框架,它是在 Java 中用于简化数据库访问的工具。MyBatis 的核心思想是将 SQL 语句和 Java 代码分离,通过 XML 或注解的方式来配置 SQL 映射,从而避免了传统 JDBC 编程中大量重复、繁琐的数据库访问代码。
  • 以下是 MyBatis 的一些核心概念:
    • 映射文件(Mapper File):MyBatis 使用 XML 文件或者注解来定义数据库操作的映射关系,其中包含了 SQL 语句以及参数映射等信息。这些映射文件定义了如何将 Java 对象与数据库表进行映射,以及如何执行数据库操作(如查询、插入、更新、删除等)。
    • SqlSession:SqlSession 提供了在数据库上执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来执行映射文件中定义的 SQL 命令,包括查询、插入、更新、删除等操作。
    • 映射接口(Mapper Interface):除了使用 XML 文件外,MyBatis 还支持使用 Java 接口和注解来定义数据库操作,这种方式称为基于接口的映射。通过定义一个接口,然后使用注解或 XML 来与具体的 SQL 语句进行映射,可以使得数据库操作更加灵活和直观。
    • 参数映射(Parameter Mapping):MyBatis 支持将查询参数映射到 SQL 语句中,可以方便地将 Java 对象与 SQL 参数进行绑定。
    • 结果集映射(Result Mapping):MyBatis 支持将查询结果映射到 Java 对象,可以通过 XML 或注解定义映射规则,将查询结果转换为 Java 对象。
  • MyBatis 的优点在于它提供了较为灵活的 SQL 映射配置,使得开发人员可以直观地编写 SQL 语句,并且能够灵活地处理参数映射和结果映射。此外,通过使用动态 SQL、缓存等特性,MyBatis 能够提供良好的性能和扩展性。因此,MyBatis 在 Java 开发领域中得到了广泛的应用。
MyBatis在StringBoot项目中的使用
  • 依赖导入
<dependencys>
 <dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.4</version>
 </dependency>
 <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
 </dependency>
</dependencys>
  • MyBatis配置
  • 在 properties.yml 文件中配置对应的信息
# 数据库地址
datasource:
  url: localhost:3306/liu
spring:
  datasource: # 数据库配置
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://${datasource.url}?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
    username: /账号/
    password: /密码/
    hikari:
      maximum-pool-size: 10 # 最⼤连接池数
      max-lifetime: 1770000
mybatis:
  # 指定别名设置的包为所有entity
  type-aliases-package: com.example.springboot_learn.entity
  configuration:
    map-underscore-to-camel-case: true # 驼峰命名规范
  mapper-locations: # mapper映射⽂件位置
    - classpath:mapper/*.xml
  • 使⽤的连接池是 Spring Boot ⾃带的 hikari
  • map-underscore-to-camel-case: true, ⽤来开启驼峰命名规范,这个⽐较好⽤,⽐如数据库中字段名为:user_name, 那么
    在实体类中可以定义属性为 userName (甚⾄可以写成 username,也能映射上),会⾃动匹配到驼峰属性,如果不这样配置的话,针对字
    段名和属性名不同的情况,会映射不到。
基于xml的整合
  • 使用原始的xml的方式需要新建xml文件,在上⾯的 application.yml 配置⽂件中,我们已经定义了 xml ⽂件的路
    径:classpath:mapper/*.xml,所以我们在 resources ⽬录下新建⼀个 mapper ⽂件夹,然后创建⼀个 xml ⽂件。
  • 例子:通过用户的name获取用户信息:
  • 在数据库中创建user表
create table user
(
    id         bigint auto_increment
        primary key,
    password   varchar(20) not null,
    username   varchar(20) not null,
    have_money decimal     null,
    constraint UK_sb8bbouer5wak8vyiiy4pf2bx
        unique (username)
);
  • 表中插入一条待查询的数据
    INSERT INTO liu.user (id, password, username, have_money) VALUES (1, ‘159075’, ‘liu’, 200);
  • 存在用户实体类User
@Setter
@Getter
@ToString
public class User {
    private Long id;
    private String username;
    private String password;
    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal haveMoney;
    public User() {}
    public User(Long id, String username, String password, BigDecimal haveMoney) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.haveMoney = haveMoney;
    }
}
  • 封装JsonResult返回类型
@Setter
@Getter
public class JsonResult<T> {
    private T data;
    private String code;
    private String message;

    public JsonResult() {
        this.code = StatusCode.SUCCESS.getCode();
        this.message = "操作成功!";
    }

    public JsonResult(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public JsonResult(T data){
        this.data = data;
        this.code = StatusCode.SUCCESS.getCode();
        this.message = "操作成功!";
    }

    public JsonResult(T data, String code, String message){
        this.data = data;
        this.code = code;
        this.message = message;
    }
}
  • 定义UserMapper.java
@Mapper
public interface UserMapper {
    User getUserByName(String username);
}
  • 定义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.springboot_learn.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.springboot_learn.entity.User">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="have_money" jdbcType="VARCHAR" property="haveMoney" />
    </resultMap>
    <select id="getUserByName" resultType="User" parameterType="String">
        select * from user where username = #{username};
    </select>
</mapper>
  • 定义服务层的UserService.java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    public User getUserByName(String username){
        return userMapper.getUserByName(username);
    }
}
  • 定义controller层的类TestUserWithDataBase.java进行测试
@RestController
@RequestMapping("/database")
public class TestUserWithDataBase {
    @Resource
    private UserService userService;
    @RequestMapping("/getUserByName")
    public JsonResult<User> getUserByName(@RequestParam(value = "username")String username){
        User user = userService.getUserByName(username);
        System.out.println(user);
        return new JsonResult<>(user);
    }
}
  • 访问:http://localhost:8001/database/getUserByName?username=liu
  • 得到的结果:
{
    "data": {
        "id": 1,
        "username": "liu",
        "password": "159075",
        "haveMoney": "200"
    },
    "code": "0",
    "message": "操作成功!"
}
  • Spring Boot 如何知道这个 Mapper 呢?⼀种⽅法是在上⾯的 mapper 层对应的类上⾯添加 @Mapper 注解即可,但
    是这种⽅法有个弊端,当我们有很多个 mapper 时,那么每⼀个类上⾯都得添加 @Mapper 注解。另⼀种⽐较简便的⽅法是在 Spring
    Boot 启动类上添加@MaperScan 注解,来扫描⼀个包下的所有 mapper。
基于注解的整合
  • 使用注解的方式与数据库交互就不需要在xml中进行配置了,MyBatis主要提供了@Select、@Insert、@Updata、@Delete四个注解。
  • 例子:使用id查询User
  • 只需要在Mapper接口中,定义方法并使用@Select
@Mapper
public interface UserMapper {
  User getUserByName(String username);
  @Select("select * from user where id = #{id}")
  User getUserById(Long id);
}
  • Service类就能直接调用getUserById()进行查询了,就不用再书写xml配置文件了。
  • 如果是多个参数的话,比如使用id和name查询User,可以使用@Param注解
@Mapper
public interface UserMapper {
    User getUserByName(String username);
    @Select("select * from user where id = #{id}")
    User getUserById(Long id);
    @Select("select * from user where id = #{id} and username = #{username}")
    User getUserByIdAndName(@Param("id")Long id,@Param("username")String username);
}
  • @Param 指定的参数应该要和 sql 中 #{} 取的参数名相同,不同则取不到。
  • ⼀般我们在设计表字段后,都会根据⾃动⽣成⼯具⽣成实体类,这样的话,基本上实体类是能和表字段对应上的,
    最起码也是驼峰对应的,由于在上⾯配置⽂件中开启了驼峰的配置,所以字段都是能对的上的。但是,万⼀有对不上的呢?我们也有解决办
    法,使⽤ @Results 注解来解决。
@Select("select * from user where id = #{id}")
@Results({
 @Result(property = "username", column = "user_name"),
 @Result(property = "password", column = "password")
})
User getUser(Long id);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值