Spring 全家桶之 Spring Boot 2.6.4(四)- Data Access(Part B MyBatis)

简介: Spring 全家桶之 Spring Boot 2.6.4(四)- Data Access(Part B MyBatis)

一、Spring Boot 整合 MyBatis

MyBatis的自动配置

创建工程spring-boot-mybatis,创建项目时勾选MyBatis Framework会自动引入MyBatis的Starter

fbeb9d325fe74b46a4ea537073eb1a4a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

分析Mybatis的Staters启动器依赖

c8b83c94b7584d74a533e0cbae0a12bb_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

MyBatis的自动配置类和配置项类都在autoconfigure包下

网络异常,图片无法展示
|

MyBatis自动配置类依赖了SqlSessionFactory和SqlSessionFactoryBean以及DataSource类,并且启用了MyBatisProperties类中的属性作为配置项,并且在DataSourceAutoConfiguration自动配置类和MybatisLanguageDriverAutoConfiguration类生效后才会生效。

MyBatisProperties类源码中包含了mybatis的配置项

image.png

MyBatis的配置前缀都是以mybatis开头

配置Druid数据源

引入driud

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>
复制代码

Druid数据源配置可以参考 Spring 全家桶之 Spring Boot 2.6.4(四)- Data Access(Part A JDBC)

初始化项目

在resources目录下放置employee.sql和department.sql文件

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `gender` int(2) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `departmentName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码

entity目录中创建两个实体类Employee和Department对应employee表和Department表

@Data
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private Integer gender;
    private Integer dId;
}
复制代码
@Data
public class Department {
    private Integer id;
    private String departmentName;
}
复制代码

配置自定义数据源初始化类,初始化数据源

@Configuration
public class LilithDataSourceInitializer {
    @Value("classpath:employee.sql")
    private Resource employee;
    @Value("classpath:department.sql")
    private Resource department;
    @Bean
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource){
        final DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
    }
    private DatabasePopulator databasePopulator(){
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScripts(employee,department);
        return populator;
    }
}
复制代码

启动应用,Spring Boot会自动在数据库表创建,再次启动之前如果不想初始化数据可以将@Configuration注解注释掉

二、MyBatis注解方式的使用

创建DepartmentMapper接口,使用注解标注增删改查的SQL语句

@Mapper
public interface DepartmentMapper {
    @Select("SELECT * FROM department WHERE id = #{id}")
    Department selectOneById(Integer id);
    @Delete("DELETE FROM department WHERE id = #{id}")
    void deleteOneById(Integer id);
    @Insert("INSERT INTO department (department_name) VALUES (#{departmentName})")
    void insert(Department department);
    @Update("UPDATE department SET department_name = #{departmentName} where id = #{departmentId}")
    void update(Department department);
}
复制代码

创建DepartmentMapperTest测试类,测试DepartmentMapper中的增删改查方法

@SpringBootTest
public class DepartmentMapperTest {
    @Resource
    private DepartmentMapper departmentMapper;
    @Test
    public void selectOneById() {
        Department department = departmentMapper.selectOneById(1);
        System.out.println(department);
    }
    @Test
    public void insert() {
        Department department = new Department();
        department.setDepartmentName("Avengers");
        departmentMapper.insert(department);
    }
}
复制代码

测试insert方法

image.png

测试selectOneById方法

image.png

MyBatis 配置驼峰命名转换

修改Department表departmentName为下划线形式department_name;再次执行selectOneById方法

image.png

查询到DepartmentName属性为空,这时可以在yml配置文件中开启驼峰命名转换

mybatis:
  configuration:
    map-underscore-to-camel-case: true
复制代码

再次查询既可以查询到指定的是数据

配置类开启驼峰命名转换

也可以使用配置类来开启驼峰命名转换,MyBatisAutoConfuguration中包含了configurationCustomizers属性,这是一个List列表,包含了所有的自定义配置

image.png

而ConfigurationCustomizer接口中有一个customize方法,该方法传入Configuration自定义配置

image.png

Configuration类中的属性就是可以自定义的配置

image.png

在config包下新建LilithMyBatisConfig配置类,新增一个configurationCustomizer方法,既往容器中注入ConfigurationCustomizer设置了属性的实现类

@Configuration
public class LilithMyBatisConfig {
    @Bean
    public ConfigurationCustomizer configurationCustomizer(){
        return configuration -> configuration.setMapUnderscoreToCamelCase(true);
    }
}
复制代码

这里使用lambda表达式实现了ConfigurationCustomizer接口中的customize方法

将yml文件中的驼峰命名转换注释,重新执行selectOneById方法

image.png

可以成功查询出数据。

@Mapper注解

@Mapper注解是自动配置的关键,标记当前类为容器的一个组件,缺少@Mapper注解将无法启动。

当Mapper接口非常多是,给每一个Mapper接口增加@Mapper注解非常麻烦,可以在主启动类上使用@MapperScan注解,扫描所有的Mapper接口

三、MyBatis配置文件方式的使用

创建Mapper接口EmployeeMapper,需要说明的是无论是注解还是配置文件方式使用MyBatis,@Mapper注解或者@MapperScan注解都是必不可少的。

@Mapper
public interface EmployeeMapper {
    void insert(Employee employee);
    Employee selectOneById(Integer id);
}
复制代码

在resources目录下创建mappers文件夹,新增EmployeeMapper.xml文件,增加Mapper接口中selectOneById方法和insert方法对应的SQL语句

<?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.lilith.mybatis.mapper.EmployeeMapper">
    <select id="selectOneById" resultType="com.lilith.mybatis.entity.Employee">
        select * from employee where id = #{id}
    </select>
    <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        INSERT INTO employee (last_name, email, gender, d_id)
        VALUES (#{lastName}, #{email}, #{gender},#{dId})
    </insert>
</mapper>
复制代码

yml中增加mybatis配置

mybatis:
  # 全局配置文件的位置
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath:mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true
复制代码

书写测试类

@SpringBootTest
public class EmployeeMapperTest {
    @Resource
    private EmployeeMapper employeeMapper;
    @Test
    public void insert() {
        Employee employee = new Employee();
        employee.setLastName("Thanos");
        employee.setEmail("thanos@gmail.com");
        employee.setGender(1);
        employee.setDId(1);
        employeeMapper.insert(employee);
    }
    @Test
    public void selectOneById() {
        Employee employee = employeeMapper.selectOneById(1);
        System.out.println(employee);
    }
}
复制代码

执行插入方法

image.png

错误提示config-location和configuration不能同时写在yml文件中; 在resources目录下新建MyBatis全局配置文件,把configuration配置到mybatis-config.xml全局配置文件中

<?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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>
复制代码

再次执行测试

image.png

控制台显示有1行成功更新,数据被成功插入到输入句酷表中

执行selectOneById方法

image.png

成功查询出insert方法插入的数据


相关文章
|
2月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
329 1
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
431 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2709 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
532 0
|
6月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1128 1
Spring boot 使用mybatis generator 自动生成代码插件
|
9月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
736 0
|
11月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
532 2