Spring Boot(七):集成MyBatis

MyBatis简介

MyBatis是一款优秀的基于Java的持久层开源框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis避免了几乎所有的 JDBC代码及手动设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录。

POJO:Plain Ordinary Java Object,普通的Java对象

集成MyBatis

1、引入依赖

在pom.xml中引入相关依赖:

<!-- 连接mysql的必要依赖 --> 
<dependency> 
    <groupId>org.mybatis.spring.boot</groupId> 
    <artifactId>mybatis-spring-boot-starter</artifactId> 
    <version>2.1.1</version> 
</dependency> 

<!-- 整合MyBatis的核心依赖 --> 
<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>8.0.21</version> 
</dependency> 

2、配置mysql连接

在application-dev.yml中配置mysql的连接:

spring: 
  datasource: 
    url: dbc:mysql://localhost:3306/spring_boot_demo 
    username: root 
    password: test 

3、创建blog表

在mysql的spring_boot_demo数据库中,创建blog表,字段如下:

id:自增主键 
title:varchar 
category:varchar

4、创建实体类

创建blog实体类:

public class Blog { 
    private Integer id; 
    private String title; 
    private String category; 

    // 省略getter、setter 
} 

5、开发Mapper

创建blog表的操作接口BlogMapper,并在接口中定义select和insert操作

@Mapper 
public interface BlogMapper { 

    @Select("select * from blog where id = #{id}") 
    Blog getById(@Param("id") Integer id); 

    // 返回主键字段id值 
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") 
    @Insert("insert into blog(title, category) values(#{blog.title}, #{blog.category})") 
    int insert(@Param("blog") Blog blog); 

} 

6、测试新增和查询

在BlogController中增加下面两个接口:

@Autowired 
private BlogMapper blogMapper; 

@GetMapping(value = "getById") 
public Blog getById(@RequestParam("id") Integer id) { 
    return blogMapper.getById(id); 
} 

@PostMapping(value = "insert") 
public int insert(@RequestBody Blog blog) { 
    blogMapper.insert(blog); 
    return blog.getId(); 
} 

调用insert接口插入数据,返回自增主键id,再调用getById,可以看到刚刚插入的数据

注解配置详解

@Mapper:此注解是由MyBatis框架中定义的一个描述数据层接口的注解,用于告诉sprigng框架此接口的实现类由MyBatis负责创建,并将其实现类对象存储到spring容器中

@Select:查询类的注解,所有的查询均使用这个

@Insert:插入数据库使用,直接传入实体类会自动解析属性到对应的值

@Update:负责修改,也可以直接传入实体类

@Delete:负责删除

@Param:负责传参数,@Param中定义的id,对应了sql中的#{id}

@Options:此实例中,我们使用@Options注解来设置返回主键字段id值,useGeneratedKeys默认为false,为true时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。keyProperty为实体类对应的主键属性,keyColumn为数据库中的主键字段。

Mapper中使用#符号和$符号的不同

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符

比如:

select * from blog where name = #{name} 

解析为:

select * from blog where name = ? 

${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

比如:

select * from blog where name = '${name}' 

解析为:

select * from blog where name = 'tn' 

#{ }和${ }的用法:

1、能使用 #{ } 的地方就用 #{ }

${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题。

2、表名作为变量时,必须使用 ${ }

表名不能加单引号,使用#{}会报错,只能使用${}

更多内容,请关注公众号“图南随笔”

猜你喜欢

转载自blog.csdn.net/tunan666/article/details/120119570