目录
1. SpringBoot 数据访问
1.1 Spring Boot 整合 MyBatis
MyBatis 是一款优秀的持久层框架,Spring Boot 官方虽然没有对 MyBatis 进行整合,但是 MyBatis 团队自行适配了对应的启动器,进一步简化了使用 MyBatis 进行数据的操作。
因为 Spring Boot 框架开发的便利性,所以实现 Spring Boot 与数据访问层框架(例如 MyBatis)的整合非常简单,主要是引入对应的依赖启动器,并进行数据库相关参数设置即可。
1.1.1 基础环境搭建
(1). 数据准备
在 MySQL 中,先创建了一个数据库 springbootdata,然后创建了两个表 t_article 和 t_comment 并向表中插入数据。其中评论表 t_comment 的 a_id 与文章表 t_article 的主键 id 相关联。
# 创建数据库
CREATE DATABASE IF NOT EXISTS springbootdata DEFAULT CHARACTER SET utf8;
# 选择使用数据库
USE springbootdata;
# 创建表 t_article 并插入相关数据
DROP TABLE IF EXISTS t_article;
CREATE TABLE t_article
(
id int(20) NOT NULL AUTO_INCREMENT COMMENT '文章id',
title varchar(200) DEFAULT NULL COMMENT '文章标题',
content longtext COMMENT '文章内容',
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARSET=utf8;
INSERT INTO t_article VALUES (1, 'Spring Boot 基础入门', '从入门到精通讲解...');
INSERT INTO t_article VALUES (2, 'Spring Cloud 基础入门', '从入门到精通讲解...');
# 创建表 t_comment 并插入相关数据
DROP TABLE IF EXISTS t_comment;
CREATE TABLE t_comment
(
id int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id',
content longtext COMMENT '评论内容',
author varchar(200) DEFAULT NULL COMMENT '评论作者',
a_id int(20) DEFAULT NULL COMMENT '关联的文章id',
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET=utf8;
INSERT INTO t_comment VALUES (1, '很全、很详细', 'lucy', 1);
INSERT INTO t_comment VALUES (2, '赞一个', 'tom', 1);
INSERT INTO t_comment VALUES (3, '很详细', 'eric', 1);
INSERT INTO t_comment VALUES (4, '很好,非常详细', '张三', 1);
INSERT INTO t_comment VALUES (5, '很不错', '李四', 2);
(2). 创建项目,引入相应的启动器
使用 Spring Initializr 来初始化项目。
项目名:springbootmybatis
包名:com.zm
启动器:SQL 的 MyBatis Framework、MySQL Driver,Web 的 Spring Web
(3). 编写与数据库表 t_comment 和 t_article 对应的实体类 Comment 和 Article
com.zm.pojo.Comment
public class Comment {
private Integer id;
private String content;
private String author;
private Integer aId;
// getter setter toString ...
}
com.zm.pojo.Article
public class Article {
private Integer id;
private String title;
private String content;
// getter setter toString ...
}
(4). 编写配置文件
application.properties 更名为 application.yml。在 application.properties 配置文件中进行数据库连接配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: password
1.1.2 注解方式整合 Mybatis
需求:实现通过 ID 查询 Comment 信息。
(1). 创建一个对 t_comment 表数据操作的接口 CommentMapper
com.zm.mapper.CommentMapper
public interface CommentMapper {
@Select("select * from t_comment where id = #{id}")
Comment findById(Integer id);
}
(2). 在 Spring Boot 项目启动类上添加 @MapperScan("xxx") 注解
com.zm.SpringbootmybatisApplication
@SpringBootApplication
@MapperScan("com.zm.mapper") //执行扫描mapper的包名
public class SpringbootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmybatisApplication.class, args);
}
}
(3). 编写测试方法
导入 Junit 的依赖,增加测试方法:
com.zm.SpringbootmybatisApplicationTests
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootmybatisApplicationTests {
// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private CommentMapper commentMapper;
@Test
void findCommentById() {
Comment comment = commentMapper.findById(1);
System.out.println(comment);
}
}
控制台中查询的 Comment 的 aId 属性值为 null,没有映射成功。这是因为编写的实体类 Comment 中使用了驼峰命名方式将 t_comment 表中的 a_id 字段设计成了 aId 属性,所以无法正确映射查询结果。
为了解决上述由于驼峰命名方式造成的表字段值无法正确映射到类属性的情况,可以在 Spring Boot 全局配置文件 application.yml 中添加开启驼峰命名匹配映射配置,示例代码如下:
mybatis:
configuration:
# 开启驼峰命名匹配映射
map-underscore-to-camel-case: true
1.1.3 配置文件的方式整合 MyBatis
第一、二步骤使用 Free Mybatis plugin 插件生成:使用 IDEA 连接 Database,然后选中要自动生成代码的表,右键 -> mybatis-generator -> 按照需求输入信息,点击 ok。
(1). 创建一个用于对数据库表 t_article 数据操作的接口 ArticleMapper
public interface ArticleMapper {
int deleteByPrimaryKey(Integer id);
int insert(Article record);
int insertSelective(Article record);
Article selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Article record);
int updateByPrimaryKey(Article record);
}
(2). 创建 XML 映射文件
resources 目录下创建一个统一管理映射文件的包 mapper,并在该包下编写与 ArticleMapper 接口方应的映射文件 ArticleMapper.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.zm.mapper.ArticleMapper">
<resultMap id="BaseResultMap" type="com.zm.pojo.Article">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="title" jdbcType="VARCHAR" property="title" />
<result column="content" jdbcType="VARCHAR" property="content" />
</resultMap>
<sql id="Base_Column_List">
id, title, content
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_article
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from t_article
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.renda.pojo.Article" useGeneratedKeys="true">
insert into t_article (title, content)
values (#{title,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.ren