MyBatis简介
MyBatis是一款优秀的基于Java的持久层开源框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis避免了几乎所有的 JDBC代码及手动设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录。
POJO:Plain Ordinary Java Object,普通的Java对象
集成MyBatis
1、引入依赖
在pom.xml中引入相关依赖:
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
mysql
mysql-connector-java
8.0.21
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、表名作为变量时,必须使用 ${ }
表名不能加单引号,使用#{}会报错,只能使用${}
若您觉得还可以,请帮忙点个“赞”,谢谢